>> why Because he obeyed a good and young and smart and terrified and rich and rich and not very good and good and bald and not excessively tall and good programmer. Tässä materiaali on tarkoitettu insinööriopiskelijoille Matlabohjelmoinnin opiskeluun. Missään oppaassa ei voi opettaa kaikkia asioita, ei tässäkään. Pyrkimys on ollut käydä läpi perusteellisemmin niitä asioita, jotka ovat osoittautuneet tarpeellisiksi vuosien mittaan. Matlabin help on oikeasti hyödyllinen. Sitä kannattaa käyttää. Ja omaa mielikuvitusta. Oulu 25.1.2008 Jukka Jauhiainen Ohjelman käynnistäminen Nämä ohjeet pätevät Tekniikan yksikön verkosta käynnistyvään Matlab7-versioon. Ohjelmaa voi ajaa suoraan verkosta ilman minkäänlaisia asennuksia paikallisille koneille, joten se toimii (ainakin periaatteessa) missä tahansa Tekniikan yksikön verkkoon kytketystä koneesta. Verkosta saattaa löytyä vanhempiakin versioita (kuten esim. Matlab6p), mutta ne eivät toimi! Todennäköistä on, että Matlab ei löydy Windowsin START-valikosta tai työpöydältä. Yleensä se on käynnistettävä Windows Explorerin kautta klikkaamalla Tools -> Map Network Drive. Folderiksi valitaan \\s\apps\kotka\matlab7 Copyright Jukka Jauhiainen 2008 1
Kyseisestä hakemistosta löytyy ikoni, jota tuplaklikkaamalla ohjelma käynnistyy. Joskus ohjelma ei käynnisty, vaan ruutuun ilmestyy "Licence Manager Error". Tässä tilanteessa ota yhteys ATK-tukeen (ensisijaisesti Pekka Hämäläinen). Käynnistyminen saattaa kestää verkon yli jonkin aikaa, joten ole kärsivällinen. Niin kauan kuin vasemmanpuoleisessa ikkunassa on teksti "initializing", on lataus käynnissä. Käyttöliittymä Käynnistyksen jälkeen käytössä on kolme ikkunaa, joihin osaan voi valita eri toimintoja. Tärkein ikkuna on komentoikkuna (Command Window). Sinne käyttäjä voi kirjoittaa haluamiaan komentoja. Oheisessa esimerkissä on lisäksi Workspaceikkuna, jossa näkyy sillä hetkellä käytössä olevat muuttujat. Muuttujaa tuplaklikkaamalla saa näyttöön Excel-tyylisen taulukon, jossa näkyy muuttujan arvot. Kolmas esimerkin ikkuna on Command History, jossa näkyy lista edellisistä komennoista. Ne voi toistaa tuplaklikillä. Myös unix-maailmasta tuttu nuoli ylös/alas toimii komentoikkunassa. Muitakin ikkunoita on, ne on valittavissa yläpalkin viewnapin takaa. Yksittäisten komentojen lisäksi on mahdollista kirjoittaa hyvinkin monimutkaisia komentosarjoja tiedostoihin (ns. M-tiedostot). Näin tehtyjä uusia funktioita voidaan käyttää kuin mitä tahansa Matlabin sisäänrakennettuja valmisfunktioita. Copyright Jukka Jauhiainen 2008 2
Taustaa Nimi "matlab" tulee sanoista Matrix Laboratory. Matlab on siis suunniteltu ensisijaisesti matriisilaskentaan. Tämän ei pidä antaa pelottaa vaikka matriisin käsite olisikin outo. Vektori on yksiulotteinen (eli 1xn tai nx1) matriisi. Yksittäinen luku (eli skalaari) voidaan ajatella 1x1-matriisiksi. Esimerkiksi 3x3-matriisi on joukko lukuja, jotka on järjestetty 3 riviksi ja 3 sarakkeeksi. Matlab on tulkkaava ohjelmointikieli, eli se lukee rivi riviltä käyttäjän antamat komennot ja suorittaa niitä sitä mukaa. Virhetilanteessa ohjelman suoritus keskeytyy virheilmoitukseen. Tulkkavuudesta johtuu, että ohjelmien suoritus on hidasta verrattuna "oikeisiin" kääntäviin ohjelmointikieliin (esim. C).. Matlabin suosio perustuu pitkälti siihen, että siihen on saatavissa lukuisa laajennusosia, Toolboxeja, joiden ansiosta kaikkea ei tarvitse koodata itse alusta asti. Toolboxeja on saatavissa mm. signaalinkäsittelyyn, kuvankäsittelyyn, optimointiin, systeemisuunnitteluun jne. Niitä tulee myös koko ajan lisää. Tehtävä: Käy ohjelman tekijän MathWorks Inc:n kotisivulla. Kokeile kirjoittaa komentoriville komentoja help, helpwin, info ja demo. Tehtävä: Mitä komennot whos, cd, pwd ja clear tekevät? Peruskäsitteitä Copyright Jukka Jauhiainen 2008 3
Muuttujat ja peruslaskutoimitukset Yksinkertaiselle muuttujalle voidaan sijoittaa arvo samanlaisella sijoituslauseella kuin ohjelmoinnissa. Esimerkiksi sijoitus >>a=1 määrittelee muuttujan a, jolle annetaan arvoksi 1. Muuttujien arvot näkyvät Workspace-ikkunassa ja ne voidaan tulostaa myös kirjoittamalla muuttujan nimi komentoriville ja painamalla ENTER. Peruslaskutoimitukset suoritetaan +, -, * ja /-operaattoreilla. Esimerkiksi komento a=a+1 lisää muuttujan a arvoon 1. Vastaavasti c=a-b laskee muuttujien a ja b erotuksen ja tallentaa tuloksen muuttujaan c. Tehtävä 3: Määrittele muuttujat a ja b, anna niille vaikkapa arvot 3 ja 2 ja kokeile peruslaskutoimituksia niillä. Rivin lopussa oleva puolipiste (;) estää tulostuksen näytölle. Tämä voi olla tarpeen jos tulostusta on paljon. Puolipiste ei toimi Matlabissa samalla tavalla kuin C:ssä. Se ei ole pakollinen rivin lopussa, mutta jos samalle komentoriville kirjoittaa useamman komennon, toimii puolipiste komentojen erottimena. Esimerkiksi >>a=1 >>b=2 >>a+b on sama asia kuin >>a=1;b=2;a+b Tulostaa summan ans-nimiseen muuttujaan tallennettuna. Ans sisältää aina viimeisimmän komennon tulostuksen. Jos tulos halutaan tallentaa pysyvämmin, se kannattaa sijoittaa johonkin toiseen muuttujaan, esim. >>c=a+b Valmisfunktioita Matlabissa on joukko sisäänrakennettuja matemaattisia funktioita, joista tavallisimpia ovat: sqrt(x) = luvun x neliöjuuri x^n = luvun x n:s potenssi exp(n) = e n Copyright Jukka Jauhiainen 2008 4
log(n) = luonnollinen logaritmi luvusta n log10(n) = 10-kantainen logaritmi luvusta n sin(x), cos(x), tan(x) = trigonometriset funktiot, argumentti oltava radiaaneina asin(x), acos(x), atan(x) = trigonometriset käänteisfunktiot. Kompleksiluvut Kompleksiluku määritellään kirjoittamalla reaali- ja imaginääriosat summamuodossa. Matlab tunnistaa sekä i:n että j:n imaginääriyksiköksi. >> z=3+4i Tehtävä: Kokeile korottaa pelkkä vakio i tai j toiseen potenssiin. Mikä on tulos? Kompleksilukuihin liittyviä funktioita: Liittoluku: conj(z) Itseisarvo abs(z) Reaaliosa real(z) Imaginääriosa imag(z) Vaihekulma angle(z) Tehtävä: Laske luvun z=3+4i liittoluku, itseisarvo, reaaliosa, imaginääriosa ja vaihekulma. Copyright Jukka Jauhiainen 2008 5
Yksiulotteiset vektorit Vektori on taulukko, jossa on lukuja peräkkäin. Matlabissa taulukkojen indeksointi alkaa aina YKKÖSESTÄ, ei nollasta kuten esimerkiksi C:ssä. Vektori voidaan määritellä komennolla: >>x=[eka:askel:vika]; missä eka on vektorin ensimmäinen alkio, askel sanoo paljonko arvoa kasvatetaan ja vika on viimeinen alkio. Askeleen voi jättää pois, jolloin oletus on 1. Vektorin tiettyyn alkioon viitataan antamalla vektorin nimi ja sen perään suluissa numero, joka kertoo, monenteenko alkioon viitataan. Siis >>x(n) Tulostaa vektorin x n:nnen alkion. Kaksoispisteen avulla voidaan määritellä tulostettavaksi joukko peräkkäisiä alkioita: >>x(n1:n2) Tulostaa vektorin sisällön alkaen indeksistä n1 ja päättyen indeksiin n2. Esimerkki: Tehdään vektori x, joka saa arvot 0:sta 10:een 0.1 välein. >>x=[0:0.1:10]; x:n sisällön voi tarkistaa kirjoittamalla komentoikkunaan x, tai tuplaklikkaamalla sitä Workspacessa (sen pitäisi ilmestyä sinne tuon komennon jälkeen). Tulostetaan seuraavaksi x:n 1. alkio : >>x(1) 0 Ellei jonkin operaation tulosta sijoiteta johonkin muuttujaan, Matlab sijoittaa sen automaattisesti muuttujaan ans. Se siis sisältää aina viimeisimmän laskutoimituksen tuloksen. Vastaavasti komento >>a=x(1) sijoittaa x:n ensimmäisen alkion arvon muuttujaan a (joka ilmestyy Workspaceen). Katsotaan seuraavaksi, mitä x:n 10 ensimmäistä alkiota ovat: >>x(1:10) Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Copyright Jukka Jauhiainen 2008 6
Columns 8 through 10 0.7000 0.8000 0.9000 Vektorin alkioihin voidaan myös sijoittaa arvoja. Esimerkiksi tässä asetetaan vektorin x 10 ensimmäiseen alkioon 0: >>x(1:10)=0; Pysty- ja vaakavektorit Matlabissa vektori voidaan esittää joko pysty- tai vaakavektorina. Oletusarvona Matlab tekee vaakavektorin. Sen voi muuttaa pystyvektoriksi eli transponoida komennolla x : >> x=[1:3] x = 1 2 3 >> x' 1 2 3 Tehtävä: Tee vektori x, joka sisältää kokonaisluvut 1-5 ja vektori y, joka sisältää luvut 6 10. Kokeile yhteen-, vähennys, kerto- ja jakolaskuja. Mitä tapahtui? Summa ja erotus on määritelty matemaattisesti vektoreille siten, että operaatio kohdistuu vektorien vastinalkioihin. Sen sijaan tulon ja osamäärän tapauksessa Matlab pyrkii laskemaan aina matriisitulon. Tehtävä: Selitä, mitä seuraavat operaatiot tekevät: x*y x *y Vastinalkioiden kerto- ja jakolasku on toki myös mahdollista. Se määritellään laittamalla operaattorin eteen PISTE. Siis esimerkiksi x.*y. Tehtävä: Laske vektorien x ja y alkioittainen tulo ja osamäärä. Tehtävä: Tee Matlabilla vektorit, jossa on alkiot Matriisit a) 2, 4, 6, 8,..., 20 b) 10, 8, 6, 4, 2, 0, -2, -4,..., -10 c) 1, 1/2, 1/3, 1/4, 1/5,..., 1/10 d) 0, 1/2, 2/3, 3/4, 4/5,..., 9/10 Matriisi on kaksiulotteinen taulukko. Matriisin alkiot annetaan hakasulkujen sisällä rivi kerrallaan puolipisteillä erotettuna. Copyright Jukka Jauhiainen 2008 7
Esimerkki: a=[1 2 3; 4 5 6; 7 8 9] a = 1 2 3 4 5 6 7 8 9 >> a' 1 4 7 2 5 8 3 6 9 Matriisin transponointi siis kääntää rivit sarakkeiksi ja päinvastoin. Peruslaskutoimituksiin matriiseilla pätevät samat periaatteet kuin edellä vektoreihin. Summa ja erotus on siten määritelty vain kahden samankokoisen matriisin kesken vastinalkioiden välillä. Matriisin a käänteismatriisi voidaan laskea komennolla inv(a). Tehtävä: Käytä edellä määriteltyä matriisia a. Tee myös vaakavektori b, joka sisältää luvut 1, 2 ja 3. Mitä laskutoimituksia a:n ja b:n välillä voi tehdä? Tehtävä: Matlabissa on valmiina joukko komentoja, joilla voidaan tehdä tiettyjä erikoismatriiseja. Tällaisia on esimerkiksi ones(n), zeros(n), eye(n), magic(n) jne. Mitä nämä komennot tekevät? Kirjaimen n tilalla on oltava positiivinen kokonaisluku. Lineaarisen yhtälöryhmän ratkaiseminen Lineaarinen yhtälöryhmä ratkeaa MATLABin takakeno-operaatiolla. Jos yhtälöitä on enemmän kuin tuntemattomia (kerroinmatriisin aste on pienempi kuin tuntemattomien lukumäärä) saadaan pienimmän neliösumman ratkaisu. Yhtälöryhmä 10x 1-7x 2 = 7-3x 1 +2x 2 +6x 3 = 4 5x 1 -x 2 +5x 3 = 6 voidaan esittää matriisimuodossa Ax=b. MATLABissa muodostetaan ratkaisua varten kerroinmatriisi A ja oikean puolen vektori b:» A=[10,-7,0;-3,2,6;5,-1,5] A = 10-7 0-3 2 6 5-1 5» b=[7,4,6]' b = 7 4 6 Copyright Jukka Jauhiainen 2008 8
Yhtälöryhmä ratkeaa takakenolla» x=a\b x = 0-1 1 Tehtävä: Ratkaise Matlabilla yhtälöryhmä x 1 + x 2 + x 3 = 10 0.45x 1 + 0.55x 2 + 0.7x 3 = 6.45 0.35x 1 + 0.3x 2 + 0.2x 3 = 2.35 Tehtävä: Maalifirmalla on ylijäämä neljää erilaista vihreän sävyn maalia, joissa on neljää pigmenttiä prosentteina seuraavasti: Maali 1 Maali 2 Maali 3 Maali 4 Pigmentti 1 80 0 30 10 Pigmentti 2 0 80 10 10 Pigmentti 3 16 20 60 72 Pigmentti 4 4 0 0 8 Nämä maalit halutaan sekoittaa niin, että saadaan muodikkaampaa väriä, jossa pigmenttejä on suhteessa 40:27:31:2. Missä suhteessa maalit on sekoitettava? Muodosta ongelman ratkaiseva yhtälöryhmä ja ratkaise se Matlabilla. Muita matriisilaskentaan liittyviä toimintoja Suuri joukko valmiita matriisifunktioita on käytettävissä. Esimerkiksi matriisin determinantti lasketaan funktion det avulla:» det(a) 27 käänteismatriisi, inv» inv(a) -1.7778 0.8889-0.1111 1.5556-0.7778 0.2222-0.1111 0.2222-0.1111 matriisin aste, ominaisarvot jne.» rank(a) 3» eig(a) Copyright Jukka Jauhiainen 2008 9
-0.3884 12.1229-5.7345 Copyright Jukka Jauhiainen 2008 10