http://www.math.hut.fi/teaching/v/matlab/opas/osa1.html      Päivitetty 14.9.01

Osa 1. Alkuunpääsy

0. Johdanto

Matlab on interaktiivinen vektori- ja matriisilaskentaohjelmisto. Se on matriisikieli, joka soveltuu mitä moninaisimpiin tieteellisen ja teknisen laskennan tehtäviin.

Cleve Moler kirjoitti alkuperäisen Matlabin Fortran-version 1970-luvun loppupuolella pienimuotoiseksi matriisilaskennan opetusohjelmaksi. Kyseessä oli Fortranilla kirjoitettu matriisitulkki, joka käytti LINPACK- ja EISPACK- kirjastojen rutiineja laskentakoneenaan. Vaiheita:

Esikuvia kielelle: "Speak Easy" ja APL (Kenneth Iverson 1960-luvulla, Jim Brown, IBM Yorktown Heights: APL2 1984, ...)

Nykyisin : "Teollisuusstandardin asemassa", suuri määrä ammattimaisia toolboxeja.

Matlab on saatavissa kaikkiin ajateltavissa oleviin käyttöjärjestelmiin. Matlab-koodit ja työtilat talletetaan tekstimuodossa, mikä takaa ongelmattoman siirrettävyyden eri ympäristöjen välillä.

Matlab-ohjelman lisenssin omistaa The MathWorks, Inc.,

-> Sisällysluetteloon <-


1. Käynnistys ja työtila, avustus

Matlab käynnistyy joko komennolla matlab tai kaksoisklikkaamalla Matlab-ikonia.
TKK:n UNIX:ssa
        use matlab
        matlab
Ohjelma lopetetaan komennolla

        >> quit

tai sulkemalla hiirellä Matlab-ikkuna.
                              < M A T L A B >
                  Copyright 1984-1999 The MathWorks, Inc.
                         Version 5.3.0.10183 (R11)
                                Jan 21 1999

 
  To get started, type one of these: helpwin, helpdesk, or demo.
  For product information, type tour or visit www.mathworks.com.
Yllä näkyy Matlab 5:n tyyli. Versiossa 6 on uusi graafinen käyttöliittymä, joka helpottaa istunnon ja Matlabin ns. m-tiedostojen tallettamista, suorittamista ja hallintaa. Matlabin versiossa 6 saadaan ylläolevanlainen käyttöliittymä aloituskomennolla
     matlab -nodesktop
Pitäydymme etupäässä tässä riisutussa käyttöliittymässä. Uuteen graafiseen käyttöliittymään on helpointa tutustua yksinkertaisesti alkamalla käyttää sitä.

Ohjelman käynnistyttyä, tulkki antaa kehotteen >> . Tällöin sille voidaan kirjoittaa Matlab-komentoja.

Ensimmäinen Matlab-istuntoesimerkki

>> v=[1; 2; 3]                 % Muodostetaan pystyvektori v
v =
     1
     2
     3
>> A=[1 -1 0;2+3*i 4.5 7;5 6 -1] % Muodostetaan 3 x 3-matriisi A
A =
   1.0000            -1.0000                  0          
   2.0000 + 3.0000i   4.5000             7.0000          
   5.0000             6.0000            -1.0000          
>> A*v                          % Matriisi kertaa vektori
ans =
  -1.0000          
  32.0000 + 3.0000i
  14.0000 

Mitä opimme:

Osittain esimerkin ulkopuolelta kannattaa tässä vaiheessa vielä mainita:

Pienimuotoista Matlab-laskentaa voi harrastaa komentoikkunassa. Komentoja voi selata nuoli-ylös-näppäimellä samaan tapaan kuin Unix:n tcshellissä ja komentoriviä voi editoida.

Vähänkin vakavampihenkinen työskentely kannattaa järjestää erillistä editori-ikkunaa hyödyntäen. Editorina voi käyttää Matlabin omaa File-valikosta avautuvaa editoria (Windows:ssa jo versiossa 5, Unix:ssa versiosta 6 alkaen). Yhtä hyvin voi käyttää mitä tahansa tekstieditoria, Unix:ssa luonnollisin lienee Gnu Emacs .

