Diskreetti matematiikka, syksy 2010
Matlab-harjoitus 2 (to 28.10. klo 16-18 MP103) uusittu versio 4.11.2010



  1. Muodosta oman "virtuaalilevysi" X: juureen kansio (hakemisto) nimeltä DISKREET, ja tälle vielä alikansio RELAATIO. Siirry Matlabissa kyseiseen kansioon kirjoittamalla
  2. » cd X:\DISKREET\RELAATIO
    a) Kirjoita Matlab-funktio RandRel.m, joka laskee satunnaisen relaation matriisin, kun lähtötietoina annetaan matriisin koko ja ykkösten suhteellinen osuus prosentteina. Valitse ensin File valikosta New ja M-file (tai kirjoita » edit RandRel). Avautuvassa Matlab-editorissa kirjoitetaan määrittely (%:lla alkavat rivit kommentteja):
    function M = RandRel(m, n, prosenttiosuus);
    % satunnaisrelaatio RandRel.m: function M = RandRel(n,m,prosenttiosuus);
    %   laskee ja tulostaa satunnaisen relaation matriisin, missä
    %   m,n = matriisin koko, prosenttiosuus  = ykkösten suhteellinen osuus
    apuM = rand(m,n); M = (apuM <= prosenttiosuus/100);
    
    Matlabin käsky rand antaa tasaisesti välille [0, 1] jakautuneita lukuja. Normaalijakaumaa käyttää randn.
    Funktiossa siis generoidaan ensin satunnaismatriisi apuM, ja sen avulla logiikkamatriisi M niin, että saadaan (keskimäärin) prosenttiosuus ykkösiä. Jos tämä on esimerkiksi 20, niin ykkönen tulee niihin kohtiin, joissa luku on pienempi kuin 0.2.
    Talleta funktio kansioon X:\DISKREET\RELAATIO tyyliin File, Save As etc.
    b) Muodosta nyt funktiollasi RandRel 100×100-satunnaismatriisi, jossa on noin 30% ykkösiä. Laske sen ykkösien määrä Matlabin sum-käskyn avulla, sekä ykkösten todellinen prosentuaalinen osuus.
    » MA = RandRel(100, 100, 30)
    » ykk = sum(sum(MA))
    » ykk/10000
    
    Mitä laskee käsky sum kohdistettuna matriisiin, mitä kaksinkertaisena? 
    
     
  3. a) Hae kurssimme Web-sivulta 'Kurssimateriaali'
  4. http://wanda.uef.fi/matematiikka/kurssit/Diskreetti/Kurssimateriaali/
    http://wanda.uef.fi/matematiikka/kurssit/Diskreetti/Kurssimateriaali/
    paketti Diskreet1.zip ja pura se Winzip-ohjelman Extract-käskyllä juurikansioon X:.
    HUOM! Säilytä kansiorakenne! Siirry Matlabissakin kyseiseen kansioon kirjoittamalla » cd ..
    Kokeile käskyjä pwd, help DISKREET, dir, !dir, what. Aja lopuksi M-ohjelma alustus.m (kirjoittamalla käsky alustus).
    Siirry kansioon X:\DISKREET\RELAATIO vaikkapa ajamalla rel.m ja kokeile taas pwd, help DISKREET, dir etc. Suorita sitten seuraavat käskyt:
    » M = SatRel(7,10)  % toimii kuten RandRel
    » PiirRel2(M)
    » PiirAlk2(M,[1,4],[6],'*b','*g')
    » PiirNuo2(M,[1,4],'-g')
    » M = zeros(7,10); PiirRel2(M)
    » PiirAlk2(M,[1,4],[6],'*b','*g')
    » PiirNuo2(M,[1,6;4,6],'--g')
    » M(1,6) = 1; M(4,6) = 1; PiirRel2(M)
    
    
    b) Muodosta Matlab-funktio LisaaNuo, joka sekä lisää nuolen matriisiin että piirtää sen kuvioon. Miten? 

     
  5. Sinun pitäisi olla edelleen kansiossa
  6. X:\DISKREET\RELAATIO
    ja Matlab-funktio alustus.m suoritettuna.
    Relaatioiden piirtofunktiot. Joukossa X×X määriteltyjä relaatioita varten on laadittu piirtotyökalut
    piirtofunktioita 1: function PiirRel1( M, vari);
    piirtofunktioita 1: function PiirAlk1( M, alkiot, vari);
    piirtofunktioita 1: function PiirNuo1(M, alkiopari, vari);
    piirtofunktioita 1: function PiirSilm( M, alkio, vari);
    lisäys ja piirto 1: function L = LisaNuo1(M, alkiopari, vari);
    poisto ja piirto 1: function L = PoisNuo1(M, alkiopari, uusi); (tee, jos ei ole ja tarviit!)
    
    
    Relaatioita R Í X×Y varten on vastaavat piirtofunktiot 2, ks. » help RELAATIO
    Suorita seuraavat käskyt ja vastaa kysymykseen:
    » M = zeros(6)
    » PiirRel1(M)
    » M = LisaNuo1(M,[2,4])
    » M = LisaNuo1(M,[4,6])
    » M = LisaNuo1(M,[6,5])
    » K = sign(M*M)
    » [I,J] = find(K)
    » N = [I,J]
    » N(1,:)
    » PiirNuo1(M,N(1,:),'-b')
    » PiirNuo1(M,N(2,:),'-b')
    
    
    Huomaatko mitään yhteyttä matriisin M ja K = M*M nuolilla? 


     
  7. Matlabissa voi useamman rivin ohjelman kirjoittaa myös suoraan komentoikkunassa. Voit ladata seuraavat matriisit myös tiedostosta relaatio.mat käskyllä load relaatio.mat
  8. » A = [0 0 0 1 1; 1 1 0 0 1; 0 0 1 0 0; 1 1 0 0 0; 0 0 0 0 0]
    » B = [0 1 0 0 0; 0 0 1 0 0; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 1]
    » C = [0 0 0 0 0; 0 0 0 0 0; 1 0 1 0 1; 0 0 0 0 0; 1 0 0 1 1]
    » A, B, C
    » any(A(1,:) & B(:,2).') % Mitä tehdään
    » any(A(1,:) & B(:,3).') % näissä? __________________________
    » T = zeros(5,5)
    » for i = 1:5           % paina enter nelosen perään!
     for j = 1:5            % samoin jne
     T(i,j) = any(A(i,:) & B(:,j)');
     end; end;
    » T
    » T | C
    
    
    Mitä yllä tehtiin? 

     
     
  9. Nuoliluettelon ja Boolen tulon muodostavat funktiot.
  10. a) Muodosta Matlab-funktio Nuolet (tiedostoksi Nuolet.m), joka saatuaan parametrina relaation matriisin antaa ulos nuolten 2-sarakkeisen matriisin (kuten 3:ssa N). Testaa funktiotasi:
    » Nuolet(M)
    » Nuolet(K)
    » Nuolet(zeros(5))
    
    
    Mitä antaa Nuolet(zeros(5))


    b) Muodosta funktio BT, joka laskee ja palauttaa syötteenä annettujen kahden logiikkamatriisin välisen matriisitulon Boolen operaatioilla. Voit lainata koodia Tehtävästä 4. Koeta sitten:

    » A,B
    » BT(A,B)
    » BT(A,B) | C
    
    
    Onko sama tulos kuin 4:ssä ja kotilaskussa 5/3. harjoitus? 

     
  11. Tulorelaatio ja piirtelyä.
  12. a) Harjoitellaan relaatioiden yhdistämistä ja useamman kuvion piirtoa.
    » C = SatRel(3,4,20)
    » D = SatRel(4,5,20)
    » E = BT(C,D)
    » figure(1); PiirRel2(C)
    » figure(2); PiirRel2(D)
    » figure(3); PiirRel2(E)
    
    
    Kuvioihin liittyy nyt "kahva" (handle) 1, 2 tai 3. Muotoile kuviot niin, että 1 ja 2 ovat vierekkäin näytön yläreunassa ja 3 alareunassa.
    Tutki onko alempi nyt todella ylempien tulorelaatio? 


    b) Mitä relaation yhdistäminen oikein tekee? Kokeillaan:

    » P = [0     0     1     1     0     % paina enter rivin viimeisen jälkeen
    0     0     0     0     0
    0     1     0     0     0
    1     0     0     0     0
    0     0     0     0     1]
    » figure(1); PiirRel1(P)
    » P2 = BT(P,P), figure(2), PiirRel1(P2)
    » P3 = BT(P2,P), figure(3), PiirRel1(P3)
    » BT(P,P) <= P
    » PP = P|P2
    » BT(PP,PP) <= PP
    » PP = P|P2|P3
    » BT(PP,PP) <= PP
    » figure(4); PiirRel1(PP)
    
    
    Selitä, kuinka P:stä kehittyy lopullinen PP, ja mitä erikoista siinä on: 

     
  13. Relaatioiden ominaisuustestejä: ekvivalenssi. Tarkastellaan äärellisten relaatioiden ominaisuuksia refleksiivisyys, symmetrisyys, antisymmetrisyys, transitiivisuus ja olla täysi (vrt. kotilaskut 2).
  14. a) Refleksiivisyyshän tarkoitti, että jokainen alkio on relaatiossa itsensä kanssa: matriisien kielellä tämä tarkoittaa, että päälävistäjällä on ykköset. Diagonaalia käsitellään vaikkapa seuraavasti:
    » M = SatRel(10,10,50)
    » diag(M)
    » all(diag(M))
    » D = diag(diag(M))
    » all(diag(D))
    » S = M | eye(size(M))
    » all(diag(S))
    
    
    Kirjoita Matlab-funktio ReflKo (viittaa kysymykseen "refleksiivinenkö"), joka palauttaa arvon 1, jos syötteenä annettua matriisia vastaava relaatio on refleksiivinen, ja muutoin arvon 0. Testaa sitä yllä määritellyillä matriiseilla M ja S.


    b) Miten tarkastetaan Matlabissa kahden matriisin samuus? 


    Kirjoita relaation symmetrisyyttä testaava funktio SymmKo.


    c) Miten tarkastetaan Matlabissa onko relaatio toisen osajoukko? 


    Kirjoita transitiivisuutta testaava funktio TransKo.
     
  15. Kirjoita funktio EkvivKo, joka palauttaa arvon 1, jos syötteenä annettu matriisi on ekvivalenssirelaation matriisi, ja arvon 0 muutoin. Funktion pitää siis tutkia ekvivalenttisuuden määritelmän mukaisesti relaation refleksiivisyys, symmetrisyys ja transitiivisuus. Kukin havaittu ominaisuus funktion pitää tulostaa tekstinä näytölle: esimerkiksi, jos relaatio on transitiivinen, tulostetaan sana 'transitiivinen'.

  16.  
  17. Antisymmetrisyys ja järjestys. Järjestysrelaatioita tarkastellaan myöhemmin lisää, mutta muodosta jo tässä antisymmetrisyyttä testaava funktio Antisko. Voit käydä vaikkapa for-silmukoilla läpi diagonaalin yläpuolen, tai sitten temppuilla matriisien logiikka- ja samuustesteillä.

  18.  


File translated from TEX by TTH, version 3.33.
On 04 Nov 2010, 13:49.