MATEMAATTISET OHJELMISTOT. Syksy 2012
|
|
|
- Jalmari Jurkka
- 9 vuotta sitten
- Katselukertoja:
Transkriptio
1 MATEMAATTISET OHJELMISTOT Syksy 2012 Matlab-luennot, 1. osa Sisältö 1 Johdanto 1 2 Käyttöliittymä 3 3 Käytön perusteita 4 4 Matriiseista Muodostaminen Valmismatriisit Indeksointi Laskutoimitukset Alkioittaiset operaatiot Hieman lineaarialgebraa 19 1 Johdanto Matlab on interaktiivinen numeerisen laskennan ohjelmisto. Se on tehokas, monipuolinen ja laajalti käytössä teollisuudessa, yliopistoissa ja muissa tutkimuslaitoksissa. Matlabissa yhdistyvät laskentatehokkuus, ohjelmoitavuus ja visualisointi. Matlabin ensimmäisen version kirjoitti Fortran-ohjelmointikielellä Cleve Moler 1970-luvun lopulla. Ohjelman saavutettua suosiota sekä opetus- että tutkimuskäytössä se kirjoitettiin uudelleen C-ohjelmointikielellä. Ensimmäinen kaupallinen versio, Matlab 1.0, julkaistiin vuonna Alunperin Matlab kehitettiin matriisilaskennan ohjelmistoksi (MATrix LABoratory), mutta nykyään se on laajentunut hyvin monelle sovellusalueelle. Matlabille on tehty suuri joukko ns. toolboxeja, joilla on laajennettu Matlabin toiminnallisuutta uusille alueille. Toolboxit on kirjoitettu Matlabin omalla ohjelmointikielellä ja niitä on tarjolla signaalin- ja kuvankäsittelyyn, optimointiin, sumeaan logiikkaan, neuroverkkoihin, osittaisdifferentiaaliyhtälöiden ratkaisemiseen ym. Tällä kurssilla ei kuitenkaan käytetä mitään Matlabin toolboxeista, koska niiden saatavuus voi vaihdella suuresti. 1
2 Matlabilla on useita etuja perinteisiin numeerisen laskennan työkaluihin (esim. Fortran- ja C-ohjelmointi) verrattuna: Ohjelmointi Matlabin korkean tason kielellä on nopeaa ja kohtalaisen helppoa. Tietorakenteisiin ei tarvitse kiinnittää samassa määrin huomiota kuin perinteisillä ohjelmointikielillä. Erityisesti taulukoita (matriiseja) ei tarvitse esitellä ennen käyttöä. Interaktiivinen käyttöliittymä mahdollistaa erilaiset nopeat kokeilut (ns. prototyypitys). Korkeatasoisen grafiikan ja visualisoinnin teko on helppoa. Matlabilla tehdyt m-tiedostot ovat täysin siirrettäviä eri tietokonealustojen välillä. Ohjelmistoa voidaan laajentaa toolboxeilla. Edelleen Matlab on moderni ohjelmointikieli ja ongelmanratkaisuympäristö. Siinä on kehittyneet tietorakenteet, se sisältää editorin ja virheentarkistus-työkalut (ns. debuggaus). Se tukee nykyään myös oliosuuntautunutta ohjelmointia. Matlab on tulkattava kieli, joten se kärsii pienestä tehohäviöstä käännettäviin kieliin verrattuna. Uusimmat versiot sisältävät kuitenkin erilaisia sisäänrakennettuja kiihdytysmenetelmiä. Matlabia voi käyttää interaktiivisesti sen oman käyttöliittymän avulla tai voidaan ajaa Matlabin ohjelmointikielellä itse kirjoitettuja Matlab-ohjelmia. Matlab-ohjelmia voidaan myös integroida Matlab-ympäristön ulkopuolisiin sovelluksiin, jotka on tehty käännettävillä ohjelmointikielillä (esim. C, C++, Fortran tai Java). Siis voidaan esimerkiksi käyttää Matlabista käsin ko. kielillä tehtyjä ohjelmia. Edelleen on mahdollista kääntää Matlab-ohjelmia C- tai C++ -kielelle tehokkaampaa suoritusta varten. Matlab koostuu viidestä pääosasta: Kehitysympäristö. Matlabin interaktiivinen käyttöliittymä, jolla voidaan käyttää Matlabin valmiita komentoja tai funktioita. Kehitysympäristö sisältää myös työkalut, joiden avulla voidaan tehdä omia Matlab-ohjelmia. Matlabin matemaattisten funktioiden kirjasto sisältää Matlabin laskenta-algoritmit erilaisille matemaattisille funktioille, aina alkeisfunktioista erikoisfunktioihin ja erilaisiin matriisioperaatioihin sekä muunnoksiin. Matlabin ohjelmointikieli. Grafiikkaosa sisältää Matlabin grafiikkaominaisuudet. Matlab API (Application Program Interface). Matlabin ulkoisten kielien (ohjelmien) liittymä, jonka avulla voidaan kirjoittaa C- ja Fortran- ohjelmia, jotka vuorovaikuttavat Matlabin kanssa. Siis voidaan kutsua esim. Fortranohjelmia Matlabista tai Matlabia voidaan käyttää Fortran-ohjelmasta. 2
3 2 Käyttöliittymä Ikkunointia käyttävissä käyttöjärjestelmissä Matlab käynnistyy Kuvan 1 kaltaiseen käyttöliittymään, Matlabin työpöytään (Matlab Desktop). Työpöytä sisältää työkalut tiedostojen, muuttujien ja Matlabiin liitettyjen sovellusten hallintaan. Työpöydän ulkoasua voidaan muuttaa (esim. View-valikosta) työkalujen ikkunoita avaamalla, sulkemalla, siirtämällä ja niiden kokoa muuttamalla. Kuva 1: Matlabin graafinen käyttöliittymä (R2012b) Keskellä on komentoikkuna (Command Window), johon Matlabin komennot syötetään. Oikealla alhaalla on komentohistoriaikkuna (Command History), joka tallettaa kaikki komentoikkunaan syötetyt komennot. Historiaikkunasta voidaan esim. valita aiemmin suoritettuja komentoja uudelleen suoritettavaksi. Historiaikkunan yläpuolella on työtilaikkuna (Workspace). Työtilaikkunasta nähdään sillä hetkellä käytössä olevat muuttujat ja mm. niiden koko. Kaksoisnäpäyttämällä muuttujaa työtilaikkunassa avautuu Variable Editor, jolla voidaan mm. muokata muuttujan arvoa. Työtila voidaan tallettaa myöhempää käyttöä varten MAT-tiedostoksi File valikon Save Workspace As komennolla. Vasemmalla on hakemistoikkuna (Current Folder). Siitä nähdään sen hetkinen työhakemisto, jota voidaan muuttaa Current Folder Browserin (keskellä ylhäällä) avulla. Matlab käyttää ns. hakupolkua (search path) etsiessään M-tiedostoja ja muita Matlab-tiedostoja. Niinpä on usein syytä omien, varsinkin isompien, pro- 3
4 jektien yhteydessä määritellä oma työhakemisto Matlabin hakupolkuun. Tämä tapahtuu esimerkiksi File valikon Set Path komennolla. Käyttöliittymään voidaan kiinnittää (dock) muita ikkunoita, esimerkiksi kuvaajia, tai käyttöliittymän ikkunoita voidaan irrottaa (undock) omiksi ikkunoikseen. Tämä tapahtuu joko Desktop valikosta tai kussakin ikkunassa olevasta dock/undock napista. Edelleen käyttöliittymään kuuluu Matlabin oma editori/debuggeri, mutta tähän palaamme, kun alamme kirjoittamaan omia Matlabohjelmia. Lisäksi Help valikon alta löytyy Matlabin dokumentaatio eli eräs työpöydän käytetyimmistä osista. Edelleen vasemman alanurkan Start napilla pääsee helposti käsiksi Matlabin työkaluihin, demoihin ja dokumentaatioon. Matlabia voi käyttää myös tekstipohjaisella käyttöliittymällä (komentorivi), jolloin näkyvissä on pelkkä komentokehote >> Käytön perusteita Matlab komennot syötetään komentoikkunaan ja päätetään tuttuun tapaan painamalla ENTER. Matlabissa ei ole erityistä rivin lopetusmerkkiä, mutta jos ei haluta tulosta näytölle, lopetetaan rivi puolipisteeseen. Tämän lisäksi seuraavat asiat on hyvä pitää mielessä: Matlab on case sensitive eli isoilla ja pienillä kirjaimilla on eri merkitys. Kirjoittamalla muuttujan nimi nähdään muuttujan arvo. Matlabissa käytetään kaarisulkeita ( ), hakasulkeita [ ] ja aaltosulkeita { }. Niillä kaikilla on eri merkitys ja käyttötarkoitus. Ylös- ja alas-nuolinäppäimillä voidaan selata aiemmin annettuja komentoja. Vanhaa komentoa voidaan myös hakea kirjoittamalla pari ensimmäistä merkkiä ja painamalla ylös-nuolinäppäintä. Komennolla help aihe saadaan lyhyt avuste komennosta, funktiosta tai symbolista aihe. Huomaa, että Matlab käyttää myös hyperlinkkejä, joita klikkaamalla pääsee avusteisiin. Kattavampi avuste avautuu komennolla doc aihe. Jos painetaan sarkainnäppäintä (TAB, tabulaattori) sen jälkeen, kun funktion tai muuttujan nimi on osittain syötetty, saadaan näkyviin lista mahdollisista kokonaisista funktion tai muuttujan nimistä. Kirjoittamalla exit tai quit lopetetaan Matlabin käyttö. Matlabia voi käyttää tutusti laskimen tapaan: >>sin(pi/2) + sqrt(4)*i i 4
5 Matlabissa luku π on siis pi ja imaginääriyksikkö on i tai j. Kompleksiluvut esitetään tutusti muodossa a + bi. Piin ja imaginääriyksikön lisäksi Matlabissa on muutamia muita vakioita: >>eps, realmin, realmax, Inf, NaN e e e+308 Inf NaN Matlab sijoittaa komennon tuloksen muuttujaan ans, jos käyttäjä ei itse sijoita tulosta johonkin muuhun muuttujaan. Matlabissa sijoitusoperaattorina toimii =. Muuttujia voidaan siten määritellä yksinkertaisesti sijoituskäskyllä eli muodossa muuttuja = lauseke. Matlabin muuttujat eivät vaadi erityistä tyypin tai dimension määrittelyä. Matlabin havaittua uuden muuttujan nimen, se luo ko. muuttujan ja varaa sille tarvittavan tilan. Jos muuttuja on jo aiemmin määritelty, Matlab korvaa sen sisällön uudella sisällöllä, sekä varaa tarvittaessa lisää tilaa. Muuttujan nimi muodostuu kirjaimesta, jota seuraa mikä tahansa määrä kirjaimia, numeroita tai alaviivoja. Matlab huomioi kuitenkin vain muuttujan nimen 63 ensimmäistä merkkiä. Edelleen Matlab erottaa isot ja pienet kirjaimet eli muuttuja ja Muuttuja ovat eri muuttujia. Muuttujan arvo nähdään syöttämällä muuttujan nimi. Esim. >>a = 56; b = 3 b = 3 >>c = a*b; >>c c = 168 Komennolla who nähdään sillä hetkellä Matlabissa määritellyt muuttujat. Edelleen komennolla whos nähdään tarkempaa tietoa määritellyistä muuttujista, mm. niiden viemä muistitila. Nämä tiedot ovat näkyvillä myös Matlabtyöpöydän työtilaikkunassa. 5
6 >>who Your variables are: a ans b c >> whos Name Size Bytes Class Attributes a 1x1 8 double b 1x1 8 double c 1x1 8 double Muuttujan voi poistaa komennolla clear muuttuja. Komento clear poistaa kaikki muuttujat. Komento clc tyhjentää komentoikkunan näkymän (ei kuitenkaan muuttujia). Matlabissa on sisäänrakennettuina useimmat alkeisfunktiot sekä lukuisia erikoisfunktioita. Esim. >>[abs(3 + 2*i), angle(3 + 2i), atanh(pi/4), log(exp(1)), gamma(2.5)] Tulostuksen muotoa, ei sitä millä tarkkuudella Matlab laskee, voidaan säätää format-komennolla. Oletuksena on format short, jolloin tulostuksessa on neljä desimaalia (vrt. yllä). Muita vaihtoehtoja: >>format long, ans Columns 1 through Columns 4 through >>format rat, ans 4936/ / / /167 >>format short % palautetaan oletusmuoto Katso lisää tietoa komennolla help format. Matlabissa prosenttimerkki % on kommenttimerkki. Jos komennot eivät mahdu yhdelle riville, käytetään Matlabissa jatkomerkkinä kolmea pistettä (... ). Yhdellä rivillä voi syöttää useampia komentoja pilkuilla erotettuna. Komentorivillä voi liikkua nuolinäppäimillä oikealle ja vasemmalle, ja aiemmin syötettyjä komentoja voi selata nuolinäppäimillä ylös ja alas. 6
7 4 Matriiseista Matlabin peruselementti on matriisi. Skalaaria voidaan Matlab-ympäristössä ajatella 1 1-matriisina. Vastaavasti n-alkioista vektoria voidaan pitää joko 1 n- (vaakavektori) tai n 1-matriisina (pystyvektori). 4.1 Muodostaminen Matriisi voidaan muodostaa mm. syöttämällä alkiot hakasulkujen sisään. Esim. komennolla >>[1 2 3; 4 5 6] muodostetaan 2 3-matriisi Syötettäessä matriisia, rivit erotetaan puolipisteellä ja sarakkeet pilkulla tai välilyönnillä. Siis vaakavektori ja pystyvektori muodostetaan seuraavasti: >>[ ], [1, 2, 3, 4, 5, 6], [1; 2; 3; 4; 5; 6] Matriisin transpoosia varten on kaksi operaattoria, ja.. Näistä ensimmäinen muodostaa kompleksiarvoisille matriiseille konjugoidun transpoosin, kun taas jälkimmäinen ei (normaali transpoosi). Esim. >> [1 2 3]
8 >> [1 2 3+i] i >> [1 2 3+i] i Matlabissa hyvin tärkeä kaksoispisteoperaattori : helpottaa yllä olevan kaltaisten vektorien ja matriisien muodostamista. Esimerkiksi seuraavassa muodostetaan vaakavektori kokonaisluvuista yhdestä kymmeneen, sekä 3 3-matriisi luvuista yhdestä yhdeksään: >>a = 1:10, A = [1:3; 4:6; 7:9] a = A = Oletusaskel on ykkösen suuruinen, mutta sen voi määritellä myös itse: >>0: pi/2 : 2*pi >>20 : -0.2 : Valmismatriisit Matriisi voidaan muodostaa myös käyttämällä Matlabissa olevia valmiita komentoja tietyille erikoismatriiseille: 8
9 >>zeros(2,3), ones(3) % 2x3-matriisi nollista, 3x3-matriisi ykkösistä >>eye(3), diag(1:2:8) % yksikkömatriisi ja diagonaalimatriisi Komennolla rand saadaan matriisi, jonka alkiot ovat tasanjakautuneita satunnaislukuja väliltä (0, 1). Komennolla randn saadaan puolestaan satunnaislukuja normaalijakaumasta N(0, 1) sisältävä matriisi. >>s1 = rand(3) s1 = >>s2 = randn(1, 6) s2 = Matlabissa on myös hieman erikoisempia valmismatriiseja. Esimerkiksi ns. maaginen matriisi, jonka rivien, sarakkeiden ja diagonaalien summa on sama luku. >>help magic MAGIC Magic square. MAGIC(N) is an N-by-N matrix constructed from the integers 9
10 1 through Nˆ2 with equal row, column, and diagonal sums. Produces valid magic squares for all N > 0 except N = 2. >>M = magic(4) M = Hilbertin matriisi, Vandermonden matriisi ja Pascalin matriisi (symmetrinen, positiivisesti definiitti matriisi, jonka alkiot on poimittu Pascalin kolmiosta): >>Hile = hilb(3), Vand = vander(1:3), Pasc = pascal(4) Hile = Vand = Pasc = Edelleen on mahdollista muodostaa matriiseja lataamalla matriisi jostain datatiedostosta load-funktiolla. Tiedosto voi olla binääritiedosto (.mat-tiedosto), johon on talletettu aiemmassa Matlab-istunnossa määriteltyjä matriiseja tai tekstitiedosto. Tarkempaa tietoa saa komennolla help load. Lisäksi matriiseja voi tallettaa ja lukea M-tiedostoihin, jotka ovat Matlab-koodia sisältäviä tekstitiedostoja. M-tiedostoja voi tallettaa ja muokata millä tahansa tekstieditorilla tai Matlabin omalla editorilla. M-tiedostot talletetaan.m-päätteellä ja niitä voidaan kutsua Matlab-istunnosta kirjoittamalla tiedoston nimi ilman.m-päätettä tai sen kanssa. Lisäksi matriiseja voi muodostaa yhdistämällä matriiseja toisiinsa. Matlabin yhdistämisoperaattori on hakasulut eli [ ]. Itse asiassa, kun edellä teimme ensimmäisen matriisimme, yhdistimme vain sen yksittäiset alkiot tällä yhdistämisoperaattorilla. >>yhdistys = [Pasc M; Pasc+ones(4) M+eye(4)] yhdistys = 10
11 Matriisien täytyy olla tietenkin dimensioiltaan yhteensopivia: >>yhdistys2 = [Pasc; Hile]??? Error using ==> vertcat CAT arguments dimensions are not consistent. Matriisin koko selviää helposti komennolla size: >>size(yhdistys) Indeksointi Matriisin alkioita voidaan valita laittamalla nimen perään sulkuihin alkion rivija sarakeindeksi, siis >>M(2,3) 10 Indeksointi alkaa luvusta 1. Voidaan käyttää myös yhtä indeksiä, jolloin matriisin voi ajatella yhdeksi suureksi pystyvektoriksi, jossa on alkuperäisen matriisin alkiot asetettuna sarakkeittain peräkkäin, siis >>M(10) 10 Kerralla voidaan valita useampia alkioita käyttämällä kaksoispisteoperaattoria. Matriisin M kolmannen rivin toinen ja kolmas alkio: >>M(3, 2:3)
12 Koko rivi tai sarake voidaan valita pelkällä kaksoispisteellä, minkä lisäksi on käytössä varattu sana end viimeiselle riville ja sarakkeelle: >>M(end, :) >>M(:, end) >>M(end, end) 1 Alkioita voidaan valita myös sillä perusteella, toteuttavatko ne jonkin loogisen ehdon: >>M( isprime(m)) = 0 % kaikki ei-alkuluvut nolliksi matriisissa M M = >>M = M( M>0 ) % Poimitaan matriisin M positiiviset alkiot M = >>M = magic(4); Huomaa, että edellä käytettiin operaattoria, joka muodostaa matriisin transpoosin (kompleksiarvoisille matriiseille konjugoidun transpoosin). Matlabin find-funktiolla voidaan etsiä tietyn ehdon täyttävät alkiot: >>k = find(isprime(m)) k = Tässä find palautti ehdon täyttävien alkioiden yksiulotteiset indeksit vektoriin k. Matriisista voidaan tämän jälkeen poimia ehdon täyttävät alkiot käyttämällä saatua indeksivektoria k: 12
13 >>M(k) Jos koetetaan viitata alkioon matriisin indeksirajojen ulkopuolelta, saadaan virheilmoitus >>m = M(5,1)??? Index exceeds matrix dimensions. Kuitenkin, jos sijoitetaan arvo sellaiselle matriisin alkiolle, jota ei ole vielä olemassa, niin matriisi laajenee sellaiseksi, että lisätty alkio tai alkiot mahtuvat mukaan >>X = M; >>X(5,:) = zeros X = Matriisin kokonaisia rivejä tai sarakkeita voidaan tuhota käyttämällä tyhjää yhdistämisoperaattoria []. >>X(:,3) = [] X = Erityisesti yksiulotteisen vektorin alkioita voidaan poistaa: >>Y=1:5, Y(2:3)=[] Y = Y = Kuitenkin: 13
14 >>X(2,2) = []??? Subscripted assignment dimension mismatch. Jos matriisista tuhoaa yhden elementin, ei tulos enää ole matriisi, joten edellisen kaltainen komento ei toimi. Käyttämällä yhtä indeksiä eli käsittelemällä koko matriisia yhtenä sarakevektorina, voidaan yksittäinen alkio tai alkioita poistaa. Tällöin matriisin jäljelle jääneistä alkioista tulee vaakavektori: >>X(6 : 2 : 13) = [] X = Indeksejä käyttämällä voidaan muodostaa aritmeettisia operaatioita eli esimerkiksi matriisin M kolmannen sarakkeen alkioiden summa >>M(1,3) + M(2,3) + M(3,3) + M(4,3) 34 Tällaisiä usein tarvittuja operaatioita varten on Matlabissa valmiita funktioita, siis kolmannen sarakkeen alkioiden summa matriisissa M on: >>sum(m(:,3)) 34 Yleisemmin, sum-komento laskee oletuksena matriisin alkioiden summan sarakkeittain: >>sum(yhdistys) Jos halutaan laskea summa riveittäin, niin se voidaan tehdä käyttämällä samaa sum-komentoa matriisin transpoosille. Matriisin yhdistys rivisumma: >>sum(yhdistys ) % konjugointi ei haittaa Lasketaan maagisen matriisin M rivi-, sarake- ja diagonaalisummat. Huomaa, että diag poimii matriisin diagonaalin vektoriksi, kun sille annetaan argumentiksi matriisi. 14
15 >>sum(m), sum(m ), sum(diag(m)) Matriisi on siis maaginen. 4.4 Laskutoimitukset Koska matriisi on Matlabin peruselementti, niin peruslaskutoimitukset voidaan tehdä matriiseille ilman mitään erityistoimenpiteitä: >>A = [1 2 3; 4 5 6] A = >>B = [3 1 5; 2 0-3] B = >>C = [3 4; 5 6; 7 8] C = >>A + B >>A + 5 % matriisin jokaiseen alkioon lisätään skalaari
16 >>5*A % skalaari*matriisi >>A*C % matriisi*matriisi Matriisien dimensioiden on tietenkin oltava yhteensopivat: >>A + C % voidaan lisätä vain samankokoinen matriisi tai skalaari??? Error using ==> plus Matrix dimensions must agree. >>A*B??? Error using ==> mtimes Inner matrix dimensions must agree. >>nelio = A*B % huomaa B:n transpoosi nelio = >>nelioˆ3 % matriisi potenssiin >>Aˆ2 % on oltava neliömatriisi??? Error using ==> mpower Inputs must be a scalar and a square matrix. Otetaan käyttöön vektorit u ja v : >>u = [2 4 6]; v = [1; 3; 5]; Nyt >>A*v 16
17 22 49 >>u*c >>u*v % skalaaritulo eli pistetulo eli sisätulo 44 >>v *v 35 >>dot(v, v) 35 >>cross(u, v) % vektoritulo eli ristitulo >>v*u % ulkotulo, tuloksena matriisi Itseasiassa kyseessä on ns. Kroneckerin tulo eli tensoritulo >>kron(u,v) Matriiseille: >>tens = kron(a, B) 17
18 tens = Jos A on m n-matriisi ja B p q-matriisi, niin Kroneckerin tulo kron(a,b) on mp nq-matriisi, jossa on on kaikki mahdolliset tulot, kun kukin matriisin A alkio kerrotaan matriisilla B. 4.5 Alkioittaiset operaatiot Usein on tarve tehdä jokin operaatio vektorille tai matriisille alkioittain. Matlabissa on tätä varten kerto- ja jakolaskusta sekä potenssiinkorotuksesta alkioittaiset versiot.*,./ ja.ˆ. Nämä ovat ns. taulukko-operaatioita (array operators). Yhteen- ja vähennyslaskun tapauksessa taulukko-operaatiot ovat samat kuin matriiseille, joten operaattoreita.+ ja.- ei ole erikseen määritelty. Taulukkooperaatioita voidaan käyttää myös moniulotteisten taulukoiden käsittelyyn, mutta tällaisia taulukoita emme käsittele tässä yhteydessä. Esim. >>A.ˆ >>A.*B >>B./A >>v./ Huomattakoon vielä, että useimmat alkeisfunktiot hyväksyvät argumenteikseen vektoreita ja matriiseja. Tällöin funktio operoi matriisiin alkioittain. 18
19 >>sin(z) % sinifunktio operoi suoraan vektoriin alkioittain i i >> x = 0:pi/2:2*pi x = >> cos(x),exp(x) Hieman lineaarialgebraa Matlabissa on kaksi eri jakolaskuoperaatiota / ja \. Näistä molemmista on myös alkioittaiset versiot eli./ ja.\. Jakolasku X=A\B on itseasiassa matriisiyhtälön AX = B ratkaisu (jaetaan vasemmalta, left divide). Vastaavasti, jakolasku X=B/A puolestaan määrää matriisiyhtälön XA = B ratkaisun (jakaa oikealta, right divide). Jakolasku A\B vaatii, että matriiseilla A ja B on yhtä monta riviä, ja jakolasku B/A vaatii, että sarakkeita on yhtä monta. Jakolaskua \ voidaan siis hyödyntää yhtälöryhmän ratkaisemisessa, esimerkiksi: >>A = [2-1 1; 3 2 2; 1-2 1] A = >>b = [2; -2; 1] b = >>x = A\b x = 19
20 Samoin voidaan käyttää komentoa /, kun yhtälöryhmä on muotoa XA = B: >>B = [2-1 3] B = >>X = B/A X = Matlab muodostaa käänteismatriisin, jos se on olemassa, komennolla inv: >>inv(a) Vaihtoehtoisesti voitaisiin tietenkin korottaa matriisi potenssiin 1: >>Aˆ(-1) tai ratkaista yhtälöryhmä AX = I >>A\eye(3) Todettakoon, että yhtälöryhmää ei tulisi ratkaista käänteismatriisilla kertomalla. Palaamme myöhemmissä luennoissa vielä hieman tarkemmin Matlabin käyttöön yhtälöryhmien ratkaisemisessa ja erilaisten matriisihajotelmien muodostamisessa. Todetaan kuitenkin vielä, että matriisi saadaan pelkistettyyn porrasmuotoon komennolla rref (reduced row echelon form). 20
21 >>rref(a) >>rref([a b]) >>rref([a eye(3)]) Homogeeninen yhtälöryhmä Ax = 0 voidaan ratkaista komennolla null. >> null(ones(3)) Lopuksi vielä hieman lineaarialgebrasta tuttuja käsitteitä: >>rank(a) % matriisin aste 3 >>det(a) % determinantti 5 >>karak = poly(a) % karakteristisen polynomin kertoimet karak = >>roots(karak) % ominaisarvot = karakteristisen polynomin juuret 21
22 i i Matriisin ominaisarvojen ja -vektoreiden (eigenvalue, eigenvector) laskemiseksi on komento eig: >>lambda = eig(a) % ominaisarvot pystyvektorina lambda = i i Jos funktion eig paluuarvo ohjataan kahteen argumenttiin, on ensimmäisessä matriisissa ominaisvektorit sarakkeina ja toisessa ominaisarvot diagonaalina. Ominaisvektorit on skaalattu niin, että niiden euklidinen normi on yksi. >>[V, D] = eig(a) V = i i i i D = i i >>norm( V(:,1) ) >>[norm(v(:,1), 1) norm(v(:,1), inf)] % muita normeja
23 MATEMAATTISET OHJELMISTOT Syksy 2012 Matlab-luennot, 2. osa Sisältö 1 Grafiikkaa Kaksiulotteista grafiikkaa Kolmiulotteista grafiikkaa Funktioiden kuvaajien piirtäminen Kuvien muokkaus Matlab-ohjelmoinnista Skriptit Funktiot Funktion argumenteista Funktiokahvoista Operaattorit Vertailuoperaattorit Loogiset operaattorit Ohjausrakenteita Valintarakenteet Toistorakenteet Vektorointi ja allokointi Grafiikkaa Matlabissa on hyvin tehokkaat ja monipuoliset grafiikkaominaisuudet. Seuraavassa käsitellään Matlabin kaksi- ja kolmeulotteisen grafiikan peruskomennot -ja työkalut. Vain ohimennen tullaan sivuamaan Matlabissa olevia erilaisia graafisella käyttöliittymällä varustettuja visualisointityökaluja, esim. plottools. Näihin voit tutustua itsenäisesti, vaikkapa piirtämällä visualisointityökaluja käyttäen tässä luennossa esimerkkeinä olevat kuvat. Kahvojen käyttöä grafiikassa (ns. Handle Graphics) käsitellään vain hyvin lyhyesti. 1
24 1.1 Kaksiulotteista grafiikkaa Matlabin peruspiirtokäsky 2D-kuville on plot. Yksinkertaisimmillaan käskyllä plot(y) voidaan piirtää vektorin y arvot niin, että x-akselilla on vektorin indeksit. Jos argumentteina on kaksi vektoria, piirtää komento plot(x,y) vektoreista x ja y pisteet (x(i), y(i)) ja yhdistää ne viivalla toisiinsa. Kuvassa 1 oleva murtoviiva saadaan seuraavasti: >> x = [ ]; >> y = [ ]; >> plot(x, y) Kuva 1: Matlab piirtää kuvaajan erilliseen kuvaikkunaan (figure window). Jos nyt piirretään uusi kuvaaja esimerkiksi jostain toisesta funktiosta, tulee kuvaaja äsken avautuneeseen kuvaikkunaan vanhan kuvaajan tilalle. Samalla tavalla voidaan piirtää myös sileitä kuvaajia kunhan x-hilaa ensin tihennetään. Toisena esimerkkinä piirretään kosinifunktion kuvaaja välillä [0, 2π] (kts. Kuva 2): >>x = 0:pi/100:2*pi; >>y = cos(x); >>plot(x, y) Lisätään vielä akseleille nimet ja kuvalle otsikko. Näidenkin komentojen tulos tulee sillä hetkellä auki olevaan kuvaikkunaan. Huomaa, että Matlab osaa joukon TEX-komentoja kreikkalaisia aakkosia varten, kuten tässä \pi. >>xlabel( x = 0:2\pi ) >>ylabel( y = cos(x) ) >>title( Kosinin kuvaaja, Fontsize, 12) Samaan kuvaan voidaan piirtää useampia kuvaajia samalla plot-käskyllä. Tämä tapahtuu laittamalla plot-käskyyn pareittain piirrettäviä datoja vastaavat vektorit x ja y-koordinaattien arvoiksi. Seuraavassa piirretään kosinifunktion lisäksi sinifunktio ja sin(2x 1) samaan kuvaan. 2
25 1 Kosinin kuvaaja y = cos(x) x = 0:2π Kuva 2: cos(x) sin(x) sin(2x 1) Kuva 3: >>y2 = sin(x); >>y3 = sin(2*x-1); >>plot(x, y, x, y2, x, y3) Komennolla legend voidaan lisätä selitteet kullekin kuvaajalle (kts. Kuva 3): >>legend( cos(x), sin(x), sin(2x-1) ) Yleisemmin plot(x, y) voidaan korvata komennolla plot(x, y, merkkijono), missä merkkijono voi sisältää korkeintaan kolme merkkiä, jotka säätävät piirtoväriä, -merkkiä ja viivatyyliä. Nämä ns. optiot lisätään heittomerkeissä plotkäskyyn piirrettävien datojen jälkeen. Tarkempia tietoja optioista käskyllä help plot. Piirretään esimerkkinä edellinen kuva niin, että kosinifunktio piirretään yhtenäisellä viivalla -, sinifunktio pisteviivalla : ja funktiosta sin(2x 1) piirretään vain datapisteet tähdellä *. Edelleen kaikki kuvaajat piirretään mustalla värillä k. Tulos on Kuvassa 4. >>plot(x, y, k-, x, y2, k:, x, y3, k* ) >>legend( cos(x), sin(x), sin(2x-1) ) 3
26 1 0.8 cos(x) sin(x) sin(2x 1) Kuva 4: Edellä olevat kuvat voitaisiin piirtää myös plottools-työkalua käyttäen niin, että muodostettaisiin ensin vektori x x-akselin arvoja varten. Tämän jälken komennettaisiin plottools ja ryhdyttäisiin Plot Browser-ikkunan avulla lisäämään dataa y-akselia varten. Voitaisiin myös muodostaa komentorivillä y-akselin data vektoriin y ja valita vektorit hiirellä Workspace-ikkunasta (CTRL + hiiren vasen nappi), jonka jälkeen hiiren oikeaa nappia painamalla saadaan näkyviin erilaisia piirtovaihtoehtoja. Edelleen, plot-komennolle voidaan antaa myös matriisiargumentteja. Jos x on m-vektori ja Y on m n-matriisi, niin plot(x, Y) piirtää samaan kuvaan jokaisen Y:n sarakkeen arvot, kun x-akselilla on x:n arvot. Vastaavasti, jos X ja Y ovat molemmat m n-matriiseja, niin plot(x, Y) piirtää samaan kuvaan X:n ja Y:n sarakkeista saatavat kuvat (kts. Kuva 5). Komento plot(y) taas piirtää Y:n sarakkeet niin, että x-akselilla on matriisin indeksit (kts. Kuva 6). >> X = [1:3; 4:6; 7:9]; >> Y = magic(3) Y = >> plot(x, Y) >> plot(y) Jos piirrettävä data on kompleksista, niin Matlab ei huomioi imaginääriosaa, vaan se piirtää vain reaaliosat. Kuitenkin, jos plot-käskylle annetaan vain yksi argumentti, jonka sisältämä data on kompleksista, piirtää Matlab kuvaajan, jossa on reaaliosa x-akselilla ja imaginääriosa y-akselilla. Jos halutaan piirtää olemassaolevaan kuvaikkunaan niin, ettei siinä jo oleva kuvaaja tuhoudu, voidaan käyttää komentoa hold on. Pito saadaan pois päältä komennolla hold off. Esim. >> plot(sin(x)) >> hold on >> plot(cos(x)), hold off 4
27 Kuva 5: Kuva 6: Kuva 7: 5
28 1 cos(x) 1 sin(x) sin(2x 1) 1 cos(2x 1) Kuva 8: piirtää sinin ja kosinin kuvaajat samaan kuvaikkunaan (kts. Kuva 7). Komennolla figure voidaan puolestaan avata uusi kuvaikkuna. Edelleen komennolla figure(n) voidaan määrätä, että piirtäminen tapahtuu kuvaikkunaan numero n (tämä saadaan aikaan myös klikkaamalla ko. kuvaikkunaa). Jos auki on useampia kuvaikkunoita, niin oletuksena Matlab piirtää siihen ikkunaan, johon on viimeksi piirretty tai jota on viimeisimmäksi klikattu. Komento clf tyhjentää sen hetkisen kuvaikkunan. Komennolla close suljetaan sen hetkinen kuvaikkuna ja close all sulkee kaikki kuvaikkunat. Samaan kuvaikkunaan voidaan piirtää useampia erillisä osakuvaajia komennolla subplot(m,n,p). Komento jakaa kuvaikkunan m n matriisiksi ja valitsee siitä akseliston p, johon kuva piirretään jollain piirtokomennolla (esim. plot). Osakuvat (akselistot) numeroidaan kuvan ylärivistä lähtien, vasemmalta oikealle. Esimerkkinä neljän eri trigonometrisen funktion kuvaajat on piirretty samaan kuvaikkunaan Kuvassa 8. >>y4 = cos(2*x-1); >>subplot(2,2,1); plot(x,y), title( cos(x) ) >>subplot(2,2,2); plot(x,y2), title( sin(x) ) >>subplot(2,2,3); plot(x,y3), title( sin(2x-1) ) >>subplot(2,2,4); plot(x,y4), title( cos(2x-1) ) Matlabin axis-komennolla voidaan muuttaa kuvan akseleiden skaalausta ja ulkonäköä. Esimerkiksi komennolla axis([xmin xmax ymin ymax]) muutetaan akseleiden rajat käyttäjän haluamaksi sen sijaan, että Matlab määräisi ne piirrettävän datan perusteella. Usein halutaan säilyttää akseleiden skaalaus samana, kun piirretään samaan kuvaan peräkkäin useampia kuvaajia. Komennolla axis manual voidaan pitää sen hetkinen akseleiden skaalaus käytössä, komennolla axis auto palautetaan automaattinen skaalaus käyttöön. axis tight asettaa skaalauksen tarkalleen piirrettävän datan määräämälle välille. Komennolla axis equal asetetaan puolestaan x- ja y-akseleiden askelväli samaksi ja axis square tekee akseleista yhtä pitkiä. Komento axis normal kumoaa komentojen axis square ja axis equal vaikutuksen. Edelleen axis off poistaa akselit kuvasta ja 6
29 8 x Kuva 9: Kuva 10: axis on palauttaa ne näkyviin. axis-komento laajenee luonnollisella tavalla 3Dkuviin, esimerkiksi axis([xmin xmax ymin ymax zmin zmax]). Yhden akselin skaalausta voidaan säädellä komennoilla xlim, ylim ja zlim. Muita komentoja kuvien muokkaamiseen ovat mm. grid on ja grid off, joilla saadaan kuvaan ruutuverkko näkyviin tai siitä pois. Piirretään seuraavassa funktion 1 f (x) = (x 1) (x 2), 0 x 3 2 kuvaaja, kts. Kuva 9: >> x = linspace(0, 3, 500); % luo 500 pisteen x-hilan välille [0,3] >> plot(x, 1./(x-1).ˆ2 + 3./(x-2).ˆ2) % Huomaa alkioittaisuus >> grid on Pisteissä x = 1 ja x = 2 olevien singulariteettien takia kuva ei anna juurikaan informaatiota funktiosta, mutta rajoittamalla lisäkomennolla ylim([0 50] y-akselin skaalausta saadaan huomattavasti mielenkiintoisempi kuvaaja, kts. Kuva 10. 7
30 Edellä olivat jo xlabel, ylabel, title ja legend, näiden lisäksi voidaan text-komennolla lisätä tekstiä mihin tahansa kohtaan kuvassa (kts. Kuva 11): >>x = 0:pi/100:2*pi; y = cos(x); plot(x, y) >>axis tight square >>grid on >>text(4, -0.8, Kosinin kuvaaja ) Kosinin kuvaaja Kuva 11: Yllä mainitut kuvan muokkaukset voidaan tehdä myös kuvaikkunassa käyttämällä esim. Edit-, Insert- ja Tools-valikoista löytyviä käskyjä. Jos kuvaa muokataan runsaasti kuvaikkunassa, niin valmiista tuloksesta voidaan generoida myöhempää käyttöä varten M-tiedosto File-valikon Generate M-File-komennolla. Tätä M-tiedostoa käyttäen voidaan myöhemmin piirtää asetuksiltaan samanlainen kuva eri datoilla. Edelleen, kuva voidaan tallettaa kuvatiedostoksi valitsemalla kuvaikkunan File-valikosta Save As.... Muita peruspiirtokomentoja ovat mm. loglog, semilogx, semilogy, joilla voidaan piirtää kuvaajia logaritmisilla akselistoilla, katso helpeistä lisätietoa. 1.2 Kolmiulotteista grafiikkaa Komennolla plot3 voidaan puolestaan piirtää kolmiulotteisia avaruuskäyriä, joten se on plot-komennon kolmiulotteinen vastine. Kuva 12 saadaan seuraavasti: >> t = -5 : : 5; >> x = (1 + t.ˆ2).*sin(20*t); >> y = (1 + t.ˆ2).*cos(20*t); >> z = t; >> plot3(x, y, z) >> grid on >> xlabel( x(t) ), ylabel( y(t) ), zlabel( z(t) ) Kolmiulotteisten pintakuvien piirtämiseen Matlabissa on kaksi peruskomentoa: mesh ja surf. Molemmilla voidaan piirtää z-koordinaateilla määrätty pinta 8
31 5 z(t) y(t) x(t) Kuva 12: x y -tasossa olevan hilan yläpuolelle. Komentojen ero on se, että mesh-komento piirtää datapisteiden lisäksi pisteitä yhdistävät viivat, joten tuloksena on rautalankakuva (wireframe) piirrettävästä pinnasta. surf näyttää rautalankakuvan lisäksi pisteitä yhdistettäessä syntyvät pinnat. Piirretään seuraavaksi funktion f (x, y) = 2 sin x cos y, x, y [0, 2π] pintakuva. Pintakuvien piirtämisessä on meshgrid-komento erittäin hyödyllinen, sillä voidaan helposti luoda piirtämisessä tarvittava hila: >>[x, y] = meshgrid(0:pi/20:2*pi); Tällä komennolla saatiin vektorista 0:pi/20:2*pi tehtyä matriisit x ja y, joita voidaan käyttää argumentteina komennoille mesh ja surf: >>z = 2.*sin(x).*cos(y); >>mesh(x, y, z) Näin saatiin kuvassa 13 oleva rautalankakuva. Kuvassa 14 oleva pintakuva saadaan puolestaan komennolla: >>surf(x, y, z) Pintakuviin voidaan lisätä akseleiden nimiä, otsikoita, tekstiä, selitteitä yms., samoilla komennoilla kuin 2D-kuviinkin. Lisäksi pintakuvien ominaisuuksia, esim. pinnan väritystä ja valaistusta, voidaan säätää omilla komennoillaan. Muokkaukset ja kuvien piirtämisen voi 3D-kuvissakin tehdä plottoolsilla ja kuvaikkunan valikoista löytyvillä komennoilla. Muokataan edellä piirrettyä pintakuvaa hieman erilaisilla asetuksilla (kts. Kuva 15): >>surf(x, y, z, FaceColor, green, EdgeColor, none ); >>camlight left; lighting phong, view(-40, 60) >>axis off 9
32 Kuva 13: Kuva 14: 1.3 Funktioiden kuvaajien piirtäminen Edellä on piirretty kuvaajia käyttämällä Matlabin peruspiirtokomentoja. Peruspiirtokomennot ovat käteviä, kun piirretään jotain numeerista dataa, esimerkiksi mittaustuloksia. Funktioiden kuvaajien piirtämiseen Matlabissa on kuitenkin näppärämpiäkin tapoja kuin esimerkiksi plot-komento. Esimerkiksi komennolla ezplot(f, [a,b]) voidaan piirtää funktion f = f (x) arvot välillä a < x < b. Jos tätä piirtoväliä ei anneta käytetään oletusarvoisesti väliä 2π < x < 2π. Piirrettävä funktio annetaan lausekkeena (esim. ezplot( sin(x) )), määrittelemällä se inline-funktioksi (f = inline( sin(x) ); ezplot(f)) tai annetaan funktio funktiokahvana (function handle) ät-merkillä (ezplot(@sin)). Funktiokahvoista myöhemmin lisää. ezplot-komennolla voidaan helposti piirtää myös esim. implisiittisesti määriteltyjä kuvaajia ja parametrisoituja käyriä. Lisäksi Matlabissa on omat ez-komentonsa mm. napakoordinaatistossa piirrettäville kuvaajille (ezpolar) sekä pintakuville (ezsurf ja ezmesh) ja tasa-arvokäyrille (ezcontour). Lisätietoa mm. komennoilla help ezplot ja lookfor ez. Edelleen funktioiden piirtämiseen on komento fplot, ks. help fplot. Kuva 16 saadaan piirrettyä seuraavilla käskyillä: 10
33 Kuva 15: >>subplot(1,3,1); ezplot( sin(t), sin(t)*cos(t), [0,pi]) >>axis square >>subplot(1,3,2); ezpolar( cos(2*t) ) >>subplot(1,3,3); ezcontour( 2*sin(x)*cos(y), [0,2*pi]) >>axis tight square y x = sin(t), y = sin(t) cos(t) x r = cos(2 t) y sin(x) cos(y) x Kuva 16: 1.4 Kuvien muokkaus Palataan vielä ensimmäiseen esimerkkiimme eli Kuvaan 1. Joitakin kuvan ominaisuuksia, kuten viivanleveyttä ja piirtomerkin kokoa, voidaan piirtämisen yhteydessä muokata antamalla lisäargumentteja plot-komennolle ja useille muillekin komennoille (kts. esimerkiksi kuinka Kuvaa 15 muokattiin). Kasvatetaan seuraavaksi viivanleveyttä arvoon 3 pt (oletus 0.5 pt) ja piirtomerkin kokoa arvoon 5 pt (oletus 6 pt), missä pt (point, piste) on 1/72 tuumaa. Tulos on Kuvassa 17. >> x = [ ]; 11
34 >> y = [ ]; >> plot(x, y, m--ˆ, LineWidth, 3, MarkerSize, 5) Kuva 17: Kuten edellä on nähty, kuvien ominaisuuksia voi Matlabissa muokata joko käyttämällä kuvaikkunan valikoita tai komentoriviltä käsin. Joskus on tarpeen muokata kuvaa piirtämisen jälkeen tai tehdä sellaisia kuvia, etteivät Matlabin peruskomennot riitä. Tällöin pitää yleensä muokata Matlabin grafiikkaobjekteja. Piirtokomentoja käytettäessä Matlab muodostaa kuvaajan käyttämällä erilaisia grafiikkaobjekteja, kuten viivoja, tekstiä, valoa ja pintoja. Kullakin objektilla on ominaisuuksia, joilla säädellään objektin ulkonäköä ja käyttäytymistä. Kun Matlab luo jonkin objektin, siihen liitetään tunnus (kutsutaan jälleen kahvaksi), jonka avulla voidaan objektin ominaisuuksiin päästä käsiksi. Puhutaan ns. Handle Graphicsista. Objektin jonkin ominaisuuden sen hetkisen arvon saa selville get-käskyllä ja arvoa voi muuttaa set-käskyllä. Objekteilla on keskinäinen hierarkiansa, esimerkiksi viivaobjekti on hierarkiassa akseliobjektin alapuolella, joten akseliston on oltava määritelty ennenkuin voidaan piirtää viiva. Seuraavassa piirretään sinifunktion kuvaaja ja saadaan muuttujaan kuva kahva kuvaan. Komennolla get nähdään LineWidth-ominaisuuden arvo ja setkomennolla muutetaan viivan paksuutta, tulos on Kuvassa 18. Objektin kaikki sen hetkiset ominaisuudet nähdään kirjoittamalla get(kuva). Objektin ominaisuuksia voidaan muuttaa myös piirtokäskyssä (ei kuitenkaan kaikissa piirtokäskyissä) eli nyt esimerkiksi käskyllä plot(x, y, LineWidth, 2.0) olisi saatu aikaan sama tulos. Erona näillä tavoilla on se, että get/set-menetelmällä voidaan kuvaa muokata sen piirtämisen jälkeen eli itse piirtämistä ei tarvitse toistaa uudestaan. >>x = 0:pi/100:2*pi; y = sin(x); >>kuva = plot(x,y); >>get(kuva, LineWidth )
35 >>set(kuva, LineWidth, 2.0) Kuva 18: Muita objektien käsittelykomentoja ovat mm. copyobj, delete ja findobj. Näillä voidaan kopioida ja tuhota objekteja sekä etsiä kahva objekteihin, joilla on tietty arvo. Edelleen komennot gca, gcf ja gco palauttavat kahvat sen hetkiseen akselistoon, kuvaan ja objektiin. Esimerkkinä muutetaan Kuvassa 4 tähdet punaisiksi rasteiksi ja saadaan Kuva 19. >>x = 0:pi/100:2*pi; >>y = cos(x); y2 = sin(x); y3 = sin(2*x-1); >>plot(x, y, k-, x, y2, k:, x, y3, k* ) >>set(findobj( Type, line, Marker, * ), Marker, x,... Color, red ) Kuva 19: 13
36 2 Matlab-ohjelmoinnista Seuraavaksi alamme tutustumaan Matlab-ohjelmoinnin perusteisiin. Matlabissa ohjelmat kirjoitetaan M-tiedostoiksi (M-files). M-tiedostot ovat MATLAB-koodia sisältäviä tekstitiedostoja, joiden tiedostopääte on.m. M-tiedosto suoritetaan kirjoittamalla komentoikkunaan tiedoston nimi. M-tiedostoa tiedosto.m voidaan siis ajatella Matlab-komentona, jonka nimi on tiedosto. M-tiedostoja on kahta tyyppiä: skriptejä ja funktioita. 2.1 Skriptit Skripti (script) on joukko Matlab-komentoja, jotka suoritetaan, kun kyseistä M- tiedostoa kutsutaan. Skriptillä ei ole lainkaan argumentteja ja se käyttää työtilassa (Workspace) olevia muuttujia. Skripti käyttää siis työtilassa oleva dataa ja skriptissä laskettu tai muodostettu data sekä muuttujat jäävät myös työtilaan. Esimerkiksi, voidaan kirjoittaa Matlab-skripti sini_kuva.m, joka piirtää sinin kuvaajan. Komennolla edit sini_kuva avataan tekstieditori (yleensä Matlabin oma editori), ja kirjoitetaan komennot: x = 0:pi/100:2*pi; y = sin(x); plot(x,y) legend( sin(x) ) Tiedoston tallettamisen jälkeen komennolla sini_kuva skripti suoritetaan ja Matlab piirtää kuvan. Skriptin suorittamisen jälkeen siinä määritellyt muuttujat ovat käytettävissä työtilassa (kts. whos). 2.2 Funktiot Skripteistä poiketen, funktiolle (function) voidaan sen sijaan antaa syötteenä argumentteja (input) ja se (yleensä) palauttaa jonkin arvon tai useita arvoja suorituksensa jälkeen (output). Funktion sisäiset muuttujat ovat oletusarvoltaan lokaaleja eli ne ovat käytettävissä vain funktion sisällä, eivät työtilassa kuten skriptin tapauksessa. Komennolla type voidaan komentoikkunassa tulostaa jonkin M-tiedoston sisältö, ja komennolla what nähdään luettelo sen hetkisen hakemiston M-tiedostoista. Tulostetaan Matlabin valmisfunktion trace sisältö: >>type trace function t = trace(a) %TRACE Sum of diagonal elements. % TRACE(A) is the sum of the diagonal elements of A, which is % also the sum of the eigenvalues of A. % % Class support for input A: % float: double, single 14
37 % Copyright The MathWorks, Inc. % $Revision: $ $Date: 2007/11/01 12:38:53 $ if (ndims(a)==2 && size(a,1)==size(a,2)) error( MATLAB:square, Matrix must be square. ); end t = sum(diag(a)); Tulostuksesta nähdään, että trace.m on funktiotyyppinen M-tiedosto. Funktion ensimmäinen rivi alkaa aina avainsanalla function, jonka jälkeen tulee funktion paluuarvojen määrittely (tässä t), funktion nimi, joka on sama kuin M-tiedoston nimi (nyt trace) sekä suluissa funktion argumentit (tässä A). Ensimmäiseltä riviltä nähdään myös funktion paluuarvojen ja argumenttien keskinäinen järjestys, jos niitä on useampia kuin yksi. Jos funktiolla on useampia paluuargumentteja, niin ne laitetaan hakasulkujen sisään pilkulla erotettuna. Jos funktiolla ei ole paluuarvoja, laitetaan joko tyhjät hakasulut tai jätetään paluuarvon määrittely pois, esim. function funktio(x) tai []=funktio(x). Ensimmäisen rivin jälkeen on yleensä yksi tai useampia kommenttirivejä ennen ensimmäistä suoritettavaa käskyä. Nämä kommenttirivit nähdään, kun help-käskyllä kysytään tietoa jostain komennosta. Ensimmäinen kommenttirivi on ns. H1-rivi, sen teksti nähdään, kun etsitään tietoa lookfor-komennolla tai käytetään help-käskyä johonkin hakemistoon, esim. help graph2d. Kommenttirivien jälkeen tulee varsinainen funktion runko, jossa on suoritettavat lauseet sekä mahdollisia kommenttirivejä. Ensimmäisen tyhjän rivin tai suoritettavan käskyn jälkeiset kommenttirivit eivät näy help-käskyllä. Yllä olevassa funktiossa paluuarvo määräytyy (virheentarkistusten jälkeen), kun muuttujaan t sijoitetaan arvo sum(diag(a)). Funktiossa määritellyt muuttujat ovat siis lokaaleja, joten nyt muuttujat t ja A eivät näy funktion ulkopuolella työtilassa, ainoastaan funktion omassa, sisäisessä työtilassa. Funktioissa määriteltyjä muuttujia koskevat samat säännöt ja rajoitukset kuin Matlabin komentorivikäytössä määriteltyjä muuttujia. Funktioissakaan ei tarvitse muuttujien kokoa tai tyyppiä määritellä. Kannattaa huomata, että ei ole syytä käyttää muuttujalle nimeä, joka on jo käytössä jonkin funktion nimenä. Tämä siitä syystä, että tällöin nimi viittaa muuttujaan eikä samannimiseen funktioon. Jotta funktiota voi taas käyttää, täytyy päällekkäinen muuttuja poistaa clear-käskyllä. Muuttujia voidaan määritellä globaaleiksi avainsanalla global. Tällöin kyseinen muuttuja on käytössä, sekä funktion työtilassa, että siellä missä muuttuja määritellään globaaliksi (esim. muut funktiot ja perustyötila). Tutkitaan klassista Lotka-Volterran peto-saalis -mallia. Olkoon y 1 =saalispopulaation tiheys ja y 2 =petopopulaation tiheys. Tällöin malliksi muodostuu yhtälöpari dy 1 = y 1 αy 1 y 2 dt dy 2 = y 2 + βy 1 y 2. dt Tehdään M-tiedosto lotka2.m, jossa on kyseiset differentiaaliyhtälöt. Globaaleiksi muuttujiksi asetetaan mallin vuorovaikutuskertoimet α ja β. 15
38 function yp = lotka2(t, y) % LOTKA Lotka-Volterran saalis-peto -malli global ALPHA BETA yp = [y(1) - ALPHA*y(1)*y(2); -y(2) + BETA*y(1)*y(2)]; Komentoikkunassa voidaan määritellä globaalit muuttujat arvoineen: >>global ALPHA BETA >>ALPHA = 0.01; >>BETA = 0.02; Nyt kertoimien α ja β arvot vaikuttavat myös funktioon lotka2.m. Ratkaistaan differentiaaliyhtälö komennolla ode23 numeerisesti yo. kertoimien arvoilla ja piirretään kuva. >>[t, y] = ode23( lotka2, [0 30], [1; 1]); >>plot(t,y(:,1), k-,t,y(:,2), k: ) >>legend( saalis, peto ), title( Lotka-Volterra ) Lotka Volterra saalis saalistaja Kuva 20: Matlabissa voi määritellä myös pysyviä muuttujia (persistent variables) avainsanalla persistent. Pysyviä muuttujia voi määritellä ainoastaan funktioissa, eikä pysyvän muuttujan arvoa pyyhitä muistista funktiosta poistumisen jälkeen. Pysyvät muuttujat eroavat globaaleista muuttujista siinä, että muut funktiot tai työtila eivät voi niitä käyttää. Pysyville muuttujille on käyttöä lähinnä silloin, kun halutaan että jonkin muuttujan arvo säilyy funktion kutsukertojen välillä, mutta ei haluta määritellä sitä globaaliin työtilaan. Matlabissa voidaan myös tehdä anonyymejä funktioita. Anonyymien funktioiden avulla voidaan muodostaa helposti yksinkertaisia funktioita niin, ettei niistä tarvitse tehdä M-tiedostoa. Anonyymeja funktioita voi luoda joko komentorivillä, M-tiedostossa olevassa funktiossa tai skriptissä. Syntaksi anonyymin funktion muodostamiselle on funktio_kahva lauseke Esim. yksinkertainen lineaarinen kuvaus x 2x + 1 tehdään näin: 16
39 >>f f Sitä voi nyt kutsua tavallisen funktion tavoin, esim. >>f(2) Funktion argumenteista Komennoilla nargin ja nargout voidaan selvittää monellako input- ja output-argumentilla funktiota on kutsuttu. Jos funktiolle halutaan antaa merkkijono argumentiksi, on se laitettava heittomerkkien sisään. Matlab-funktiolle voidaan antaa merkkijonoja argumentteina myös ilman, että ne ovat heittomerkkien sisällä. Esimerkiksi legend sin(x) cos(x) on sama komento kuin legend( sin(x), cos(x) ). Kun tätä muotoa käytetään, ei funktio voi palauttaa tulosargumenttia. Tässä on itse asiassa kyse ns. funktio/komento -dualiteetista eli siitä, että Matlabissa on kaksi eri kutsusyntaksia funktioille: funktiosyntaksi ja komentosyntaksi. Funktiosyntaksi on muotoa >>[tulos1, tulos2,..., tulosn] = funktio(arg1, arg2,..., argn) Komentosyntaksilla funktiokutsu on >>funktio arg1 arg2... argn On siis huomattava, ettei komentosyntaksilla kutsuttaessa voida funktion paluuarvoja sijoittaa muuttujiin. Funktiosyntaksi välittää argumentin arvon, kun taas komentosyntaksilla välitetään argumentti merkkijonona. 2.4 Funktiokahvoista Haluttaessa välittää funktiolle jokin toinen funktio argumentiksi, käytetään funktiokahvaa (function handle). Kun funktiokahva on välitetty funktiolle argumenttina, voidaan sen funktion, johon kahva viittaa, arvoja laskea feval-komennon avulla. Funktiokahva muodostetaan funktion nimen eteen. Tehdään kahva Matlabin valmisfunktioon humps >>fkahva Tehdään funktio kahavan_piirto, jossa käytetään komentoa feval laskemaan funktion arvoja. Komento feval käytettäessä annetaan sille ensimmäiseksi argumentiksi funktiokahva ja loput argumentit ovat ne, jotka välitetään itse funktiolle. Tiedoston kahavan_piirto.m sisältö: 17
40 function kahavan_piirto(kahava, data) plot(data, feval(kahava, data)) Piirretään kuva tällä funktiolla ja etsitään funktion lokaali minimi Matlabin valmisfunktiolla fminsearch. Minimin etsinnässä alkuarvona on x = 0.5. Tässä on siis hyvä huomata, että useat Matlabin valmisfunktiotkin käyttävät kahvoja argumentteinaan. >>kahavan_piirto(fkahva, 0:0.001:1.5) >>minimi = fminsearch(fkahva, 0.5) minimi = Kuva 21: Etsitään vielä funktion humps nollakohta. Esimerkin vuoksi käytetään anonyymia funktiota. Kopioidaan tiedostosta humps.m funktion määrittely ja tehdään anonyymi funktio anon: >>anon (1./ ((x-.3).ˆ2 +.01) + 1./ ((x-.9).ˆ2 +.04) -6); Anonyymi funktio on samalla funktiokahva, joten sitä voidaan käyttää argumenttina funktiolle fzero, jonka avulla etsitään yksi juuri lähtien liikkeelle pisteestä x = 1: >>fzero(anon, 1.0) Operaattorit Matlabin operaattorit jakaantuvat kolmeen luokkaan: aritmeettiset, vertailu- ja loogiset operaattorit. Aritmeettiset operaattorit on jo esitelty edellä. 18
41 2.5.1 Vertailuoperaattorit Vertailuoperaattoreita ovat <, <=, >, >=, == ja =, joista viimeinen tarkoittaa erisuuruutta. Matlabin vertailuoperaattorit tekevät vertailun alkioittain, ja molempien operandien on oltava samankokoisia ellei toinen ole skalaari. Esimerkiksi, jos halutaan testata, ovatko kaksi matriisia samat, on käytettävä funktiota isequal, sillä == palauttaa vain ne alkiot, joissa matriisien alkiot ovat yhtäsuuria. >>A = [ 1 2 3; 4 5 6;]; B = [1 2 4; 5 3 6]; >>A == B >>isequal(a, B) 0 Huomaa, että yllä vertailuoperaattori == ja funktio isequal palauttavat tyyppiä logical olevan arvon, joka voi olla 0 tai Loogiset operaattorit Loogisia operaattoreita on Matlabissa itseasiassa kolmea tyyppiä, mutta esittelemme tässä niistä vain alkioittaiset loogiset operaattorit. Kaksi muuta tyyppiä ovat loogiset bittioperaattorit (esim. bitand) ja ns. oikosulkuoperaattorit (shortcircuit operators) && ja skalaarien vertailuun. Alkioittaisia loogisia operaattoreita ovat & ja tai ei, negaatio xor poissulkeva tai Näitä käytettäessä Matlab tekee loogiset operaatiot alkioittain ja jälleen on vaatimuksena (poikkeuksena ), että taulukot ovat saman kokoisia tai jompikumpi on skalaari. Huomaa, että myös loogiset operaattorit palauttavat tyyppiä logical olevan arvon. >>A = [ ]; >>B = [ ]; >>A & B >>A B >> A 19
42 >>xor(a,b) Matriiseille ja vektoreille tehtäviä loogisia operaatioita varten on myös funktiot any ja all. Nämä eivät toimi alkioittain, vaan ne kertovat, onko jokin tai kaikki alkiot erisuuria kuin nolla. Matriisin tapauksessa ne toimivat sarakkeittain. >> A = [1 2 0; 4 0 6] A = >>any(a) >>all(a) Lisäksi on funktio find, joka etsii matriisista ne indeksit, jotka toteuttavat annetun ehdon. 2.6 Ohjausrakenteita Valintarakenteet Valintarakenteista esitellään ensiksi if. Yhdessä else ja elseif avainsanojen kanssa, voidaan if-lauseen avulla muodostaa erilaisia ehdollisia rakenteita. iflause päättyy aina avainsanaan end. Alla on esimerkki if-rakenteesta. if n < 0 error( Luvun oltava positiivinen ); elseif rem(n,2) == 0 tulos = n/2; else tulos = (n+1)/2; end Jos ensimmäinen if on tosi, tulostetaan virheilmoitus ja poistutaan if-lauseesta. Muuten jatketaan seuraavaan elseif-osaan, ja jos sen ehto on tosi, suoritetaan siinä määritelty lasku, jos ehto ei ole voimassa, jatketaan eteenpäin. Lopulta päädytään aina else-osaan tai jos sellaista ei ole määritelty, poistutaan if-rakenteesta, jos mikään ehdoista ei toteudu. if-lauseita voi olla myös useampia sisäkkäin. Jos ehtolauseen ehdossa on ei-skaalari, esimerkiksi matriisi, on sen kaikkien alkioiden toteutettava ehto. Toisaalta, jos ehdossa on tutkittavana tyhjä matriisi on tuloksena aina epätosi. 20
43 Toisella valintarakenteella eli switch-lauseella suoritetaan joukko lauseita sen perusteella, minkä arvon jokin muuttuja tai lauseke saa. switch-lauseeseen kuuluvat myös avainsanat case ja otherwise, joilla esitetään eri tapaukset. Ainoastaan ensimmäinen tapaus, joka on tosi suoritetaan tai jos sellaista ei löydy, suoritetaan mahdollinen otherwise-osa. Myös switch-rakenne on aina päätettävä avainsanaan end. Yhdessä case-osassa voi olla myös useampia ehtoja. switch n case {-1,1} disp( yksi ); case 0 disp( nolla ); otherwise disp( muu luku ) end Toistorakenteet Matlabin perustoistorakenteella eli for-silmukalla voidaan suorittaa joukko lauseita ennaltamäärätty määrä kertoja. Silmukka päättyy aina end-avainsanaan, ja se on muotoa for indeksi = alkuarvo: askel: loppuarvo lauseet end Jos indeksin askelta ei aseta niin se saa oletusarvon yksi (vrt. kaksoispisteoperaattori). Silmukan suoritus loppuu, kun indeksin arvo ylittää loppuarvon tai negatiivisella askelpituudella alittaa loppuarvon. Esimerkiksi vektorin kukin alkio voidaan neliöidä seuraavasti: m = 10; a = 1:m; for i = 1:m a(i) = a(i)ˆ2; end >>a a = Toistorakenteet voivat esiintyä myös sisäkkäin. Esimerkkinä funktio luuppaa, joka asettaa matriisin kaikki alkiot käymällä ne yksi kerrallaan läpi: function H = luuppaa(m,n) for i = 1:m for j = 1:n H(i,j) = 1/(i+j); end end 21
44 >>A = luuppaa(3,2) A = Toinen toistorakenne eli while-silmukka tekee joukolle lauseita ennaltamääräämättömän lukumäärän toistoja, kunnes jokin looginen ehto täyttyy. Esimerkkinä laskemme Newtonin menetelmällä luvun M eli etsimme funktion f (x) = x 2 M nollakohdan. Newtonin menetelmän iteraatio on x k+1 = x k f (x k), k = 0, 1, f (x k ) Koska f (x) = 2x, niin iteraatio saadaan lyhyempään muotoon x k+1 = 1 (x k + M ). 2 xk Tehdään tästä funktio alkuarvolla x 0 = 1. Toisto päätetään kun kaksi peräkkäistä iteraatiota ei enää eroa kovin paljoa toisistaan. function juuri = newt(m) x = 1; x_edel = 0; while abs(x - x_edel) > eps*abs(x) x_edel = x; x = 0.5*(x + M/x); end juuri = x; Lasketaan kokeeksi pari juurta: >>format long g >>a = newt(2) a = >>b = newt(3) b = Tarkistetaan vertaamalla Matlabin omaan sqrt-funktioon: >>abs(a-sqrt(2)), abs(b-sqrt(3)) e >>format short 22
45 Jos for- tai while-silmukassa on continue-lause, siirrytään suoraan silmukan seuraavalle kierrokselle. Sisäkkäisissä silmukoissa continue siirtää suorituksen sen silmukan seuraavalle kierrokselle, jonka sisällä se on. break-lause puolestaan keskeyttää for- tai while-silmukan suorituksen eli sillä poistutaan silmukan sisältä. Sisäkkäisissä silmukoissa breakilla siirrytään ulompaan silmukkaan. Komennolla return voidaan sen hetkisen käskyjonon suoritus keskeyttää ja siirtyä takaisin kutsuvaan funktioon tai jos funktiota kutsuttiin komentoikkunasta, niin palataan interaktiiviseen käyttötilaan. 2.7 Vektorointi ja allokointi Silmukoiden (for tai while) yhteydessä on syytä kiinnittää huomiota myös siihen, kuinka Matlab-koodin suoritusta voidaan nopeuttaa. Useimmiten on esimerkiksi hyvä pyrkiä käyttämään mahdollisimman paljon Matlabin sisäänrakennettuja nopeita vektori- ja matriisioperaatiota eli niin sanotusti vektoroida algoritmeja. Yksinkertainen esimerkki voisi olla esimerkiksi seuraava. Ensin for-silmukka: x = 1; for k = 1 : 10 y(k) = besselj(1,x); x = x + 1; end Tämä voidaan vektoroida yksinkertaisesti: >>x = 1 : 11; >>y = besselj(1, x); Edelleen silmukoiden ja samalla koko ohjelman suoritusta voidaan nopeuttaa allokoimalla etukäteen käytettävät vektorit ja matriisit. Esimerkiksi seuraavassa allokoidaan zeros-komennolla for-loopissa muodostettava vektori a. a = zeros(32,1); for n = 1:32 a(n) = rank(magic(n)); end Ilman allokointia (koon varausta) Matlab lähtisi liikkeelle skalaarista, jota laajennettaisiin yhdellä alkiolla aina jokaisella silmukan kierroksella, kunnes lopussa tuloksena olisi 32-alkioinen vektori. Nyt tämä tarpeeton ja mahdollisesti raskas vaihe jää for-silmukan suorituksesta pois. Omien ohjelmien suorituskykyä voi koettaa parantaa käyttämällä Matlabissa olevia, esimerkiksi editorin Tools-valikosta löytyviä, ohjelmien analysointityökaluja. Esimerkiksi Code Analyzer-työkalu kertoo yllä olevasta Besselin funktion arvoja vektoriin y laskevasta for-silmukasta, että vektori y kannattaisi allokoida valmiiksi. Yksinkertaisissa ohjelmissa hiemankin kokeneempi käyttäjä näkee tällaiset asiat yleensä itse, mutta laajoissa projekteissa analysointityökalut ovat hyödyllisiä. 23
46 MATEMAATTISET OHJELMISTOT Syksy 2012 Matlab-luennot, 3. osa Sisältö 1 Lineaarialgebraa Sisätulo ja normi Aliavaruuksia ja projektioita Matriisityyppejä Lineaarisen yhtälöryhmän ratkaiseminen Neliötapaus Ylideterminoitu tapaus Alideterminoitu tapaus Matriisihajotelmia LU-hajotelma QR-hajotelma Singulaariarvohajotelma ja pseudoinverssi Olemme jo nähneet, kuinka Matlabissa voidaan muodostaa matriiseja ja poimia matriisista yksittäisiä alkioita tai lohkoja. Lisäksi näytettiin, kuinka voidaan ratkaista lineaarinen yhtälöryhmä sekä laskea matriisin ominaisarvot. Tässä osassa perehdytään, Matlabia käyttäen, hieman lisää joihinkin lineaarialgebran ja matriisiteorian käsitteisiin. 1 Lineaarialgebraa 1.1 Sisätulo ja normi Kerrataan joitain käsitteitä lineaarialgebrasta. Tarkastellaan R- tai C-kertoimista vektoriavaruutta V, joka on varustettu sisätulolla (x, y), x, y V. Komento dot laskee sisätulon (x, y)= n j=1 x j y j, joten meille tutumpi avaruudenc n sisätulo saadaan joko laskemalla suoraanx*y tai komennolladot(x,y). Esim. 1
47 >>x = [1-2 2]; y = [2 4 2]; z = [2 + 3i 1 + 2i 1-3i]; >>dot(x, y), x*y, dot(x, z), x*z i i Tietyt ehdot täyttävä kuvaus : V Ron normi. Normeja ovat mm. 1/2 n n x 1 = x j, x 2 = x j 2, x = max x j. 1 j n j=1 Nämä normit ovat erikoistapauksia nk. p-normista 1/p n x p = x j p, 1 p<. j=1 j=1 Matlabin komentonorm laskee oletuksena tutun euklidisen normin 2, mutta se osaa laskee myös muutkin yllä olevat normit. Lisäksi norm laskee myös matriisinormeja, ks.help norm. >>norm(x), sqrt(x*x ) 3 3 >>norm(x,1), norm(x, inf), norm(x, 5) Vektorit x ja y ovat ortogonaaliset eli kohtisuorassa toisiaan vastaan, jos sisätulo (x, y) = 0. Sisätuloavaruuden osajoukot U ja V ovat keskenään ortogonaaliset, jos jokainen pari alkioita x U ja y V on ortogonaalinen. Osajoukko U on ortogonaalinen, jos (x, y)=0 kaikilla x, y U, x y. Ortogonaalinen joukko U on ortonormaali, jos lisäksi x =1 kaikilla x U. 1.2 Aliavaruuksia ja projektioita Lineaarialgebrassa on osoitettu, että ortogonaalinen joukko on lineaarisesti riippumaton. Jos K={v 1,...,v n } on lineaarisesti riippumaton vektorijoukko, joka virittää äärellisulotteisen vektoriavaruuden V, niin joukkoa K sanotaan kannaksi. 2
48 Tällöin jokaisella avaruuden vektorilla x Von (kanta)esitys x= n i=1 (x, v i ) v i 2 v i. Erityisesti jos kanta on ortonormaali, niin x= n (x, v i )v i. i=1 Edellä olevia kertoimia (x, v i ) sanotaan vektorin x Fourierin kertoimiksi. Ne ovat vektorin x koordinaatit ortonormaalin kannan suhteen. Edelleen lineaarialgebrassa on osoitettu, että jokaisella äärellisulotteisella sisätuloavaruudella on ortonormaali kanta. Tämä kanta voidaan muodostaa Gram-Schmidtin ortonormeerausmenetelmällä. Ortonormaalin kannan avulla voidaan määrittää vektorin projektio johonkin aliavaruuteen. Olkoon W sisätuloavaruuden V äärellisulotteinen aliavaruus ja olkoon{w 1,...,w m } aliavaruuden W ortonormaali kanta. Tällöin vektorin x V kohtisuora projektio aliavaruudelle W on p= m (x, w i )w i. i=1 Projektio p on sellainen aliavaruuden W vektori, että se on lähimpänä vektoria x eli se minimoi normin (etäisyyden) x y, y W. Aliavaruuden W ortonormaalin kannan{w 1,...,w m } avulla voidaan muodostaa ortogonaalinen projektiomatriisi P, jolloin vektorin x projektio aliavaruudelle W on Px. Projektiomatriisille on lisäksi voimassa P 2 = P ja P T = P. Jos{w 1,...,w m } on aliavaruuden W R n ortonormaali kanta, niin projektiomatriisi P=UU T, missä U=(w 1,...,w m ) on matriisi, jonka sarakkeet ovat ortonormaaleja kantavektoreita. Vielä pari käsitettä ennen esimerkkejä. Lineaarialgebrasta muistetaan, että m n-matriisi A on samalla lineaarikuvausr n R m (taic n C m ), joka kuvaa vektorin x R n vektoriksi Ax R m. Merkitään Ker A={ x R n Ax=0} A:n ydin, Im A={ Ax R m x R n } A:n kuva-avaruus. Samat määritelmät pätevät analogisesti, kun x C n. Palautetaan mieleen vielä tulos: dim V= dim(kerα)+dim(imα), kun V on äärellisulotteinen vektoriavaruus jaα : V W on lineaarinen. Matlabin komento orth(a) muodostaa matriisin kuva-avaruuden ortonormaalin kannan ja komentonull(a) matriisin ytimen ortonormaalin kannan. Esimerkiksi olkoon UR 4 :n aliavaruus, jonka virittävät vektorit x 1 = (1, 1, 1, 1) T, x 2 = (1, 1, 1, 1) T ja x 3 = (1, 3, 1, 3) T. >>x_1 = [1; 1; 1; 1];, x_2 = [1; -1; 1; -1]; x_3 = [1; 3; 1; 3]; >>A = [x_1 x_2 x_3] 3
49 A = Matriisin A sarakkeina ovat aliavaruuden U virittäjävektorit x 1, x 2 ja x 3 ja A on lineaarinen kuvausr 3 R 4. Nyt kuva-avaruuden Im A (= U) ja ytimen Ker A ortonormaalit kannat ovat: >>U = orth(a) U = >>ydin_kanta = null(a) ydin_kanta = Avaruuksien dimensiot ovat dim(im A)=2 ja dim(ker A)=1 (sarakkeiden eli kantavektorien lkm). Niiden summa on dimr 3 = 3. Edelleen projektiomatriisi P avaruuteen U on >>P = U*U P = Projektiomatriisin P ominaisuudet P 2 = P ja P T = P on helppo todeta: >>Pˆ2, P Projektiomatriisin avulla voidaan nyt laskea esimerkiksi vektorin x=(1, 1, 2, 2) T projektio aliavaruuteen U: 4
50 >>x = [1; 1; -2; 2]; >>u = P*x u = Siis aliavaruuden U vektoreista u=( 0.5, 1.5, 0.5, 1.5) T on lähinnä vektoria x, ja vektorin u etäisyys vektorista x on: >>norm(x-u) Edelleen vektorin u koordinaatit aliavaruuden U ortonormaalissa kannassa (Fourierin kertoimet) ovat: >>koord = U\u koord = >>koord(1)*u(:,1) + koord(2)*u(:,2) Vastaavasti ytimen kannan avulla voidaan muodostaa ytimen projektiomatriisi: >>ydin_proj = ydin_kanta*ydin_kanta ydin_proj = ProjisoidaanR 3 :n vektori y=(1, 1, 2) T ytimeen. >>y = [1; 1; -2]; >>n = ydin_proj*y n = Projektio n todellakin kuuluu ytimeen, sillä >>A*n
51 1.3 Matriisityyppejä Palautetaan seuraavaksi mieleen muutamia matriiseihin liittyviä käsitteitä. Matriisin A hermitoitu liittomatriisi on A = A T = (a ij ) T. Kokoa n n oleva matriisi A on hermiittinen, jos A = A unitaarinen, jos A A=Ieli A 1 = A, normaali, jos A A=AA. Reaalisessa tapauksessa A = A T ja tällöin sanotaan, että matriisi on symmetrinen, jos A T = A ja ortogonaalinen, jos A T A=I. Voidaan osoittaa, että unitaarisen matriisin sarakkeet ovat ortonormaalit (sama pätee myös riveille). Edelleen kahden unitaarisen matriisin tulo on unitaarinen, unitaarisen matriisin käänteismatriisi on unitaarinen ja unitaarisen matriisin kaikille ominaisarvoilleλpätee λ =1. Sanotaan, että matriisit A ja B ovat similaarisia, jos on olemassa sellainen säännöllinen matriisi C, että A=CBC 1. Edelleen matriisi A on diagonalisoituva, jos se on similaarinen diagonaalimatriisin D kanssa eli A=CDC 1. Lisäksi matriisit A ja B ovat unitaarisesti similaarisia, jos A=UBU 1 = UBU, jollakin unitaarisella matriisilla U. Erilaiset similaarisuusmuunnokset ovat tärkeitä, sillä similaarisilla matriiseilla on mm. samat ominaisarvot. Yleisesti voidaan ajatella, että similaarisuusmuunnoksilla muunnetaan matriisia A koskeva tehtävä ensin helpompaan muotoon (esim. diagonaalimatriisia koskevaksi tehtäväksi), ratkaistaan tehtävä ja tehdään muunnos takaisinpäin, jolloin palataan alkuperäiseen tehtävään. Esimerkiksi jos matriisi A on diagonalisoituva eli A=CDC 1, niin matriisin A ominaisarvot ovat samat kuin diagonaalimatriisilla D eli ne voidaan lukea suoraan diagonaalilta. Lisäksi matriisin C sarakkeista saadaan A:n ominaisvektorit, sillä AC=CD. Lineaarialgebrassa on osoitettu, että matriisi A n n on diagonalisoituva, jos ja vain jos A:lla on n lineaarisesti riippumatonta ominaisvektoria. Edelleen, jos matriisilla on n erisuurta ominaisarvoa, niin se on diagonalisoituva. Lisäksi jos A on hermiittinen matriisi, niin se on vieläpä unitaarisesti diagonalisoituva eli on olemassa sellainen unitaarinen matriisi U, että U AU on diagonaalimatriisi. Vastaavasti reaalisilla matriiseilla pätee: jos A on symmetrinen, niin on olemassa sellainen ortogonaalinen matriisi Q, että Q T AQ on diagonaalimatriisi D, jonka diagonaalilla ovat A:n ominaisarvot ja Q:n sarakkeet ovat A:n ominaisvektorit. Tällöin matriisi A=QDQ T. Diagonalisoidaan seuraavassa eräs symmetrinen matriisi. Kun Matlabin eigkomentoa kutsutaan kahdella output-argumentilla, niin eig palauttaa ortogonaalisen matriisin, jossa on matriisin ominaisvektorit, ja diagonaalimatriisin, jossa on ominaisarvot. >>A = [7-2 0; ; 0-2 5]; >>[Q, D] = eig(a) Q =
52 D = Matriisi Q on todellakin ortogonaalinen: >>Q *Q Lisäksi tulo Q T AQ tuottaa diagonaalimatriisin D: >>Q *A*Q Tutkitaan ei-symmetristä matriisia: >> A = [7-2 0; ; 0 2 5]; >> [V, D] = eig(a) V = i i i i D = i i >> Vˆ(-1)*A*V i i i i i i i i i Matriisi A on diagonalisoituva eli D=V 1 AV, koska sillä on kolme lineaarisesti riippumatonta ominaisvektoria, mutta nyt matriisi V ei ole enää ortogonaalinen. >> V *V i i i i i i i i >> rank(v) 3 7
53 Unitaariset (ortogonaaliset) similaarisuusmuunnokset ovat numeriikassa erityisen tärkeitä, koska ne ovat invariantteja euklidisen normin suhteenc n :ssä (R n :ssä), joten ne eivät kasvata virheitä laskutoimituksissa. Asiaa voisi visualisoida niin, että ortogonaalinen muunnos ei muuta pituuksia tai kulmia, se näkyy ainoastaan koordinaattiakselien kiertona tai peilauksena. Esimerkiksi matriisi ( ) cosθ sinθ Q θ = sinθ cosθ on ortogonaalinen ja kiertää koordinaattiakseleita kulman θ verran. Ortogonaalinen matriisi ( ) cosθ sinθ Q θ = sinθ cosθ on puolestaan kierto kulmanθverran ja peilaus koordinaattiakselien suhteen. Mainitaan vielä, että matriisi A on positiivisesti definiitti, jos se on hermiittinen ja x Ax>0 aina, kun x 0, x C n. Vastaava määritelmä voidaan antaa reaaliselle, symmetriselle matriisille. Voidaan osoittaa, että hermiittinen matriisi on positiivisesti definiitti, jos sen kaikki ominaisarvot ovat positiivisia. Itseasiassa tämä otetaan usein positiivisesti definiitin matriisin määritelmäksi. Aiemman nojalla tiedetään, että jos matriisilla A n n ei ole n:ää erisuurta ominaisvektoria, niin se ei ole diagonalisoituva. Jokainen neliömatriisi on kuitenkin similaarinen ns. Jordan-normaalimuodon kanssa, joka on hyvin lähellä diagonaalimatriisia (ks. Matriisiteoria). Matlab ei kuitenkaan osaa muodostaa Jordannormaalimuotoa. Jokainen neliömatriisi on kuitenkin unitaarisesti similaarinen jonkin (kvasi)yläkolmiomatriisin kanssa, tämä on ns. Schurin normaalimuoto. Schurin normaalimuodon Matlab muodostaa komennolla schur. Ks. Matlabin opasteista lisää tietoa. Itseasiassa reaalisen, symmetrisen matriisin tapauksessa Schurin normaalimuoto antaa jo äsken muodostetun diagonalisoinnin. >>A = [7-2 0; ; 0-2 5]; >>[U,T] = schur(a) U = T = >>U*T*U
54 2 Lineaarisen yhtälöryhmän ratkaiseminen Tutkitaan seuraavaksi sitä, kuinka Matlabilla ratkaistaan lineaarinen yhtälöryhmä Ax = b. Ensimmäisestä luennosta muistetaan, että yhtälöryhmä voidaan ratkaista komennollax=a\b. Tällöin A:lla ja b:lla on oltava yhtä monta riviä. Olkoon kerroinmatriisi A m n-matriisi, tällöin yhtälöryhmän Ax = b ratkaisussa on kolme tapausta: m=n. Etsitään tarkkaa ratkaisua. m > n. Yhtälöitä on enemmän kuin tuntemattomia, ylideterminoitu yhtälöryhmä. Etsitään ratkaisua pienimmän neliösumman mielessä. m<n. Yhtälöitä vähemmän kuin tuntemattomia, alideterminoitu yhtälöryhmä. Etsitään perusratkaisua, jossa on enintään m nollasta eroavaa komponenttia. Riippuen kerroinmatriisin koosta, muodosta ja ominaisuuksista (esim. onko se positiivisesti definiitti), Matlabin\-operaattori käyttää eri algoritmeja ja yrittää etsiä yllä mainittua tyyppiä olevia ratkaisuja, ks. help mldivide. Jos kerroinmatriisin ominaisuudet ovat käyttäjän tiedossa, niin voidaan käyttää (nopeampaa) komentoalinsolve, ks.help linsolve. Esim. >> n = 10000; >> A = triu(rand(n)); x = rand(n,1); b = A*x; >> tic, y1 = A\b; toc Elapsed time is seconds. >> opts.ut = true; opts.transa = false; >> tic, y2 = linsolve(a,b,opts); toc Elapsed time is seconds. 2.1 Neliötapaus Jos kerroinmatriisi A on neliömatriisi, niin se on joko säännöllinen tai singulaarinen. Kun kerroinmatriisi on säännöllinen, niin sillä on käänteismatriisi ja yhtälöryhmä Ax = b on yksikäsitteisesti ratkeava. Matlab laskee tämän ratkaisun komennollax=a\b. >>A = [2-1 1; 3 2 2; 1-2 1]; b = [2; -2; 1]; >>rank(a) 3 >>x = A\b x =
55 Jos kerroinmatriisi on singulaarinen (eli det A=0 tai rank(a)<n), niin yhtälöryhmä ei ole yksikäsitteisesti ratkeava tai ratkaisua ei ole olemassa. Matlabin \-operaattori varoittaa, jos matriisi on lähes singulaarinen tai palauttaa virheen jos se tunnistaa matriisin singulaariseksi. >>A = [1 2 7; 1 3 6; 1 4 5]; b = [1; 1; 1]; >>x = A\b Warning: Matrix is singular to working precision. x = NaN NaN NaN >>rank(a) 2 Edellisessä esimerkissä kerroinmatriisi on singulaarinen, mutta ratkaisu voidaan laskea pseudoinverssin (nk. Moore-Penrose -inverssi, yleistetty käänteismatriisi) avulla. Käytetään Matlabin komentoapinv, joka laskee pseudoinverssin: >>P = pinv(a)*b P = VektoriPon nyt yhtälöryhmän eräs ratkaisu: >>A*P Se ei ole kuitenkaan ainoa ratkaisu, sillä yhtälöryhmälle saadaan uusia ratkaisuja homogeenisen yhtälöryhmän Ax=0 ratkaisujen monikertojen ja erityisratkaisun P summana. Homogeeninen yhtälöryhmä voidaan ratkaista komennolla null(a). >>homog = null(a) % ytimen kanta homog = >>ratk = *homog + P % kertoimella ei ole merkitystä tässä ratk =
56 >>A*ratk Yllä muodostettu vektoriratk on siis myös yhtälöryhmän Ax=b ratkaisu. Lineaarialgebrasta muistetaankin, että eräs ehto sille, että matriisi on säännöllinen on, että homogeenisella yhtälöryhmällä on ainoastaan triviaaliratkaisu x=0. Seuraavassa esimerkissä yhtälöryhmä on ratkeava, mutta ratkaisu ei ole tarkka, vaan pienimmmän neliösumman ratkaisu. >>A = [3 1 2; 2 3-2; 1-2 4]; b = [5; 3; 1]; >>x = A\b x = A\b Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = e-017. x = 1.0e+015 * >>rank(a) 2 >>P = pinv(a)*b P = Seuraavasta nähdään, ettei ratkaisu tosiaankaan ole tarkka: >>A*P Tämä on eri vektori kuin alkuperäinen oikeanpuolen vektori b=(5, 3, 1) T. Se, ettei tarkkaa ratkaisua saada, nähdään myös yhtälöryhmän täydennetyn kerroinmatriisin porrasmuodon alimmalta riviltä: >>rref([a b])
57 2.2 Ylideterminoitu tapaus Ylideterminoidulle yhtälöryhmälle, siis kun yhtälöitä on enemmän kuin tuntemattomia, Matlabin\-operaattori laskee pienimmän neliösumman ratkaisun. Ts. min x Ax b 2 Tätä voidaan käyttää esim. tehtäessä pienimmän neliösumman sovitusta johonkin dataan. 2.3 Alideterminoitu tapaus Alideterminoiduissa yhtälöryhmissä on muuttujia enemmän kuin yhtälöitä. Tällaisia yhtälöryhmiä kohdataan esimerkiksi lineaarisessa optimoinnissa, jossa rajoite-ehdoista saadaan alideterminoitu yhtälöryhmä. Alideterminoidun yhtälöryhmän ratkaisu ei ole yksikäsitteinen, vaan yhtälöryhmälle etsitään ns. perusratkaisu: jos A on m n-matriisi (m<n) ja rank(a)=m, niin vektori x R n on yhtälöryhmän Ax=b perusratkaisu, jos Ax=b ja vektorilla x on enintään m kpl nollasta eroavia alkioita ja näitä nollasta eroavia alkioita vastaava A:n alimatriisi B on säännöllinen. Tutkitaan seuraavaksi erästä alideterminoitua yhtälöryhmää ja määrätään sen eräs perusratkaisu: >>A = [ ; ]; b = [7; 3]; >>rank(a) 2 >>x = A\b x = >>A*x Yllä on siis vain eräs perusratkaisu. Homogeenisen yhtälöryhmän ratkaisujen lineaariyhdisteen ja yllä lasketun ratkaisun avulla voidaan muodostaa uusia ratkaisuja. >>z = null(a) z = >>homog = 2*z(:,1) + 3*z(:,2) 12
58 homog = >>A*(x+homog) Matriisihajotelmia 3.1 LU-hajotelma Matriisin A hajotelmaa tuloksi A=LU, missä L on alakolmiomatriisi ja U on yläkolmiomatriisi, sanotaan LU-hajotelmaksi. LU-hajotelma on käytännössä vain tutun Gaussin eliminointimenetelmän esitys (ilman rivinvaihtoa) matriisimuodossa. Yläkolmiomatriisiin U sijoitetaan Gaussin eliminointimenetelmällä saatava, matriisin A kanssa ekvivalentti, porrasmuoto. Alakolmiomatriisiin L puolestaan tallennetaan ne kertojat, joilla kutakin matriisin riviä on kerrottu porrasmuotoa muodostettaessa. Kun matriisin A LU-hajotelma on laskettu ja tallennettu, voidaan yhtälöryhmä Ax = b ratkaista helposti eri oikean puolen vektoreilla b. Yhtälöryhmän ratkaisu saadaan kahdessa vaiheessa. Ensin ratkaistaan yhtälöryhmä Lz = b, missä on kysymys etenevästä sijoituksesta, sillä L on alakolmiomatriisi. Tämän jälkeen ratkaisu x saadaan yhtälöryhmän Ux=z ratkaisuna, joka saadaan taas yksinkertaisella takaisinpäin sijoituksella. Tämä on laskennalliseti edullista ( halvempaa ) kuin se, että aina uudella oikeanpuolen vektorilla tehtäisiin Gaussin eliminointi alusta alkaen. Kaikilla säännöllisillä matriiseilla ei ole LU-hajotelmaa yllä esitetyssä mielessä, esim. ( ), mutta jos rivit vaihdetaan, niin tällöin LU-hajotelma on olemassa. Gaussin eliminointimenetelmässä käytetäänkin yleensä rivinvaihtoja, ja se on vieläpä numeerisen stabiiliuden kannalta toivottavaa, joten rivinvaihdot olisi toivottavaa yhdistää myös LU-hajotelmaan. Rivinvaihto voidaan esittää niin, että kerrotaan matriisia A ortogonaalisella permutaatiomatriisilla P. Voidaan osoittaa, että säännölliselle matriisille A on olemassa sellainen permutaatiomatriisi P, että PA = LU. Matlabin komento lu palauttaa oletuksena LU-hajotelman muodossa A= LU, missä L on permutaatiomatriisin transpoosin P T ja alakolmiomatriisin L tulo eikä siis välttämättä näytä alakolmiomatriisilta. >>A = [2-1 1; 3 2 2; 1-2 1]; b = [2; -2; 1]; >>[L, U] = lu(a) L = U = 13
59 Kuten nähdään L kaipaa rivinvaihtoja ollakseen alakolmiomatriisi. Ratkaistaan yhtälöryhmä hajotelman avulla: >>z = L\b z = >>x = U\z x = Muutetaan tulostusmuoto ja kutsutaan lu-komentoa kolmella tulosargumentilla, jolloin saadaan L alakolmiomatriisina ja P on permutaatiomatriisi. >>format rat >>[L, U, P] = lu(a) L = / /3 7/8 1 U = /3 1/ /8 P = Permutaatiomatriisi P vaihtaa 1. rivin 3. riviksi, 2. rivin 1.riviksi ja 3.rivin 2. riviksi: >>A A = >>P*A >>format short 14
60 Usein sovelluksissa matriisi A on symmetrinen ja positiivisesti definiitti. Tällöin hajotelma on itseasiassa muotoa A=LL T, missä L on alakolmiomatriisi. Tätä hajotelmaa kutsutaan Choleskyn hajotelmaksi, Matlabissachol. 3.2 QR-hajotelma Toinen tärkeä hajotelma on QR-hajotelma A=QR, missä Q on ortogonaalinen (unitaarinen, jos A on kompleksinen matriisi) ja R on yläkolmiomatriisi. Kuten muistetaan ortogonaaliset matriisit ovat laskennallisesti toivottavia, sillä ne säilyttävät pituudet ja kulmat, eivätkä suurenna virheitä. QRhajotelman matriisi Q on mahdollista muodostaa matriisin A sarakevektoreista Gram-Schmidtin ortonormalisointimenetelmällä. Gram-Schmidtin menetelmä on kuitenkin numeerisesti epävakaa, joten sen sijaan käytetään yleensä ns. Householderin muunnosta (Householder reflection, Householder matrix). QR-hajotelman muodostaminen Householderin muunnoksilla vaatii enemmän laskutoimituksia kuin Gaussin eliminointimenetelmä, joten QR-hajotelmaa ei yleensä käytetä tavallisten yhtälöryhmien ratkaisussa. Sen sijaan esimerkiksi ominaisarvotehtävien ratkaisussa tärkeä QR-algoritmi perustuu QR-hajotelman käyttöön. Edelleen yhtäloryhmän ratkaisussa, kun kerroinmatriisi ei ole neliömatriisi, on hyödyllistä käyttää QR-hajotelmaa. Matlab käyttääkin QR-hajotelmaa eo. tehtävien ratkaisemisessa. QR-hajotelma voidaan eksplisiittisesti muodostaa komennolla qr, joka itseasiassa osaa laskea hajotelman neljä erilaista varianttia, ks. help qr. Ratkaistaan esimerkkinä eräs ylideterminoitu yhtälöryhmä QRhajotelmalla. >>A = [2 3 4; 1 2 4; 2 4 1; 4 2 5]; b = [1; 1; 1; 1]; >>rank(a) 3 >>[Q, R] = qr(a) Q = R = >>z = Q\b z =
61 >>x = R\z x = Itseasiassa, koska Q on ortogonaalinen eli Q T = Q 1, niin Rx=Q T b. Siten >>x = R\(Q *b) x = Sama tulos saadaan toki myös\-komennolla: >>x = A\b x = Singulaariarvohajotelma ja pseudoinverssi Voidaan osoittaa, että jokaista matriisia A C m n vastaava n n-matriisi A A on hermiittinen ja positiivisesti semidefiniitti. Tällöin sen ominaisarvotλ i ovat reaalisia ja ei-negatiivisia. Näiden ominaisarvojen ei-negatiivisia neliöjuuria sanotaan matriisin A singulaariarvoiksi. Edelleen voidaan osoittaa, että jokainen astetta r=rank(a A) oleva matriisi A C m n on muotoa A=UDV, missä U ja V ovat unitaarisia ja diagonaalimatriisi ( ) Dr 0 D=, 0 0 m n missä D r = diag( λ 1,..., λ r ). Diagonaalimatriisissa D on siis A:n singulaariarvot. Tätä hajotelmaa sanotaan singulaariarvohajotelmaksi. Jos A R m n, niin U ja V ovat ortogonaalisia ja A=UDV T. Jos matriisi A on symmetrinen ja positiivisesti definiitti, niin sen ominaisarvo- ja singulaariarvohajotelmat ovat samat. Tässä ominaisarvohajotelmalla tarkoitetaan matriisin diagonalisointia. Mutta mitä kauempana matriisi on symmetrisistä ja positiivisesti definiiteistä matriiseista, sitä enemmän hajotelmat poikkeavat toisistaan. Erityisesti reaalisille matriiseille singulaariarvohajotelma on aina reaalinen, mutta ominaisarvohajotelma voi olla kompleksinen. Jos singulaariarvot ovatµ 1 µ 2... µ r >µ r+1 =...=µ n = 0 ja matriisien U ja V ortonormaalit sarakevektorit ovat u 1,...,u n C n ja v 1,...,v m C m, niin on 16
62 voimassa Av j =µ j u j, j=1,...,r, A u j =µ j v j, j=1,...,r, Av j = 0, j=r+1,...,n, A u j = 0, j=r+1,...,m. Vrt. ominaisarvon ja -vektorin määritelmään matriisille A C n n : Ax j =λ j x j, j=1,...,n. Testataan Matlabin singulaariarvohajotelman laskevaa komentoasvd: >>A = [2 3 4; 1 2 4; 2 4 1; 4 2 5] A = >>[U,D,V] = svd(a) U = D = V = >>U*D*V >> sqrt(eig(a *A)) Kolmeen tulosargumenttiin saatiin yo. määritelmän mukaiset matriisit. Singulaariarvot ovat siis matriisinddiagonaalilla. 17
63 Matriisin singulaariarvohajotelman avulla voidaan muodostaa edellä mainittu pseudoinverssi A. Säännöllisen matriisin tapauksessa pseudoinverssi antaa A:n käänteismatriisin A 1. Matriisin A C m n, jolla on on singulaariarvohajotelma A=UDV, pseudoinverssi on ( ) D A 1 r 0 = V U 0 0, missä D 1 r = diag(1/ λ 1,...,1/ λ r ). Tutkitaan ylideterminoitua tapausta, jossa kerroinmatriisi on asteeltaan vajaa (rank deficient). >>A = rand(4,2)*rand(2,3) A = >>rank(a) 2 Nyt siis matriisin aste on pienempi kuin sen sarakkeiden lukumäärä. Tässä tapauksessa pienimmän neliösumman ratkaisu ei ole yksikäsitteinen. Tällöin\- komento varoittaa, mutta antaa kuitenkin vastauksen. Komennolla pinv saadaan kuitenkin yksikäsitteinen minimiratkaisu eli saadaan sellainen minimi normille Ax b, että x minimoituu. >>b = [1; 1; 1; 1]; >>x = A\b Warning: Rank deficient, rank = 2, tol = e-015. x = >>A*x Saatiin perusratkaisu, jossa on kaksi nollasta eroavaa alkiota, koska kerroinmatriisin aste on kaksi. Muita ratkaisuja saadaan lisäämällä tähän homogeenisen tehtävän ratkaisun monikertoja mielivaltaisesti: >>z = null(a) z = n m 18
64 >>A*(2*z + x) Pseudoinverssillä saadaan ratkaisu ilman varoituksia: >>y = pinv(a)*b y = >>A*y Molemmat ratkaisut ovat pienimmän neliösumman ratkaisuja, mutta pseudoinverssillä lasketun ratkaisun normi on pienempi kuin\:lla lasketun, kuten pitääkin olla. >>norm(x), norm(y) Yhteenvetona voidaan todeta, että lähes aina kannattaa käyttää\-operaattoria, jollei tavoittele jotain erikoisominaisuuden omaavaa ratkaisua. 19
65 MATEMAATTISET OHJELMISTOT Syksy 2012 Matlab-luennot, 4. osa Sisältö 1 Polynomeista Juurista Polynomin arvot Derivointi Tulo ja osamäärä Osamurtokehitelmä Käyrän sovitus ja interpolointi Tietotyypit Merkkijonot Liukuluvut Kokonaisluvut Totuusarvot Muuta Polynomeista Matlabissa ei polynomia voida antaa lausekkeena, jossa on jokin vapaa muuttuja (vrt. Maple). Sen sijaan Matlabin polynomi annetaan rivivektorina, jossa on polynomin kertoimet niin, että korkeimman asteen termin kerroin on ensimmäisenä. Tämä vektori määrittelee polynomin yksikäsitteisesti. Siis syöttämällä >>p = [ ] p = muodostetaan polynomi 2x 4 +3x 2 +4x+1 (viisi kerrointa määrä 4. asteen polynomin täysin). 1
66 1.1 Juurista Edellä olevan polynominpjuuret lasketaan komennollaroots: >>juuret = roots(p) juuret = i i Komennolla poly voidaan luvuista muodostaa vektori, jossa on sen polynomin kertoimet, jonka juuria luvut ovat. Kertoimet ovat jälleen järjestyksessä niin, että korkeimman asteen termin kerroin on ensin. >>p2 = poly(juuret) p2 = Komennot roots ja poly ovat toisilleen käänteisiä komentoja pyöristystarkkuuden ja skaalauksen rajoissa. Edellä olleesta huomataan, että Matlab on skaalannut polynomin niin, että korkeimman asteen termin kerroin on yksi eli polynomi on normeerattu (monic). Lisäksi tässä on itseasiassa hieman epätarkkuutta läsnä: >>format long g >>p2 p2 = Columns 1 through 3 Columns 4 through e >>format short Olkoon polynomin p(t)=a k t k + a k 1 t k 1 + +a 1 t+a 0 kertoimet a i vektorissap. Tällöin polynomin p toverimatriisi on k k-matriisi, missä ensimmäinen rivi on-p(2:k)./p(1). Lisäksi toverimatriisin ominaisarvot ovat polynomin juuret. Matlab laskee polynomin juuret tämän toverimatriisin avulla. Siis polynomin 2x 4 + 3x 2 + 4x+1 juuret ovat: >>A = compan(p) A =
67 >>eig(a) i i Edelleen, kun funktiolle poly annetaan argumentiksi neliömatriisi A, palauttaa se matriisin karakteristisen polynomin c A (λ)=det(λi A)=λ n + a 1 λ n 1 + +a n 1 λ+a n kertoimet vaakavektorissa. Kertoimet on jälleen järjestetty niin, että korkeimman asteen termin kerroin (aina yksi) on ensimmäisenä. >>B = [1 2 3; 2 1 3; 3 3 6]; >>karak = poly(b) karak = Karakteristisen polynomin kertoimien muodostamisen Matlab tekee niin, että ensin lasketaan matriisin ominaisarvotλ 1,λ 2,...,λ n funktioneig avulla. Tämän jälkeen karakteristisen polynomin kertoimet saadaan suorittamalla kertominen karakteristisen polynomin tuloesityksessä c A (λ)=(λ λ 1 )(λ λ 2 ) (λ λ n ). Siis Matlabissa on perinteiseen nähden käänteinen lähestymistapa: määrätään karakteristinen polynomi ominaisarvojen avulla eikä ominaisarvoja karakteristisen polynomin avulla. Tämä tapa on numeerisesti parempi. Se, kuinka Matlab laskee matriisin ominaisarvot, olisi puolestaan oman esityksensä aihe, joka sivuutetaan tässä yhteydessä. 1.2 Polynomin arvot Funktiollapolyval voidaan polynominparvo laskea annetussa pisteessä tai pisteissäx. Siis esimerkiksi polynomin 2x 4 + 3x 2 + 4x+1 arvo pisteessä 3 sekä kahdessasadassa pisteessä välillä [0, 2] saadaan seuraavasti: >>p = [ ]; >>arvo = polyval(p, 3) arvo = 202 >>x = linspace(0,2,200); >>arvot = polyval(p, x); >>whos arvot Name Size Bytes Class Attributes arvot 1x double Jos funktiolle polyval annetaan argumentiksi vektori tai matriisi, lasketaan polynomin arvo alkioittain. Funktiotapolyvalm käytetään, kun halutaan laskea polynomin arvo jollakin neliömatriisilla, tuloksena on tällöin toinen neliömatriisi. Siis 3
68 jos on polynomi ja A on n n-matriisi, niin p(x)=a 0 x m +...+a m 1 x+a m p(a)=a 0 A m +...+a m 1 A+a m I on myös n n-matriisi. Tutkitaan polynomia p(x)=3x 2 + 2x+1 ja seuraavaa neliömatriisia >>B = [1 2 3; 2 1 3; 3 3 6]; >>p = [3 2 1]; >>C = polyvalm(p, B) C = Siis edellä matriisi C=p(B). Tutkitaan matriisien B ja C ominaisarvoja: >>z = eig(b) z = >>omin = eig(c) omin = >>polyval(p, z) Matriisin C ominaisarvot ovat siis samat (tässä järjestystä vaille) kuin polynomin p(x)=3x 2 + 2x+1 arvot matriisin B ominaisarvoissa. Yleisesti: jos n n-matriisilla A on ominaisarvotλ 1,λ 2,...,λ n ja p on polynomi, niin matriisilla p(a) on ominaisarvot p(λ 1 ),...,p(λ n ). Edelleen >>p = poly(b) p = >>polyvalm(p, B) 1.0e-013 * Siis matriisi on oman karakteristisen polynominsa juuri eli c A (A)=0. Tämä tunnetaan ns. Cayley-Hamiltonin lauseena. 4
69 1.3 Derivointi Polynomi voidaan derivoida funktiolla polyder. Derivoidaan esimerkiksi polynomi 2x 4 + 3x 2 + 4x+1: >>polynomi = [ ]; >>deriv = polyder(polynomi) deriv = Tulos ymmärretään polynomina, jonka aste on oikeaoppisesti laskenut yhdellä. Komennolla polyder voidaan laskea myös kahden polynomin tulon ja osamäärän derivaatat. Otetaan toiseksi polynomiksi polynomi 3x 2 + 2x+1. >>polyn = [3 2 1]; >>tulo_deriv = polyder(polynomi,polyn) tulo_deriv = >>[osoittaja, nimittaja] = polyder(polynomi,polyn) osoittaja = nimittaja = >>[osoittaja, nimittaja] = polyder(polyn,polynomi) osoittaja = nimittaja = Osamäärän derivaattaa laskettaessa on tulos ohjattava kahteen argumenttiin, joista ensimmäisessä on derivaatan osoittaja ja toisessa nimittäjä. 1.4 Tulo ja osamäärä Polynomien tulo ja osamäärä voidaan laskea funktioilla conv ja deconv. Komento conv(u,v) laskee vektoreiden u ja v konvoluution ja komento deconv(u,v) vektoreiden dekonvoluution. Nämä vastaavat polynomien kerto- ja jakolaskua, kun vektoreissa on polynomien kertoimet. Lasketaan polynomien x 3 +x+1 ja x 2 +x+1 tulo ja osamäärä. Osamäärää laskettaessa annetaan kaksi tulosargumenttia, toinen osamäärälle ja toinen jakojäännökselle. >>poly1 = [ ]; >>poly2 = [1 1 1]; >>tulo = conv(poly1,poly2) tulo = >>[osam, jakojaann] = deconv(poly1, poly2) osam = 1-1 5
70 jakojaann = Osamurtokehitelmä Kahden polynomin osamäärälle voidaan laskea osamurtokehitelmä komennolla residue. Lasketaan lausekkeen b(z) osamurtokehitelmä, missä a(z) a(z)=z3 2z 2 2z+1 ja b(z)=2z 2 4z+1. >>b = [2-4 1]; >>a = [ ]; >>[r, p, k] = residue(b, a) r = p = >>k = [] Nyt polynomeilla a ja b ei ole moninkertaisia juuria, joten Matlab antaa tuloksen muodossa b(z) a(z) = r r n + k(z), z p 1 z p n joten tässä b(z) a(z) 0, , , 0764 = + + z 2, 6180 z+1, 0000 z 0, Jos komennolle residue annetaan kolme argumenttia, niin se palauttaa osamurtokehitelmän takaisin polynomimuotoon. >>[b2, a2] = residue(r, p, k) b2 = a2 = Seuraavassa esimerkissä lausekkeella on kaksi 2.kertaluvun napaa. >>a = [ ]; >>b = [2-4 1]; >>[r, p, k] = residue(b, a) r =
71 p = k = [] Eli osamurtokehitelmä on 2z 2 4z+1 z 4 2z+1 0, 25 1, , 25 = + z+1 (z+1) 2+0, z 1 (z 1) Käyrän sovitus ja interpolointi Esitellään vielä lyhyesti, kuinka Matlabilla voidaan sovittaa polynomi annettuun dataan, sekä tehdään lyhyt katsaus yksiulotteiseen interpolaatioon Matlabissa. Komento polyfit(x,y,n) sovittaa astetta n olevan polynomin annettuun dataan x, y pienimmän neliösumman mielessä. Tehdään seuraavassa kolmannen asteen polynomin sovitus eräälle datalle: >>x = [ ]; >>y = [ ]; >>p = polyfit(x, y, 3) p = Komentopolyfit palauttaa polynomin kertoimet vektoriinp, siis nyt saatiin polynomi 1, 8713x 3 +5, 8040x 2 +57, 1896x 64, Käyttämällä funktiotapolyval, voidaan sovitetun polynomin arvoja laskea ja piirtää Kuva 1(a): >>x2 = linspace(1,6,200); >>y2 = polyval(p, x2); >>plot(x,y, o,x2,y2) >>grid on; Tarkastellaan vielä pikaisesti interpolaatiota. Interpolaatiolla ja käyrän sovituksella on se ero, että kun annettua dataa (x k, y k ), k=0,...,n interpoloidaan, niin vaaditaan, että interpoloiva funktio f kulkee datapisteiden kautta eli toteuttaa ehdon f (x k )= y k, k=0,...,n. Jos käytetään polynomeja, niin voidaan osoittaa, että on olemassa yksikäsitteinen, enintään astetta n oleva polynomi, joka toteuttaa interpolaatioehdon. Koska suuri määrä datapisteitä aiheuttaa korkea-asteisen interpoloivan polynomin, niin usein päädytään käyttämään alempiasteisia polynomeja osaväleillä. Funktio interp1 suorittaa yksiulotteisen polynomi-interpolaation. Funktiolle voidaan antaa useita erilaisia optioita, joilla määrätään, millaista interpolaatiopolynomia käytetään. Lisätietoja saa komennnolla help interp1. Tehdään jo äsken käytetylle datalle suosittu ns. kuutiosplini-interpolaatio. Kuutiosplini on paloittain kolmannen asteen polynomi, jolla on jatkuva toinen derivaatta datapisteissä. 7
72 >>x = [ ]; >>y = [ ]; >>x2 = linspace(1,6,200); >>y2 = interp1(x, y, x2, spline ); Vektori y2 ei nyt sisällä polynomin kertoimia, vaan siihen on laskettu hilaa x2 vasten interpoloivan polynomin arvoja, joita voidaan käyttää esimerkiksi piirtämisessä (kts. Kuva 1(b)): >>plot(x,y, o,x2,y2), grid on; (a) Datapisteet ja niihin sovitettu polynomi. (b) Kuutiosplini kulkee datapisteiden kautta. Kuva 1: Datan sovitusta. 2 Tietotyypit Matlabissa on lukuisia perustietotyyppjä (data types), joista jokainen on rakenteeltaan taulukko (array). Taulukon minimikoko on 0 0 ja se voi kasvaa n- ulotteiseksi taulukoksi, jossa on mielivaltainen määrä alkioita. Kaksiulotteiset taulukot ovat tietenkin matriiseja. Aiemmin on jo huomattu kuinka Matlabin taulukko-operaatiot, siis yleensä vektori- ja matriisioperaatiot, ovat hyvin tehokkaita. 2.1 Merkkijonot Merkkitaulukko (character array) sisältää merkkitietotyyppiä, char, olevaa dataa. Sisäisesti Matlabissa yksittäinen merkki on talletettu 16 bitin pituisena positiivisena kokonaislukuna. Ensimmäiset 127 lukua vastaavat ASCII-merkistöä. Merkkijono on Matlabissa 1 n-merkkitaulukko ja se muodostetaan heittomerkkien sisään kirjoittamalla. Merkkijonoistakin voi poimia indeksoimalla yksittäisiä merkkejä. Merkkijonoja voidaan sijoittaa m n-taulukkoon sillä edellytyksellä, että kukin jono on yhtäpitkä. Tämä sen takia, että Matlabissa taulukon on oltava suorakulmion muotoinen. Seuraavassa nähdäänkin, että jos halutaan sijoittaa samaan taulukkoon eripituisia merkkijonoja, on itse lisättävä tarvittava määrä 8
73 välilyöntejä tai käytettävä funktiota char, joka lisää automaattisesti tarvittavan määrän välilyöntejä. >> Terve Terve >>double(ans) >>a = Matemaattiset ; b = ohjelmistot ; >>yhd = [a b] yhd = Matemaattisetohjelmistot >>yhd = [a,, b] yhd = Matemaattiset ohjelmistot >> yhd(1:4) Mate >>yhd = [a; b]??? Error using ==> vertcat CAT arguments dimensions are not consistent. >> yhd = [a; b ] yhd = Matemaattiset ohjelmistot >> yhd = char(a, b, -kurssi ) yhd = Matemaattiset ohjelmistot -kurssi >>whos yhd Name Size Bytes Class Attributes yhd 3x13 78 char 9
74 2.2 Liukuluvut Yleisimmin käytetty tietotyyppi on kaksoistarkkuuden numeerinen taulukko (double-precision numeric array), joka yleensä on vielä kaksiulotteinen eli matriisi. Liukuluvuille on lisäksi mahdollista käyttää yksinkertaisen tarkkuuden numeerista taulukkoa (single-precision numeric array). Liukuluvut on äärellinen lukujoukko, jota käytetään tietokoneessa reaalilukujen approksimaationa. Reaaliluvun x liukulukuapproksimaatio (tässä ns. normalisoitu liukuluku) on fl(x)=( 1) s (1+ f ) 2 e, missä f on luvun mantissa (0 f < 1), e on eksponentti ja s (etu)merkki. Merkitään m = 1 + f (1, 2]. Hyvin yleisesti käytössä olevassa IEEE:n standardissa kaksoistarkkuuden luvut talletetaan 64 bitin sanana, missä yksi bitti on varattu luvun merkille, 11 bittiä luvun eksponentille ja 52 bittiä mantissalle. Yksinkertainen tarkkuus käyttää tästä puolet, siis yksinkertaisen tarkkuuden liukuluvun esittämiseen käytetään 32 bittiä (1 bitti merkille, 8 bittiä eksponentille ja 23 bittiä mantissalle). Tarkastellaan kaksoistarkkuuden esitystä esim. luvulle x = 11/2. Eksponentti e selviää ehdosta 2 e x<2 e+1. Siten e=2. Sitä käyttäen kirjoitetaan 11 2 = 1 2 (8+2+1)= 1 2 ( )= = ( )2 2 eli luvun x binääriesitys on Liukulukuesitys on täten 11 2 = (1.011) s e m Huomaa, että ilman normalisointia 1 m<2 luku x voitaisiin kirjoittaa myös muissa muodoissa, kuten 11 2 = (0.1011) = ( ) = ( ) =..., jolloin mantissan alussa olevien nollien tallentaminen laskee tarkkuutta ja esitys ei olisi enää yksikäsitteinen. Tästä binääripisteen liukumisesta tulee myös eo. esityksen nimitys. Tarkkuuden menettäminen koskee erityisesti sellaisia desimaalilukuja, joilla on päättymätön binääriesitys, esim. 0.2= 1 5 = ( ) 2 tai 0.1= 1 10 = ( ) 2 10
75 jne. Tällöin ei ole järkevää tuhlata bittejä alussa olevien nollien tallentamiseen, vaan valita eksponentti sopivasti. Mantissan pituuden äärellisyys asettaa siis rajan liukulukujen tarkkuudelle ja tähän liittyy käsite konevakio (machine epsilon). Konevakioε M on pienin liukuluku, joka voidaan lisätä liukulukuun 1 niin, että saatava luku on vielä erisuuri kuin 1. Seuraavassa on klassinen tapa, jolla voidaan selvittää, mikä on konevakion suuruus. Samalla saadaan esimerkki pyöristysvirheiden vaikutuksesta liukulukuaritmetiikassa. Matlabissa konevakion arvo on avainsanassa eps, josta se myös saadaan helposti selville. >>format long >>a = 4/3 a = >>b = a - 1 b = >>c = 3*b c = >>e = 1 - c e = e-016 >>eps e-016 Se, ettei yo. laskun tulos e ole nolla, johtuu siitä, ettei jakolaskun 4/3 tulosta voida esittää tarkasti 2-kantaisilla liukuluvuilla (toisin kuin vaikka 3-kantaisilla). Muut laskutoimitukset tapahtuvat edellisessä esimerkissä tarkasti. Itseasiassa liukuluvuilla, joiden mantissan pituus on m n, konevakio on 2 m n, siis nyt Komennollaeps saadaan selville myös konevakio yksinkertaisen tarkkuuden liukuluvuille tai vaikkapa luvun 10 etäisyys seuraavaan liukulukuun: >> eps( single ) e-007 >> eps(10), eps(single(10)) e e-007 Seuraavasta nähdään, millainen pyöristysvirhe tulee, kun normaalisti kaksoistarkkuudella esitetty lukuπmuunnetaan yksinkertaiseen tarkkuuteen. 11
76 >> double(single(pi) - pi) e-008 Pyöristys on kuitenkin pienempi kuin >> eps(single(pi)) e-007 Liukuluvun eksponentin äärellisyys asettaa puolestaan rajat sille, kuinka suuria tai pieniä reaalilukuja voidaan liukuluvuilla esittää. Matlabissa on näille luvuille omat komentonsa ja kaksoistarkkuudella saadaan: >> realmin e-308 >> realmax e+308 >> 2ˆ(-1022) e-308 >> (2 - eps)*2ˆ(1023) e+308 Huomaa, että liukuluvut eivät ole jakautuneet tasaisesti vaan lähellä lukua realmin liukuluvut ovat tiheämmässä kuin luvunrealmax lähellä: >> eps(realmin) e-324 >> eps(realmax) e+292 Epätasainen jakautuminen johtuu siitä, että jokaisella välillä [2 k, 2 k+1 ] on yhtä monta liukulukua, mutta näiden välien pituus kasvaa, kun k kasvaa. Kummassakin tapauksessa liukulukujen välinen suhteellinen etäisyys on kuitenkin pieni. Itseasiassa liukulukuapproksimaation suhteellinen virhe on x fl(x) x = 1 2 ε M. Joitakin poikkeustilanteita varten on määritelty eräitä käsitteitä ja erikoissuureita. Jos laskutoimituksen tulos on suurempi kuin realmax on kyseessä ylivuoto 12
77 (overflow), ja tulokseksi saadaan liukuluku Inf. Lukua Inf vastaa mantissan arvo 0 ja eksponentti Jos laskutoimituksen tulos on pienempi kuin realmin on kyseessä alivuoto (underflow), ja tulokseksi asetetaan liukuluku 0. Joissakin systeemeissä on lukujen eps*realmin ja realmin välissä käytössä ns. denormaalit tai subnormaalit liukuluvut, ja vasta kun mennään rajan eps*realmin alle tulee alivuoto. Jos laskutoimituksen tulosta ei ole määritelty reaaliluvuillakaan, esim. 0/0 tai /, on tuloksenanan eli ei-mikään-luku (not-a-number). >> 1.0e e+308 Inf >> 1.0e e308 -Inf >> 10ˆ >> 0/0 NaN >> Inf - Inf, Inf/Inf NaN NaN Yllä nähtiin ettei liukulukujen joukko ole suljettu yhteen- ja kertolaskun suhteen. Myöskään kaikki reaalilukujen laskulait eivät ole voimassa liukuluvuille. Yhteen- ja kertolaskun kommutatiivisuus on edelleen voimassa, mutta assosiatiivisuus ja distributiivisuus ei. Myöskään luku nolla ei ole enää yksikäsitteinen, kuten seuraavasta nähdään. >> a = 1;b = eps/2; >> (a + b) - a 0 >> a+b == a 1 Siis on olemassa ainakin yksi sellainen nollasta eroava b, että a+b=a. Näin on, sillä liukulukuja on äärellinen määrä, ja kun laskemme yhteen sellaiset luvut a ja b, että b<aja b<ε M, niin a+b=a. Esimerkiksi seuraavassa ei assosiativiisuus ole voimassa: 13
78 >> a = 1.0e+308; b = 1.1e+308; c = e+308; >> a + (b + c) e+308 >> (a + b) + c Inf Katsotaan vielä, millainen tarkkuuden menetys voi tapahtua, kun lasketaan yhteen kaksi vastakkaismerkkistä, mutta itseisarvoltaan likimain yhtäsuurta, lukua. >> x = 1.0e-15; ((1 + x) - 1)/x Tuloksena pitäisi olla tietenkin 1 millä tahansa x 0. Edellä ollutta ei ole tarkoitettu pelotteluksi liukulukujen kauheuksista. Itseasiassa liukulukuaritmetiikka on paitsi laskennallisesti tehokas myös matemaattisesti elegantti järjestelmä. Jos tutustuttaisiin aritmeettisten operaatioiden kuten yhteen- ja kertolaskun aivan perustaviin määritelmiin (ks. esim. kurssi Koulumatematiikan perusteet) huomattaisiin, että reaaliluvuilla laskeminen ei ole kovin käytännöllistä. Näin ollen Matlab ja suurin osa muistakin numeerisen laskennan ympäristöistä (ohjelmistot ja tietokoneet) käyttävät liukulukuaritmetiikkaa eli äärellistä määrää lukuja, äärellisellä tarkkuudella. Tästä aiheutuu edellä mainitut ilmiöt, kuten pyöristys eli konevakio, ylivuoto ja alivuoto. Suurimman osan aikaa niistä ei tarvitse huolehtia, mutta aina silloin tällöin on hyvä olla tietoinen liukulukujen ominaisuuksista ja niiden rajoituksista. Lähes aina laskutoimitukset tuottavat oikean vastauksen n. 15 desimaalin tarkkuudella (kaksoistarkkuudella laskettaessa). 2.3 Kokonaisluvut Matlabin muita numeerisia tietotyyppejä ovat kokonaisluvut (integers). Kokonaisluvut voivat olla joko tutusti etumerkillä varustettuja (signed integer, int) tai etumerkittömiä (unsigned integer, uint). Matlabissa kokonaisluvut voidaan esittää 8, 16, 32 tai 64:llä bitillä, joten kummankin tyyppisiä kokonaislukuja on neljää eri tyyppiä. Nämä kahdeksan kokonaislukutyyppiä ovat nimeltään int8, int16, int32, int64, uint8, uint16, uint32 ja uint64. Kokonaislukujen (ja yksinkertaisen tarkkuuden liukulukujen) käytöstä on hyötyä silloin, kun tarvitaan muistinkäytöltään tehokasta tapaa käsitellä lukuja. Esimerkiksi kuvien käsittelyssä kuva voidaan tallentaa niin, että yksittäisen pikselin arvo on 8-bittinen merkitön kokonaisluku, siis tyyppiä uint8, eikä 64-bittinen liukuluku elidouble. Näin toimiminen säästää muistitilaa kuten seuraavasta nähdään: >> a = 5; b = int8(5); whos Name Size Bytes Class Attributes a 1x1 8 double b 1x1 1 int8 14
79 Jo yhden luvun säilöminen tuottaa siis 8-kertaisen säästön tilassa. Sama ilmiö kertautuu myös useamman luvun tallentamisessa (vektorit ja matriisit). Kokonaislukutyyppien käyttöä rajoittaa se, että kullakin tyypillä on rajallinen määrittelyalue (range). Koska 8 bitillä voidaan esittää 2 8 = 256 lukua, niin etumerkillisenint8 tyypin alue on [ 2 7, 2 7 1] eli [ 128, 127]. Määrittelyalueen ulkopuoliset luvut katkaistaan joko ala- tai ylärajaan. Muiden tyyppien rajat selviävät HELPistä, esim.help uint16. Matlabissa on tuki myös kokonaisluku- ja yksinkertaisen tarkkuuden aritmetiikalle. Poikkeuksena on matriisien kerto- ja jakolasku, jotka eivät toimi kokonaislukutyypeillä. Lisäksi int64- ja uint64-tietotyypin data pitää muuttaa joko joksikin muuksi kokonaislukutyypiksi tai liukuluvuiksi. Seuraavassa on lyhyt esimerkki kokonaisluvuista. Huomaa, kuinka Matlab käsittelee luvut, jotka ovat tietotyypin määrittelyalueen ulkopuolella. >>format short >>lukuja = [ ]; >>int8(lukuja) >>intmax( int8 ) 127 >>uint8(lukuja) >>int16(lukuja) >> A = int8([4 5 ; 8 2]); B = int8([2 7 ; 3 6]); >> A - B, A + B >> A*B??? Error using ==> mtimes MTIMES is not fully supported for integer classes. At least one input must be scalar. >> 4*A 15
80 >> A = int64(a); B = int64(b); >> A - B, A + B??? Undefined function or method minus for input arguments of type int Totuusarvot Muita Matlabin tietotyyppejä on mm. looginen taulukko (logical array). Loogisella tietotyypillä esitetään totuusarvoja tosi (true) ja epätosi (false), käyttäen lukuja 1 ja 0. Kuten aikaisemmista luennoista muistetaan, vertailu- ja loogiset operaattorit palauttavat loogista tyyppiä olevan arvon. Numeerista tyyppiä olevia arvoja voidaan muuttaa loogisiksi funktiollalogical. Tällöin kaikki nollasta eroavat arvot muutetaan loogisiksi arvoiksi 1 ja nollat muutetaan loogiseksi arvoksi 0. Jos loogiselle taulukolle tehdään aritmeettisia operaatioita, niin taulukko muuttuu numeeriseksi. Seuraavassa on esimerkki loogisesta matriisista, lähinnä sen käytöstä matriisin indeksoinnissa. Lisäksi muutetaan looginen matriisi numeeriseksi. >>A = magic(3) A = >>B = logical(eye(3)) B = >>A(B) >>islogical(b) 1 >> B = 1+B B =
81 >>islogical(b) 0 >>isnumeric(b) Muuta Matlabin solutaulukko eli solukkocell array on tietotyyppi, johon voidaan tallentaa keskenään erityyppistä ja -kokoista dataa. Esimerkiksi voidaan tallettaa 4 3-looginen taulukko, uint8-taulukko ja matriisi saman solukon eri soluihin. Solut indeksoidaan positiivisilla kokonaisluvuilla, mutta jos halutaan käyttää indekseinä jotain muuta on käytettävä rakennetaulukoita (structure array). Rakennetaulukko koostuu nimetyistä kentistä, jotka sisältävät muita taulukoita. Kenttien sisältöön päästään käsiksi kunkin kentän nimellä. Solukkoja ja rakennetaulukoita käsitellään mahdollisesti myöhemmissä luennoissa. Aiemmin jo esitelty funktiokahva on myös Matlab-tietotyyppi. Koska Matlabin tietotyypit on toteutettu luokkina, on käyttäjän mahdollista määritellä omia tietotyyppejä periyttämällä ne rakennetaulukosta. Huomautettakoon vielä, että kaksoistarkkuuden ja loogiset matriisit voivat olla täysiä (full) tai harvoja (sparse). Matriisia sanotaan harvaksi, jos siinä on sen kokoon nähden paljon nollia ja vähän nollasta eroavia alkioita. Jos kyseessä on iso matriisi, jossa on paljon nollia, voidaan siis muistia säästää ja laskutoimituksia nopeuttaa käyttämällä sopivaa tietorakennetta, johon matriisista talletetaan vain nollasta eroavat alkiot ja niiden indeksit. Esim. >> A=zeros(1000,1000); A(213,121)=1; S=sparse(A) S = (213,121) 1 >> whos Name Size Bytes Class Attributes A 1000x double S 1000x double sparse Suurinta osaa Matlabin sisäänrakennetuista aritmeettisista, loogisista ja indeksointioperaatioista voidaan käyttää suoraan harvoille matriiseille. Huomautettakoon, että edellä luotiin ensin täysi matriisi A, joka muunnettiin harvaksi matriisiksi S. Saman harvan matriisin voi luoda myös suoraan sparse-komennolla ja näin siis välttää ensin täyden matriisin luomisen. Lisätietoa komennolla help sparse. 17
Matlabin perusteita Grafiikka
BL40A0000 SSKMO KH 1 Seuraavassa esityksessä oletuksena on, että Matlabia käytetään jossakin ikkunoivassa käyttöjärjestelmässä (PC/Win, Mac, X-Window System). Käytettäessä Matlabia verkon yli joko tekstipäätteeltä,
Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006
Harjoitus 1: Matlab Mat-2.2107 Sovelletun matematiikan tietokonetyöt Syksy 2006 Mat-2.2107 Sovelletun matematiikan tietokonetyöt 1 Harjoituksen aiheita Tutustuminen Matlab-ohjelmistoon Laskutoimitusten
Matemaattiset ohjelmistot A. Osa 2: MATLAB
Matemaattiset ohjelmistot 802364A Osa 2: MATLAB Mikko Orispää 30. lokakuuta 2013 Sisältö 1 MATLAB 2 1.1 Peruslaskutoimitukset......................... 2 1.2 Muuttujat................................ 3
Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.
Python linkit: Python tutoriaali: http://docs.python.org/2/tutorial/ Numpy&Scipy ohjeet: http://docs.scipy.org/doc/ Matlabin alkeet (Pääasiassa Deni Seitzin tekstiä) Matriisit ovat matlabin perustietotyyppejä.
Matlab-perusteet. Jukka Jauhiainen. OAMK / Tekniikan yksikkö. Hyvinvointiteknologian koulutusohjelma
Matlab-perusteet Jukka Jauhiainen OAMK / Tekniikan yksikkö Hyvinvointiteknologian koulutusohjelma Tämän materiaalin tarkoitus on antaa opiskelijalle lyhyehkö johdanto Matlabohjelmiston perusteisiin. Matlabin
MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 1 / vko 44
MS-A0003/A0005 Matriisilaskenta Laskuharjoitus / vko Tehtävä (L): Käynnistä Matlab-ohjelma ja kokeile laskea sillä muutama peruslaskutoimitus: laske jokin yhteen-, vähennys-, kerto- ja jakolasku. Laske
Valitse ruudun yläosassa oleva painike Download Scilab.
Luku 1 Ohjeita ohjelmiston Scilab käyttöön 1.1 Ohjelmiston lataaminen Ohjeet ohjelmiston lataamiseen Windows-koneelle. Mene verkko-osoitteeseen www.scilab.org. Valitse ruudun yläosassa oleva painike Download
Matriiseista. Emmi Koljonen
Matriiseista Emmi Koljonen 3. lokakuuta 22 Usein meillä on monta systeemiä kuvaavaa muuttujaa ja voimme kirjoittaa niiden välille riippuvaisuuksia, esim. piirin silmukoihin voidaan soveltaa silmukkavirtayhtälöitä.
Matlabperusteita, osa 1. Heikki Apiola Matlab-perusteita, osa 1. Heikki Apiola. 12. maaliskuuta 2012
Matlab-perusteita, 12. maaliskuuta 2012 Matlab-perusteita, Ohjelmahahmotelma 1. viikko: Matlab 2. viikko: Maple (+ annettujen Matlab tehtävien ratkaisuja) 3. viikko: Maple ja Matlab (lopputyöt) Matlab-perusteita,
Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37
Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37 Tehtävä 1: Käynnistä Matlab-ohjelma ja kokeile laskea sillä muutama peruslaskutoimitus: laske jokin yhteen-, vähennys-, kerto- ja jakolasku. Laske
Heikki Apiola, Juha Kuortti, Miika Oksman. 5. lokakuuta Matlabperusteita, osa 1
Matlab-perusteita, 5. lokakuuta 2015 Matlab-perusteita, Mikä on Matlab Matriisilaboratorio [Cleve Moler, Mathworks inc.] Numeerisen laskennan työskentely-ympäristö Suuri joukko matemaattisia ja muita funktioita,
Tässä dokumentissa on ensimmäisten harjoitusten malliratkaisut MATLABskripteinä. Voit kokeilla itse niiden ajamista ja toimintaa MATLABissa.
Laskuharjoitus 1A Mallit Tässä dokumentissa on ensimmäisten harjoitusten malliratkaisut MATLABskripteinä. Voit kokeilla itse niiden ajamista ja toimintaa MATLABissa. 1. tehtävä %% 1. % (i) % Vektorit luodaan
Ohjelman käynnistäminen
>> 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
BM20A0700, Matematiikka KoTiB2
BM20A0700, Matematiikka KoTiB2 Luennot: Matti Alatalo, Harjoitukset: Oppikirja: Kreyszig, E.: Advanced Engineering Mathematics, 8th Edition, John Wiley & Sons, 1999, luku 7. 1 Kurssin sisältö Matriiseihin
Zeon PDF Driver Trial
Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin
mlvektori 1. Muista, että Jacobin matriisi koostuu vektori- tai skalaariarvoisen funktion F ensimmäisistä
Aalto-yliopisto, Matematiikan ja Systeemianalyysin laitos mlvektori 1. Muista, että Jacobin matriisi koostuu vektori- tai skalaariarvoisen funktion F ensimmäisistä osittaisderivaatoista: y 1... J F =.
BL40A0000 Säätötekniikan ja signaalinkäsittelyn
1 BL40A0000 Säätötekniikan ja signaalinkäsittelyn matemaattiset ohjelmistot Luennot ja harjoitukset Katja Hynynen, h. 6431, p. 040-548 8954 [email protected] Opetus ja suoritusvaatimukset OPETUS: Luentoja
plot(f(x), x=-5..5, y=-10..10)
[] Jokaisen suoritettavan rivin loppuun ; [] Desimaalierotin Maplessa on piste. [] Kommentteja koodin sekaan voi laittaa # -merkin avulla. Esim. #kommentti tähän [] Edelliseen tulokseen voi viitata merkillä
PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2
PERUSLASKUJA Matemaattisten lausekkeiden syöttäminen: Kirjoita ilman välilyöntejä /+^2 Kirjoita muuten sama, mutta ota välilyönti :n jälkeen / +^2 Kopioi molemmat matematiikka-alueet ja liiku alueen sisällä
Harjoitus 10: Mathematica
Harjoitus 10: Mathematica Mat-2.2107 Sovelletun matematiikan tietokonetyöt Syksy 2006 Mat-2.2107 Sovelletun matematiikan tietokonetyöt 1 Harjoituksen aiheita Tutustuminen Mathematica-ohjelmistoon Mathematican
1 Matriisit ja lineaariset yhtälöryhmät
1 Matriisit ja lineaariset yhtälöryhmät 11 Yhtälöryhmä matriisimuodossa m n-matriisi sisältää mn kpl reaali- tai kompleksilukuja, jotka on asetetettu suorakaiteen muotoiseksi kaavioksi: a 11 a 12 a 1n
FUNKTION KUVAAJAN PIIRTÄMINEN
FUNKTION KUVAAJAN PIIRTÄMINEN Saat kuvapohjan painamalla @-näppäintä tai Insert/Graph/X-Y-POT. Kuvapohjassa on kuusi paikanvaraaja: vaaka-akselin keskellä muuttuja ja päissä minimi- ja maksimiarvot pystyakselin
Matematiikka B2 - Avoin yliopisto
6. elokuuta 2012 Opetusjärjestelyt Luennot 9:15-11:30 Harjoitukset 12:30-15:00 Tentti Kurssin sisältö (1/2) Matriisit Laskutoimitukset Lineaariset yhtälöryhmät Gaussin eliminointi Lineaarinen riippumattomuus
Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi
Matriisit, L20 Merkintöjä 1 Matriisi on suorakulmainen lukukaavio. Matriiseja ovat esimerkiksi: ( 2 0.4 8 0 2 1 ) ( 0, 4 ), ( ) ( 1 4 2, a 11 a 12 a 21 a 22 ) Merkintöjä 1 Matriisi on suorakulmainen lukukaavio.
wxmaxima-pikaopas Ari Lehtonen
wxmaxima-pikaopas Ari Lehtonen. Yleistä Maxima on laaja symboliseen laskentaan suunniteltu ohjelma. Maximalla voidaan sieventää lausekkeita, jakaa polynomeja tekijöihin, ratkaista yhtälöitä, derivoida,
Matriisit, kertausta. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi
Matriisit, kertausta Merkintöjä 1 Matriisi on suorakulmainen lukukaavio. Matriiseja ovat esimerkiksi: ( 2 0.4 8 0 2 1 ) ( 0, 4 ), ( ) ( 1 4 2, a 11 a 12 a 21 a 22 ) Kaavio kirjoitetaan kaarisulkujen väliin
Harjoitus 1: Johdatus matemaattiseen mallintamiseen (Matlab)
Harjoitus 1: Johdatus matemaattiseen mallintamiseen (Matlab) SCI-C0200 Fysiikan ja matematiikan menetelmien studio SCI-C0200 Fysiikan ja matematiikan menetelmien studio 1 MyCourses Kurssilla käytetään
Harjoitus 1: Johdatus matemaattiseen mallintamiseen (Matlab)
Harjoitus 1: Johdatus matemaattiseen mallintamiseen (Matlab) MS-C2107 Sovelletun matematiikan tietokonetyöt MS-C2107 Sovelletun matematiikan tietokonetyöt 1 Ensimmäinen harjoituskierros Aiheet Tutustuminen
MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45
MS-A0003/A0005 Matriisilaskenta Laskuharjoitus / vko 5 Tehtävä 1 (L): Hahmottele kompleksitasoon ne pisteet, jotka toteuttavat a) z 3 =, b) z + 3 i < 3, c) 1/z >. Yleisesti: ehto z = R, z C muodostaa kompleksitasoon
Matlab- ja Maple- ohjelmointi
Perusasioita 2. helmikuuta 2005 Matlab- ja Maple- ohjelmointi Yleistä losoaa ja erityisesti Numsym05-kurssin tarpeita palvellee parhaiten, jos esitän asian rinnakkain Maple:n ja Matlab:n kannalta. Ohjelmien
MS-A0003/A0005 Matriisilaskenta Malliratkaisut 5 / vko 48
MS-A3/A5 Matriisilaskenta Malliratkaisut 5 / vko 48 Tehtävä (L): a) Onko 4 3 sitä vastaava ominaisarvo? b) Onko λ = 3 matriisin matriisin 2 2 3 2 3 7 9 4 5 2 4 4 ominaisvektori? Jos on, mikä on ominaisarvo?
Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi
Matriisit, L20 Merkintöjä 1 Matriisi on suorakulmainen lukukaavio. Matriiseja ovat esimerkiksi: ( 2 0.4 8 0 2 1 ( 0, 4, ( ( 1 4 2, a 11 a 12 a 21 a 22 Kaavio kirjoitetaan kaarisulkujen väliin (amer. kirjoissa
Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus
Perusohjeita, symbolista laskentaa Geogebralla Kielen vaihtaminen. Jos Geogebrasi kieli on vielä englanti, niin muuta se Options välilehdestä kohdasta Language suomeksi (finnish). Esittelen tässä muutaman
PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2 3
PERUSLASKUJA Matemaattisten lausekkeiden syöttäminen: Kirjoita ilman välilyöntejä 3/+^ 3 Kirjoita muuten sama, mutta ota välilyönti :n jälkeen 3/ +^ 3 Liiku matematiikka alueella nuolinäppäimin. Kokeile
110. 111. 112. 113. 114. 4. Matriisit ja vektorit. 4.1. Matriisin käsite. 4.2. Matriisialgebra. Olkoon A = , B = Laske A + B, 5 14 9, 1 3 3
4 Matriisit ja vektorit 4 Matriisin käsite 42 Matriisialgebra 0 2 2 0, B = 2 2 4 6 2 Laske A + B, 2 A + B, AB ja BA A + B = 2 4 6 5, 2 A + B = 5 9 6 5 4 9, 4 7 6 AB = 0 0 0 6 0 0 0, B 22 2 2 0 0 0 6 5
T211003 Sovellusohjelmat Matlab osa 4: Skriptit, funktiot ja kontrollirakenteet
Ohjelmointi Matlab-komentoja voidaan koota ns. M-tiedostoon. Nimi tulee tiedoston tarkentimesta.m. Matlabilla voidaan ohjelmoida kahdella eri tavalla: Skriptit eli komentojonot eli makrot Funktiot eli
ELEC-C5210 Satunnaisprosessit tietoliikenteessä Harjoitus M1,
ELEC-C5210 Satunnaisprosessit tietoliikenteessä Harjoitus M1, 16.3.2017 1. Syntaksista, vektoreista ja matriiseista: Tehtävän eri kohdat on tehtävä järjestyksessä. Myöhemmissä kohdissa oletetaan, että
Matlab-perusteet Harjoitustehtävien ratkaisut
Matlab-perusteet Harjoitustehtävien ratkaisut Osa 1 Tehtävä: Määrittele muuttujat a ja b, anna niille vaikkapa arvot 3 ja 2 ja kokeile peruslaskutoimituksia niillä. >>a=1;b=2; >>a+b 3 >>a-b -1 >>a*b 2
1.1. Määritelmiä ja nimityksiä
1.1. Määritelmiä ja nimityksiä Luku joko reaali- tai kompleksiluku. R = {reaaliluvut}, C = {kompleksiluvut} R n = {(x 1, x 2,..., x n ) x 1, x 2,..., x n R} C n = {(x 1, x 2,..., x n ) x 1, x 2,..., x
Matematiikka B2 - TUDI
Matematiikka B2 - TUDI Miika Tolonen 3. syyskuuta 2012 Miika Tolonen Matematiikka B2 - TUDI 1 Kurssin sisältö (1/2) Matriisit Laskutoimitukset Lineaariset yhtälöryhmät Gaussin eliminointi Lineaarinen riippumattomuus
z 1+i (a) f (z) = 3z 4 5z 3 + 2z (b) f (z) = z 4z + 1 f (z) = 12z 3 15z 2 + 2
BM20A5700 - Integraauunnokset Harjoitus 2 1. Laske seuraavat raja-arvot. -kohta ratkeaa, kun pistät sekä yläkerran että alakerran muotoon (z z 1 )(z z 2 ), missä siis z 1 ja z 2 ovat näiden lausekkeiden
Johdatus tekoälyn taustalla olevaan matematiikkaan
Johdatus tekoälyn taustalla olevaan matematiikkaan Informaatioteknologian tiedekunta Jyväskylän yliopisto 5. luento.2.27 Lineaarialgebraa - Miksi? Neuroverkon parametreihin liittyvät kaavat annetaan monesti
1.1 Vektorit. MS-A0007 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n. 1. Vektorit ja kompleksiluvut
ja kompleksiluvut ja kompleksiluvut 1.1 MS-A0007 Matriisilaskenta 1. ja kompleksiluvut Nuutti Hyvönen, c Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 26.10.2015 Reaalinen
Matematiikan tukikurssi, kurssikerta 3
Matematiikan tukikurssi, kurssikerta 3 1 Epäyhtälöitä Aivan aluksi lienee syytä esittää luvun itseisarvon määritelmä: { x kun x 0 x = x kun x < 0 Siispä esimerkiksi 10 = 10 ja 10 = 10. Seuraavaksi listaus
Matemaattiset ohjelmistot 1-2 ov, 2-3 op
Matemaattiset ohjelmistot 1-2 ov, 2-3 op Aloitustehtävät Perehdy netissä olevan oppaan http://mtl.uta.fi/opetus/matem_ohjelmistot/matlab lukuihin 0 Johdanto, 1 matriisit ja vektorit sekä 4 Ohjelmointi
Harjoitus 1 -- Ratkaisut
Kun teet harjoitustyöselostuksia Mathematicalla, voit luoda selkkariin otsikon (ja mahdollisia alaotsikoita...) määräämällä soluille erilaisia tyylejä. Uuden solun tyyli määrätään painamalla ALT ja jokin
Scilab 5.3.3 - ohjelman alkeisohjeet
Pohdin projekti Scilab 5.3.3 - ohjelman alkeisohjeet Käytön aloittaminen Ohjelma käynnistetään kaksoisklikkaamalla työpöydällä ohjelman kuvaketta ja ohjelman käyttö lopetetaan käyttämällä komentoa exit
3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä
3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä Lineaarinen m:n yhtälön yhtälöryhmä, jossa on n tuntematonta x 1,, x n on joukko yhtälöitä, jotka ovat muotoa a 11 x 1 + + a 1n x n = b 1 a 21
Opiskelijan pikaopas STACK-tehtäviin. Lassi Korhonen, Oulun yliopisto
Opiskelijan pikaopas STACK-tehtäviin Lassi Korhonen, Oulun yliopisto 21.3.2016 SISÄLLYSLUETTELO Oppaan käyttäminen... 2 Vastauksen syöttämisen perusteet... 2 Operaatiot... 2 Luvut ja vakiot... 3 Funktiot...
Kieliteknologian ATK-ympäristö Kolmas luento
Kieliteknologian ATK-ympäristö Kolmas luento Miikka Silfverberg Nykykielten laitos 20. syyskuuta 2010 Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 3 20. syyskuuta 2010
Harjoitus 1 -- Ratkaisut
Kun teet harjoitustyöselostuksia Mathematicalla, voit luoda selkkariin otsikon (ja mahdollisia alaotsikoita...) määräämällä soluille erilaisia tyylejä. Uuden solun tyyli määrätään painamalla ALT ja jokin
FUNKTION KUVAAJAN PIIRTÄMINEN
FUNKTION KUVAAJAN PIIRTÄMINEN Saat kuvapohjan Plots/Insert Plot/XY plot Huomaa - ja y-akselin paikanvaraajat (ja näissä valmiina yksikön syöttöruutu). Siirrä - akselia ylös/alas. Palauta origo perinteiseen
Ominaisarvo-hajoitelma ja diagonalisointi
Ominaisarvo-hajoitelma ja a 1 Lause 1: Jos reaalisella n n matriisilla A on n eri suurta reaalista ominaisarvoa λ 1,λ 2,...,λ n, λ i λ j, kun i j, niin vastaavat ominaisvektorit x 1, x 2,..., x n muodostavat
Valokuvien matematiikkaa
Valokuvien matematiikkaa Avainsanat: valokuva, pikseli, päättely Luokkataso: 3.-5. luokka, 6.-9. luokka, lukio, yliopisto Välineet: Kynä, tehtävämonisteet (liitteenä), mahdollisiin jatkotutkimuksiin tietokone
Talousmatematiikan perusteet: Luento 9. Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Transponointi Matriisitulo
Talousmatematiikan perusteet: Luento 9 Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Transponointi Matriisitulo Viime luennolta Esim. Yritys tekee elintarviketeollisuuden käyttämää puolivalmistetta,
Laskuharjoitus 9, tehtävä 6
Aalto-yliopiston perustieteiden korkeakoulu Jouni Pousi Systeemianalyysin laboratorio Mat-2.4129 Systeemien identifiointi Laskuharjoitus 9, tehtävä 6 Tämä ohje sisältää vaihtoehtoisen tavan laskuharjoituksen
3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä
1 3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä Lineaarinen m:n yhtälön yhtälöryhmä, jossa on n tuntematonta x 1,, x n on joukko yhtälöitä, jotka ovat muotoa a 11 x 1 + + a 1n x n = b 1 a
Neliömatriisi A on ortogonaalinen (eli ortogonaalimatriisi), jos sen alkiot ovat reaalisia ja
7 NELIÖMATRIISIN DIAGONALISOINTI. Ortogonaaliset matriisit Neliömatriisi A on ortogonaalinen (eli ortogonaalimatriisi), jos sen alkiot ovat reaalisia ja A - = A T () Muistutus: Kokoa n olevien vektorien
Harjoitus 3 -- Ratkaisut
Harjoitus 3 -- Ratkaisut 1 ' '-merkki kirjoitetaan =, ' '-merkki!=, ' '-merkki ==. Yhtälöiden ratkaisusta puhutaan lisää myöhemmin. a f x, y : If ehtolauseke x y, y tämä palautetaan, jos
Matriisilaskenta Laskuharjoitus 5 - Ratkaisut / vko 41
MS-A0004/MS-A0006 Matriisilaskenta, I/06 Matriisilaskenta Laskuharjoitus 5 - Ratkaisut / vko 4 Tehtävä 5 (L): a) Oletetaan, että λ 0 on kääntyvän matriisin A ominaisarvo. Osoita, että /λ on matriisin A
Lineaarialgebra ja matriisilaskenta I
Lineaarialgebra ja matriisilaskenta I 30.5.2013 HY / Avoin yliopisto Jokke Häsä, 1/19 Käytännön asioita Kurssi on suunnilleen puolessa välissä. Kannattaa tarkistaa tavoitetaulukosta, mitä on oppinut ja
Mat-1.C Matemaattiset ohjelmistot
Mat-.C Matemaattiset ohjelmistot Luento ma 9.3.0 $z; Error, (in rtable/product) invalid arguments.z; z C z C z3 3 C z4 4 C z5 5.Tr z ; z C z C z3 3 C z4 4 C z5 5 ; Error, (in rtable/power) eponentiation
IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
1.1 Vektorit. MS-A0004/A0006 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n.
ja kompleksiluvut ja kompleksiluvut 1.1 MS-A0004/A0006 Matriisilaskenta 1. ja kompleksiluvut Nuutti Hyvönen, c Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 8.9.015 Reaalinen
ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014
18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
Matriisien tulo. Matriisit ja lineaarinen yhtälöryhmä
Matriisien tulo Lause Olkoot A, B ja C matriiseja ja R Tällöin (a) A(B + C) =AB + AC, (b) (A + B)C = AC + BC, (c) A(BC) =(AB)C, (d) ( A)B = A( B) = (AB), aina, kun kyseiset laskutoimitukset on määritelty
1. Lineaarialgebraa A := Matriisin osia voidaan muutella päivittämällä riviä, saraketta tai osamatriisia (Matlabmaisesti): B :=
27. elokuuta 202 2 27. elokuuta 202 www.math.hut/~apiola/maple/la.pdf. Lineaarialgebraa Maplen matriisi- ja vektorioperaatiot ovat kirjastopakkauksissa LinearAlgebra ja linalg. Keskitymme pääasiassa edelliseen,
PERUSLASKUJA. Kirjoita muuten sama, mutta ota KAKSI välilyöntiä (SEURAA ALUEMERKINTÄÄ) 4:n jälkeen 3/4 +5^2
PERUSLASKUJA Matemaattisten lausekkeiden syöttäminen: Kirjoita ilman välilyöntejä 3/4+^2 3 4+ 2 Kirjoita muuten sama, mutta ota KAKSI välilyöntiä (SEURAA ALUEMERKINTÄÄ) 4:n jälkeen 3/4 +^2 3 + 4 2 Kopioi
Octave-opas. Mikä on Octave ja miksi? Asennus
Octave-opas Mikä on Octave ja miksi? Asennus Käynnistys ja käyttöliittymä Komennot tiedostojen hallintaan SciTE-editor.m-tiedostot Ohjeita muualla Mikä on Octave ja miksi? Octave on numeeriseen laskentaan
Luento 8: Epälineaarinen optimointi
Luento 8: Epälineaarinen optimointi Vektoriavaruus R n R n on kaikkien n-jonojen x := (x,..., x n ) joukko. Siis R n := Määritellään nollavektori 0 = (0,..., 0). Reaalisten m n-matriisien joukkoa merkitään
Insinöörimatematiikka D
Insinöörimatematiikka D M. Hirvensalo [email protected] V. Junnila [email protected] Matematiikan ja tilastotieteen laitos Turun yliopisto 2015 M. Hirvensalo [email protected] V. Junnila [email protected] Luentokalvot
Muuttujien määrittely
Tarja Heikkilä Muuttujien määrittely Määrittele muuttujat SPSS-ohjelmaan lomakkeen kysymyksistä. Harjoitusta varten lomakkeeseen on muokattu kysymyksiä kahdesta opiskelijoiden tekemästä Joupiskan rinneravintolaa
Harjoitus 4 -- Ratkaisut
Harjoitus -- Ratkaisut 1 Ei kommenttia. Tutkittava funktio: In[15]:= f x : x 1 x Sin x ; Plot f x, x, 0, 3 Π, PlotRange All Out[159]= Luodaan tasavälinen pisteistö välille 0 x 3 Π. Tehdään se ensin kiinnitetyllä
Oppimistavoitematriisi
Oppimistavoitematriisi Lineaarialgebra ja matriisilaskenta I Esitiedot Arvosanaan 1 2 riittävät Arvosanaan 3 4 riittävät Arvosanaan 5 riittävät Yhtälöryhmät (YR) Osaan ratkaista ensimmäisen asteen yhtälöitä
5 OMINAISARVOT JA OMINAISVEKTORIT
5 OMINAISARVOT JA OMINAISVEKTORIT Ominaisarvo-ongelma Käsitellään neliömatriiseja: olkoon A n n-matriisi. Luku on matriisin A ominaisarvo (eigenvalue), jos on olemassa vektori x siten, että Ax = x () Yhtälön
(1.1) Ae j = a k,j e k.
Lineaarikuvauksen determinantti ja jälki 1. Lineaarikuvauksen matriisi. Palautetaan mieleen, mikä lineaarikuvauksen matriisi annetun kannan suhteen on. Olkoot V äärellisulotteinen vektoriavaruus, n = dim
Matriisi-vektori-kertolasku, lineaariset yhtälöryhmät
Matematiikan peruskurssi K3/P3, syksy 25 Kenrick Bingham 825 Toisen välikokeen alueen ydinasioita Alla on lueteltu joitakin koealueen ydinkäsitteitä, joiden on hyvä olla ensiksi selvillä kokeeseen valmistauduttaessa
A = a b B = c d. d e f. g h i determinantti on det(c) = a(ei fh) b(di fg) + c(dh eg). Matriisin determinanttia voi merkitä myös pystyviivojen avulla:
11 Determinantti Neliömatriisille voidaan laskea luku, joka kertoo muun muassa, onko matriisi kääntyvä vai ei Tätä lukua kutsutaan matriisin determinantiksi Determinantilla on muitakin sovelluksia, mutta
Oppimistavoitematriisi
Oppimistavoitematriisi Lineaarialgebra ja matriisilaskenta I Arvosanaan 1 2 riittävät Arvosanaan 5 riittävät Yhtälöryhmät (YR) Osaan ratkaista ensimmäisen asteen yhtälöitä ja yhtälöpareja Osaan muokata
Harjoitus 2 -- Ratkaisut
Harjoitus -- Ratkaisut Listat a Table-komento Huom. (*-merkki aloittaa kommentin ja *)-merkki päättää sen. Table x, x,. x:n arvo, viimeinen x:n arvo, askelpituus, 4, 9, 6, 5, 36, 49, 64, 8,,, 44, 69, 96,
= 2 L L. f (x)dx. coshx dx = 1 L. sinhx nπ. sin. sin L + 2 L. a n. L 2 + n 2 cos. tehdään approksimoinnissa virhe, jota voidaan arvioida integraalin
BMA7 - Integraalimuunnokset Harjoitus 9. Määritä -jaksollisen funktion f x = coshx, < x < Fourier-sarja. Funktion on parillinen, joten b n = kun n =,,3,... Parillisuudesta johtuen kertoimet a ja a n saadaan
ATK tähtitieteessä. Osa 2 - IDL perusominaisuudet. 12. syyskuuta 2014
12. syyskuuta 2014 IDL - Interactive Data Language IDL on tulkattava ohjelmointikieli, jonka vahvuuksia ovat: Yksinkertainen, johdonmukainen komentosyntaksi. Voidaan käyttää interaktiivisesti, tai rakentamalla
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen
Matlabin perusteet. 1. Käyttöliittymä:
Matlabin perusteet Matlabin (MATrix LABoratory) perusfilosofia on, että se käsittelee kaikkia muuttujia matriiseina, joiden erikoistapauksia ovat vektorit ja skalaariluvut. Näin ollen se soveltuu erityisesti
Luento 4. Timo Savola. 21. huhtikuuta 2006
UNIX-käyttöjärjestelmä Luento 4 Timo Savola 21. huhtikuuta 2006 Osa I Shell Lausekkeet Komentoriville kirjotettu komento on lauseke echo "foo" echo $USER MUUTTUJA=1 ls -l Rivinvaihto
. Kun p = 1, jono suppenee raja-arvoon 1. Jos p = 2, jono hajaantuu. Jono suppenee siis lineaarisesti. Vastaavasti jonolle r k+1 = r k, suhde on r k+1
TEKNILLINEN KORKEAKOULU Systeemianalyysin laboratorio Mat-.39 Optimointioppi Kimmo Berg 8. harjoitus - ratkaisut. a)huomataan ensinnäkin että kummankin jonon raja-arvo r on nolla. Oletetaan lisäksi että
Mukavia kokeiluja ClassPad 330 -laskimella
Mukavia kokeiluja ClassPad 330 -laskimella Tervetuloa tutustumaan Casio ClassPad laskimeen! Jos laskin ei ole yksin omassa käytössäsi, on hyvä tyhjentää aluksi muistit ja näytöt valikosta Edit->Clear All
802118P Lineaarialgebra I (4 op)
802118P Lineaarialgebra I (4 op) Tero Vedenjuoksu Oulun yliopisto Matemaattisten tieteiden laitos 2012 Lineaarialgebra I Yhteystiedot: Tero Vedenjuoksu [email protected] Työhuone M206 Kurssin kotisivu
811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen
Muuttujan sisällön näet kirjoittamalla sen nimen ilman puolipistettä
Aalto-yliopisto, Matematiikan ja Systeemianalyysin laitos -e mlkompleksianalyysi 1. mlk001.tex Ensiapuohjeita Sijoitus muuttujaan esim: >> z=(1+i)/(1-2*i) Puolipiste lopussa estää tulostuksen. Muuttujan
1 Ominaisarvot ja ominaisvektorit
1 Ominaisarvot ja ominaisvektorit Olkoon A = [a jk ] n n matriisi. Tarkastellaan vektoriyhtälöä Ax = λx, (1) 1 missä λ on luku. Sellaista λ:n arvoa, jolla yhtälöllä on ratkaisu x 0, kutsutaan matriisin
Lineaarialgebra ja matriisilaskenta I
Lineaarialgebra ja matriisilaskenta I 29.5.2013 HY / Avoin yliopisto Jokke Häsä, 1/26 Kertausta: Kanta Määritelmä Oletetaan, että w 1, w 2,..., w k W. Vektorijono ( w 1, w 2,..., w k ) on aliavaruuden
MS-C1340 Lineaarialgebra ja
MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt Vektoriavaruudet Riikka Kangaslampi kevät 2017 Matematiikan ja systeemianalyysin laitos Aalto-yliopisto Idea Lineaarisen systeemin ratkaiseminen Olkoon