Komennot voidaan kirjoittaa tekstitiedostoon, vaikkapa komennot.m. Kun tiedoston nimi (ilman m-tarkennetta) kirjoitetaan Matlab- komentoikkunassa, tulkki suorittaa komennot, aivan kuin ne kirjoitettaisiin peräkkäin Matlab-istuntoon. Siis >> komennot (tällöin on vain huolehdittava siitä, että tiedosto on joko työhakemistossa tai Matlab-polun (path) varrella. Vaihtoehtoisesti komennot voidaan koota tekstitiedostoon doku.txt tai vaikkapa doku.html. Tällöin tiedostossa olevia komentoja voidaan leikkaus/liimaus-hiirioperaatiolla siirtää komentoikkunan ja dokumentin välillä.

Komentojonotiedostoja kutsutaan lyhyesti skripteiksi. Skriptit ja funktiotiedostot ovat yhteiseltä nimeltään m-tiedostoja, molemmat ovat tyyppiä tied.m olevia tekstitiedostoja. Funktiotiedosto alkaa avainsanalla function ja se toimii, kuten funktion kuuluu: sille annetaan syöteparametreja, ja se palauttaa yhden tai useamman tulosarvon.

Katso lähemmin ja ... ref**

-> Sisällysluetteloon <-


Avustus- ja opastus

Avustusta (kts. Hig s. 24:) on saatavissa komennoilla.
     help, helpwin, helpdesk, lookfor

"Desktop" versiossa 6 antaa myös valikkopohjaisesti

helpdesk käynnistää www-pohjaisen laajan avustus- ja opiskelujärjestelmän hakuineen ym.

Komento help on kätevä käyttää ja help-dokumentaatio on hyvin helppo liittää omiin funktioihin.
Varjopuolena on, että hakusana täytyy tietää tarkalleen. Komennolla lookfor voidaan etsiä "sinnepäin-hakusanaa". Se saattaa olla hieman hidas ja joskus antaa liikaakin tulostusta. Kannattaa kokeilla joka tapauksessa.

Työtila

(Kts. doc -> getting started -> The Matlab environment ) Työtila (workspace) on Matlab-komentotilasta hallittavissa oleva alue tietokoneen muistissa.
who   - muuttujien nimet
whos  - lisäksi koko- ja talletusinformaatio
clear - työtilan muuttujien vapauttaminen arvoistaan
why   - elämää suuremmat kysymykset
Komennon keskeytys : CTRL-C
(Tyypillinen tilanne: suurta matriisia käsittelevä komento unohdetaan päättää tulostuksen estävään puolipisteeseen (Kantapään kautta opitaan pian.).)

-> Sisällysluetteloon <-


2. Vektorit ja matriisit

Matlabin alkuperäinen tietorakenne on matriisi, jonka alkiot ovat Fortranin kaksoistarkkuuden reaalisia tai kompleksisisia liukulukuja (n. 16 numeroa 10-järjestelmässä) Versiosta 5 alkaen tietorakenteita on lisätty, keskitymme aluksi pelkästään alkuperäiseen matriisityyppiin.

Vektoreita ja skalaareja voidaan pitää erikoistapauksina matriisista, viimemainittu on 1 x 1 - matriisi. Tästä ajattelusta seuraa, että rivivektorit ja sarakevektorit erotellaan toisistaan, edelliset ovat 1 x n - ja jälkimmäiset n x 1 - kokoisia matriiseja, missä n on vektorin pituus.

Versiosta 5 alkaen Matlabissa on myös sisäkkäisiä ja moniulotteisia rakenteita.

2.1 Matriisien muodostaminen ja alkioiden poiminta

Matriiseja voidaan luoda eri tavoilla:

Aloitetaan muodostamalla 3 x 3-matriisi A:
      >> A = [1 2 3; 4 5 6; 7 8 9]
Matlab näyttää komennon tuloksen tai muuttujan sisällön (jota emme tässä kuitenkaan näytä), ellei komentoa päätetä puolipisteellä.

Rivien erottimena on puolipiste, rivin alkioiden erottimena voidaan käyttää tyhjän ohella myös pilkkua. Rivierottimena käy myös rivinvaihto, selkeämpää lienee tällöin kirjoittaa myös puolipiste.
Sama matriisi voitaisiin siten kirjoittaa vaikkapa näin:

      >> A = [1 2 3; 
              4 5 6;
              7 8 9];
Tässä päätimme komennon puolipisteeseen, joten Matlab-tulkki ei tulosta ruudulle matriisin A sisältöä. Otamme pienen esimerkki-istunnon vektoreista.
>> format compact  % Tulostusasua säätelevä komento.
>> v=[1 2 3 4 5]   % v=[1,2,3,4,5]  % Pilkut käyvät myös. 
v =
     1     2     3     4     5

>> v=1:5;             % Sama vektori saadaan kätevämmin näin.
                      % help colon (lähemmin kohdassa 11)
>> vt=v'              % Transponoidaan pystyvektoriksi.
vt =
     1
     2
     3
     4
     5
>> [1;2;3;4;5]        % Pystyvektori voidaan luoda myös suoraan.
ans =                 % Tässä emme sijoita sitä arvoksi millekään
     1                % muuttujalle. Matlab antaa sille nimen ans,
     2                % johon voidaan viitata, kuten mihin tahansa
     3                % muuttujaan. Tämä pätee vain viimeksi suoritettuun
     4                % komentoon. (Vrt. Maplen %)
     5 

Matriisin alkion poiminta

Matiisin A alkio ai,j poimitaan kirjoittamalla >> A(i,j) . Sille voidaan myös sijoittaa uusi arvo komentamalla esimerkiksi >> A(2,3)=-10

Vektorin (niin vaaka- kuin pysty) indeksointiin riittää yksi indeksi.

A(1,:) ilmaisee A-matriisin ensimmäisen rivin, yksinäinen kaksoispiste jälkimmäisenä indeksinä tarkoittaa, että sarakeindeksi käy läpi kaikki arvonsa . Vastaavasti A(:,2) tarkoitta A:n toista saraketta. Edelleen, A(2:4,3:6) poimii riveistä [2,3,4] sarakkeet [3,4,5,6]

Pelkkä kaksoispiste matriisin indeksinä tarkoittaa, että molemmat indeksit saavat kaikki mahdollset arvonsa. Tällöin tulee tietää, kumpaa matriisin indeksisuuntaa pidetään ensisijaisena. Paljastamme asian nyt: Matlab on sarakeorientoitunut, eli järjestys on : 1. sarake, 2. sarake, ...

Esim

>> A=reshape(1:12,4,3)   % Kätevä tapa muotoilla vektorista matriisi. 
>> A(:)                  % Jonoutus sarakkeittain.

Indeksointia ja kaksoispistenotaatiota käsitellään tarkemmin kohdassa 11 ... Kts. myös [SKK] 2.9, ss. 23 - 25.


-> Sisällysluetteloon <-


2.2 Vektorilausekkeita, kuvaajan piirto

Esimerkkinä vektoreilla operoinnista tarkastelemme yhden muuttujan funktion kuvaajaan liittyvän datan muodostamista ja piirtoa.

Halutkaamme piirtää funktio f(x)=sin(2*pi*x) välillä [0,1].
Tarvitsemme

Piirtoesimerkki

>> x=[0 0.25 0.5 0.75 1]  % Havainnollisuuden vuoksi harva pisteistö.
x =
         0    0.2500    0.5000    0.7500    1.0000
>> y=sin(2*pi*x)          % sin-funktio operoi jokaiseen x-vektorin
                          % komponenttiin  (skaalarifunktio) 
                          

y =
         0    1.0000    0.0000   -1.0000   -0.0000

>> [x' y']               % Pisteparien taulukko saadaan laittamalla pystyyn
                         % transponoidut vektorit vierekkäin 2-sarakkeiseksi 
                         % matriisiksi.(Tämä vain asian havainnollistamiseksi)
ans =
         0         0
    0.2500    1.0000
    0.5000    0.0000
    0.7500   -1.0000
    1.0000   -0.0000
>> plot(x,y)             % Yhdistetään edellä olevat (x,y)-parit murtoviivalla.

images/kuva1.gif images/kuva2.gif
Jako 4:ään osaväliin Jako 29:ään osaväliin

Tarkemman kuvan saamme jakamalla välin hienommin. Tähän on kaksi oivallista tapaa, joko muoto x=0:0.1:1; tai x=linspace(0,1,30); Kokeile tai lue lisää (tai help colon, help linspace) (Kaksoispiste on englanniksi "colon".) Homma hoituu näin:

>> x=linspace(0,1,30); y=sin(2*pi*x); plot(x,y)
Operoidessamme vektorilausekkeilla, on totuttava käyttämään pistettä laskutoimitusmerkin edessä, kun on kyseesä kerto- tai jakolasku tai potenssiin korotus. Katso laskutoimitukset tästä. . Esimerkiksi:
  >> x=linspace(-pi/2,pi/2); 
  >> y=x.^2;            % Kukin vektorin komponentti toiseen potenssiin
  >> z=x.*sin(x);       % Vektorit x ja sin(x) kerrotaan "pisteittän"
  >> plot(x,y,x,z)

Varoitus! Aloittelevan Matlab-urheilijan tyypillinen virheloukku on pisteen unohtaminen "pisteittäisistä" vektorilaskutoimituksista.

-> Sisällysluetteloon <-


2.3 Matriisiesimerkki, lineaarinen yhtälösysteemi

Muodostamme jonkin sopivan pienen ei-singulaarisen matriisin, sen käänteismatriisin ja ratkaisemme lineaarisen yhtälösysteemin. Huomaamme samalla, että kertomerkki ( * ) on varattu matriisikertolaskulle, niinpä edellä mainittu "pisteittäinen" kertolasku vaatii pisteen. (Kuullostaa itsestään selvältä !)
>> A=vander([1 2 3])   % Vandermonden matriisi on ei-singulaarinen,
                       % Matlabissa on valmis funktio sen muodostamiseen.
>> B=inv(A)
>> A*B                 % Katsotaan, onko B tosiaan käänteismatriisi.
>> A*B-eye(size(A))    % Yleisemmin voidaan samuutta testata näin.
>> b=[1;1;1]           % Haluamme ratkaista systeemin A*x = b .
>> x=B*b               % Kerrotaan käänteismatriisilla.
>> x=A\b               % Tehokkaampi tapa on käyttää \-operaatiota.
                       % Muistisääntö: "matriisijako, jossa jakajamatriisi 
                       % on jakoviivan alla.                      
Muistatko, missä yhteydessä johduttiin Vandermonden matriisiin?

Matriisijakolaskuun saat lisävalaistusta komentamalla help slash , kts. myös ...

-> Sisällysluetteloon <-


2.4. Esimerkkejä Matlabin funktiosta

Matlab on funktionaalinen ohjelmointikieli, sen "voimanlähteenä" on suuri joukko funktioita, jotka operoivat yleensä suoraan vektori- ja/tai matriisiargumentteihin. Ohjelmointi tarkoittaa sitä, että käyttäjä kirjoittaa omia funktioitaan laajentaen siten Matlabin valmista funktiokokoelmaa.

Komento help elfun antaa alkeisfunktioluettelon ("elementary functios").

Edellä olemme jo käytelleet joitakin funktioita. Otetaan pieni kommentein varustettu esimerkki-istunto, jossa esiintyy myös vanha tuttavamme linspace

Esim.

  
  >> x=linspace(0,5,10)
x =
  Columns 1 through 7 
         0    0.5556    1.1111    1.6667    2.2222    2.7778    3.3333
  Columns 8 through 10 
    3.8889    4.4444    5.0000
>> y=log(x)             % log on luonnollinen logaritmi 
Warning: Log of zero.
y =
  Columns 1 through 7 
      -Inf   -0.5878    0.1054    0.5108    0.7985    1.0217    1.2040
  Columns 8 through 10 
    1.3581    1.4917    1.6094

2.5. Tehtäviä

Tehtävä 1

Piirrä log-funktion kuvaaja välillä (0,5) alkamalla yllä olevasta karkeasta diskretoinnista ja hienontaen sitten vaikkapa jakovölien lukumääriin 20,50,100.

Tehtävä 2

Fahrenheit-asteet saadaan Celsius-asteilla kaavasta F=1.8 C + 32 . Tee (käden käänteessä) 2-sarakkeinen taulukko, jossa on 5:n (C-) asteen välein arvot -40 ... 40 (siis C-sarake ja F-sarake vierekkäin).

Käännä taulukko myös vaakasuoraan ja muuttele taulukon rajoja ja askelta. Kaiken tämän voit hyvin tehdä suoraan komentoikkunassa, selaamalla komentopuskuria tarpeen mukaan "nuoli ylös"-näppäimella.

Muista, että Matlabissa ei ole Maplen tapaan vapaita muuttujia. Niinpä et voi etukäteen kirjoittaa laskentakaavaa, vaan C-vektorin on oltava olemassa ennen kaavan käyttöä. Tästä myös seuraa, että F ei päivity automaattisesti (kuten Maplessa), vaan aina, kun C-vektoria muutetaan, on haettava komentopuskurista F-kaava ja annettava sille ENTER:iä.

-> Sisällysluetteloon <-