Matemaattiset ohjelmistot 802364A Osa 2: MATLAB Mikko Orispää 30. lokakuuta 2013
Sisältö 1 MATLAB 2 1.1 Peruslaskutoimitukset......................... 2 1.2 Muuttujat................................ 3 1.3 Perusfunktiot.............................. 4 1.4 Vektorit................................. 5 1.5 Vektorilaskentaa............................. 9 1.6 Matriisit................................. 11 1.7 Matiisifunktioita............................ 17 1.8 Grafiikkaa................................ 18 1.9 3D-kuvat................................. 19 1.10 Loogiset operaattorit.......................... 20 1.11 Kontrollirakenteet............................ 21 1.12 Funktiot ja skriptit........................... 22 1.13 File I/O................................. 23 1.14 Muuta.................................. 23 1
Luku 1 MATLAB 1.1 Peruslaskutoimitukset Yhteen-, vähennys-, kerto- ja jakolasku >> 1 + 1 2 >> 2 * 3-4 / 3 4.6667 Potenssiin korotus >> 2^2 4 >> 2^(-2) 0.25 2
Sulkeet >> 2 * (3 + 4) 14 >> 2 * ( (1 + 2) / (3 + 4) ) 0.8571429 Huom! Vain kaarisulkeita voi käyttää laskutoimitusten jaotteluun. Kaari- ja hakasulkeet on varattu muuhun käyttöön. Kompleksiluvut Imaginääriyksikkönä voi käyttää joko kirjainta i tai j: >> (2 + i) + (3-3j) 5.0000-2.0000i Huom! Jos kirjaimia i tai j käytetään omien muuttujien niminä, eivät ne enää toimi imaginääriyksikköinä! >> i = 1; >> 2 * (3 + i) 8 1.2 Muuttujat >> 3^2-1 8 >> ans * 5 40 3
Matlab nimeää vastaukset muuttujaksi ans, jota voi käyttää seuraavissa laskutoimituksissa. Omat muuttujat voi numetä haluamallaan tavalla. Muuttujannmet saavat sisältää kirjaimia (a-z ja A-Z), numeroita 0-9 ja alaviivan _. Muuttujan nimi ei saa alkaa numerolla! >> a_01 = 12; >> muuttuja_b = 3; >> a_01 + muuttuja_b 15 Kuten kompleksilukujen yhteydessä oli mainittu, kirjainten i ja j käyttöä muuttujien niminä kannattaa välttää, jotta imaginääriyksikkö toimii totutulla tavalla! 1.3 Perusfunktiot Trigonometriset funktiot >> sin(0.5) 0.4794 >> atan(3) 1.2490 Trigonometristen funktioiden argumentit annetaan radiaaneina. Muita perusfunktioita >> sqrt(2) 1.4142 >> exp(1) 4
2.7183 >> log(exp(4)) 4 >> log10(1000) 3 1.4 Vektorit Matlabissa kaikki objektit ovat matriiseja (Matlab tulee sanoista MATrix LABoratory). Vektorit ovat 2D-matriiseja, joiden toinen dimensio on 1. Vektorien konstruointiin käytetään hakasulkeita. Vaakavektorissa elementit erotellaan pilkulla tai välilyönnillä: >> h = [1,2,3] h = 1 2 3 >> v = [1 2 3-4] v = 1 2 3-4 >> length(v) 4 >> size(v) 1 4 Pystyvektorissa rivit erotellaan puolipisteellä: >> w = [1; -4; 2] w = 1 5
-4 2 >> length(w) 3 >> size(w) 3 1 Kaksoispistenotaatio Kaksoispisteellä saadaan helposti konstruoitua rivivektoreita: >> 1:4 1 2 3 4 >> 5:12 5 6 7 8 9 10 11 12 Yleisemmin notaatio a:b:c tuottaa rivivektorin, jossa a on ensimmäinen alkio ja b on alkioiden askeleen koko kunnes saavutetaan luku c: >> 1:0.5:4 Columns 1 through 6 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 Column 7 4.0000 >> 3:-1:-4 3 2 1 0-1 -2-3 -4 Komennolla linspace(a,b,n) voidaan luoda rivivektori, jonka ensimmäinen alkio on a, viimeinen b ja pituus n: 6
>> linspace(0,5,11) Columns 1 through 6 0 0.5000 1.0000 1.5000 2.0000 2.5000 Columns 7 through 11 3.0000 3.5000 4.0000 4.5000 5.0000 >> linspace(3,0,4) 3 2 1 0 Laskutoimitukset vektoreilla Yhteen-, vähennys- ja skalaarilla kertomisessa vektorien dimensioilla on merkitystä: >> v = [1 2 3]; >> h = [4-2 3]; >> 2*v-h/4 1.0000 4.5000 5.2500 >> w = [2; 5; 6] w = 2 5 6 >> v + w Error using + Matrix dimensions must agree. Suurin osa perusfunktioista on vektoroituja: >> sin(v) 0.8415 0.9093 0.1411 >> exp(h) 7
54.5982 0.1353 20.0855 Vektorin osiin viittaaminen >> r = [2:5, 3:-1:-2] r = 2 3 4 5 3 2 1 0-1 -2 >> r(3) 4 >> r(4:6) 5 3 2 >> r(1:2:end) 2 4 3 1-1 >> r(end:-1:1) -2-1 0 1 2 3 5 4 3 2 Vektorin transpoosi >> w = [1 2 3] w = 1 2 3 >> w 1 2 3 Jos x on kompleksinen vektori, niin x antaa konjugaattitranspoosin: 8
>> c = [1+i, 2-3i, 5-i] c = 1.0000 + 1.0000i 2.0000-3.0000i 5.0000-1.0000i >> c 1.0000-1.0000i 2.0000 + 3.0000i 5.0000 + 1.0000i Jos kompleksivektorille tarvitaan normaalia transpoosia, se on. : >> c. 1.0000 + 1.0000i 2.0000-3.0000i 5.0000-1.0000i 1.5 Vektorilaskentaa Sisätulo Matlab on tarkka vektoreiden dimensioista ja * tarkoittaa normaalia matriisikertolaskua >> a = [1,2,3]; >> b = [2; -3; 5]; >> a * b 11 >> a * a Error using * Inner matrix dimensions must agree. >> a * a 14 9
>> sqrt(a*a ), norm(a) 3.7417 3.7417 Pisteittäiset laskutoimitukset >> c = [3 7 5]; >> a.* c 3 14 15 >> a.* b Error using.* Matrix dimensions must agree. >> a./ b 0.5000-0.6667 0.6000 >> 2./ a 2.0000 1.0000 0.6667 >> a.^ 3 1 8 27 >> 2.^ a 2 4 8 10
1.6 Matriisit Matriisit luodaan kuten vektorit. Rivit erotetaan puolipisteellä ; tai kirjoittamalla ne eri riveille: >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> B = [ 1,2 3,4 5,6] B = 1 2 3 4 5 6 Komento size antaa matriisin dimensiot: >> size(a) 3 3 >> size(b) 3 2 Matriisin transpoosi Transpoosi saadaa samoin kuin vektoreilla: >> A 1 4 7 2 5 8 11
3 6 9 >> B 1 3 5 2 4 6 Erikoismatriiseja Nollamatriisi >> Z = zeros(3,5) Z = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> zeros(3,1) 0 0 0 Ykkösmatriisi >> N = ones(4,2) N = 1 1 1 1 1 1 1 1 >> ones(1,6) 1 1 1 1 1 1 Yksikkömatriisi >> I = eye(3) 12
I = 1 0 0 0 1 0 0 0 1 >> eye(3,4) 1 0 0 0 0 1 0 0 0 0 1 0 Diagonaalimatriisi >> a = [1 2 3]; >> diag(a) 1 0 0 0 2 0 0 0 3 Matriisin diagonaali >> A = [1,2,3;4,5,6;7,8,9] A = 1 2 3 4 5 6 7 8 9 >> diag(a) 1 5 9 Matriisien rakentaminen osista >> A = [1 2 3;4 5 6;7 8 9]; >> [A eye(3); zeros(3) A ] 13
1 2 3 1 0 0 4 5 6 0 1 0 7 8 9 0 0 1 0 0 0 1 4 7 0 0 0 2 5 8 0 0 0 3 6 9 >> b = [2 4 8]; >> [ [b;b;b] A; A [b b b ]] 2 4 8 1 2 3 2 4 8 4 5 6 2 4 8 7 8 9 1 4 7 2 2 2 2 5 8 4 4 4 3 6 9 8 8 8 Matriisin osiin viittaaminen Tämä sujuu samoin kuin vektoreilla, nyt vain dimensioita on kaksi: >> A = [1 2 3;4 5 6;7 8 9]; >> A(3,3) 5 >> A(1:2,3) 3 6 >> A(1,:) 1 2 3 >> A(:,2) 2 5 14
8 Yhteen- ja vähennyslasku, pisteittäiset operaatiot Samoin kuin vektorien tapauksessa >> A = [1 2 3; 4 5 6]; >> B = 2 * ones(2,3); >> A + B 3 4 5 6 7 8 >> 1./ A + A.* B 3.0000 4.5000 6.3333 8.2500 10.2000 12.1667 >> A.^2 1 4 9 16 25 36 2.^ A 2 4 8 16 32 64 Matriisikertolasku Matriisikertolaskut tehdään operaattorilla *. Kerrottavien matriisien pitää olla dimensioiltaan yhteensopivat. >> A = [1 2 3; 4 5 6; 7 8 9]; >> B = [3 4; -1 2; 0 4]; >> c = [1 2 3]; >> A*B 15
1 20 7 50 13 80 >> A*c Error using * Inner matrix dimensions must agree. >> A*c 14 32 50 >> B*B 25 5 16 5 5 8 16 8 16 >> B *B 10 10 10 36 Käänteismatriisi, lineaarinen yhtälöryhmä Käänteismatriisi >> M = [1 0 2; -2 1 0; 0 2 2]; >> det(m) -6 >> im = inv(m) im = -0.3333-0.6667 0.3333-0.6667-0.3333 0.6667 16
0.6667 0.3333-0.1667 >> im * M 1 0 0 0 1 0 0 0 1 Matriisimuoodssa oleva lineaarinen yhtälöryhmä ratkaistaan käyttämällä operaattoria \: >> A = [2-1 0; 1-2 1; 0-1 2]; >> y = [1 0 1] ; >> x = A\y x = 1.0000 1.0000 1.0000 >> A*x 1.0000-0.0000 1.0000 y = Ax 1.7 Matiisifunktioita Determinantti Aste(rank) Ehtoluku Normi 17
1.8 Grafiikkaa Plot Komennolla plot voidaan plotata graafeja: >> x = linspace(0,2*pi,100); >> y = sin(3*x); >> plot(x,y) Tekstiä voi lisätä käskyillä title, xlabel ja ylabel: >> plot(x,y) >> title( y=sin(3x) ) >> xlabel( X-akseli ) >> ylabel( Y-akseli ) Viivatyylit ja värit Oletusarvoisesti Matlab käyttää sinistä viivaa plottaukseen. Viivatyyppiä ja väriä voi vaihtaa antamalla plot-komennolle lisäargumentteja. >> plot(x,y, r-- ) >> plot(x,y, mo ) Käytettävissä olevat vaihtoehdot löytyvät plot-komennon ohjeista käskyllä help plot. Samaan kuvaan plottaaminen Useita käyriä voi plotata samaan kuvaan: >> plot(x,y, k--,x,cos(2*x), r ) >> legend( Sini, Kosini ) >> title( Multi-plot ) >> grid Toinen vaihtoehto on käyttää komentoa hold: 18
>> plot(x,y) >> hold on >> plot(x,sin(4*x), r* ) >> hold off Subplot Yhteen grafiikkaikkunaan on mahdollista piirtää monta kuvaa: >> subplot(221) >> plot(x,y) >> grid >> subplot(222) >> plot(x,y, r ) >> subplot(223) >> plot(x,y, k* ) >> subplot(224) >> plot(x,y, m--x ) Kuvan ominaisuuksien muuttaminen Kuvan ominaisuuksia voidaan muuttaa käskyllä set: >> pic = plot(x,y) >> get(pic) >> set(pic, LineWidth,6) >> set(pic, LineStyle, -- ) >> get(gca) >> set(gca, FontSize,20) 1.9 3D-kuvat Kolmiulotteisia pintoja z = f(x, y) voidaan plotata käskyllä mesh. Tarvittava hila saadaan komennolla meshgrid: 19
>> x = linspace(-5,5,20); >> y = linspace(-3,6,20); >> [X,Y] = meshgrid(x,y); >> Z = X.^2 - Y.^2; >> mesh(x,y,z) Muita mahdollisia plottauskäskyjä ovat mm. contour, contourf, surf ja surfl. 1.10 Loogiset operaattorit Loogiset operaattorit ovat samat kuin R:ssä, paitsi negaatio, joka on ~. Matlabissa ei ole erillisiä totuusarvoja, vaan se käyttää nollaa ja ykköstä. >> 1==1 1 >> 1~=1 0 >> 1 >= 2 0 jne... find on erittäin hyödyllinen funktio, jolla voi etsiä halutut kriteerit täyttäviä alkioita vektoreista ja matriiseista. Se palauttaa kriteerin toteuttaneiden alkioiden indeksit: >> x=randn(1,5) x = 0.5377 1.8339-2.2588 0.8622 0.3188 >> find(x<0) 20
3 >> find(x>0) 1 2 4 5 >> x(find(x<0))=100 x = 0.5377 1.8339 100.0000 0.8622 0.3188 >> y=rand(3) y = 0.0975 0.9575 0.9706 0.2785 0.9649 0.9572 0.5469 0.1576 0.4854 >> y(find(y>0.5))=1 y = 0.0975 1.0000 1.0000 0.2785 1.0000 1.0000 1.0000 0.1576 0.4854 1.11 Kontrollirakenteet Matlabista löytyy samat kontrollirakenteet kuin R:stä ja muistakin ohjelmointikielistä. Syntaksi vain on hieman erilainen: for i = 1:10 disp(i) end i=0; sum = 0; while i <= 100 sum = sum + i; i = i + 1; end 21
a=randn(1,100); for i=1:100 if a(i) > 0 a(i) = 1; else a(i) = 0; end end 1.12 Funktiot ja skriptit Omia funktioita voi tehdä Matlabin tekstieditorilla (edit) tai millä tahansa tekstieditorilla. Jokainen funktio pitää tallentaa omaan tiedostoonsa, jonka nimi tulee olla muotoa xxx.m, missä xxx on funktion nimi. Funktion rakenne on seuraavanlainen: function [A,B,C] = funktion_nimi(x,y,z) % funktion sisällä olevat käskyt % Huom! Prosenttimerkillä alkavat rivit % ovat kommentteja! end Hakasulkeiden sisässä olevat argumentit (tässä A, B ja C) ovat funktion palauttamia muuttujia ja argumentit x, y ja z funktion varsinaisia argumentteja. Esimerkkinä funktio, joka palauttaa kokoa n x m olevat nolla- ja identtiteettimatriisit: function [N,I] = tee_matriisit(n,m) N = zeros(n,m); I = eye(n,m); end Jos funktiota kutsutaan käskyllä [A,B] = tee_matriisit(2,3) 22
palauttaa se nollamatriisin A ja diagonaalimatriisin B. Jos taas funktiota kutsutaan komennolla A=tee_matriisit(3,3) palauttaa se ainoastaan ensimmäisen palautusargumenttinsa, eli nollamatriisin A. 23