http://math.tkk.fi/~apiola/matlab/opas/tutoriaali.html
Päivitetty 6.02.2019 HA

Matlab-pikatutoriaali

Kaikkein ensimmäiseksi: Opettajille videotykin ääressä: Matlabin file- valikosta preferences, sieltä fonts, koko 18 riittänee (ja ehkä bold).

$$\pi$$


Vuoden 2010 kurssimatskua:
Kurssiesite
Aikatauluhahmotelma

Muita "getting started"- viitteitä

Komentorivin help-hakusanoja

Komentorivi-helpin etuna on mm. nopeus. Alla olevien hakusanojen avulla on joskus helpompi "täsmälöytää" kuin valikkohelpistä.
   >> help funnimi   % Kaikki m-tiedostoissa olevat funktiot,
                     % myös omat, jos olet vaivautunut kirjoittamaan.
Tässä yleishyödyllisiä help-sanoja koottuna. Siis >> help hakusana (nopea ja "ruma") tai >> doc hakusana (hidas, mutta kaunis), saman saat alla olevan luettelon hakusanaa klikkaamalla.
  >> help general
  >> help ops     % Operaattorit ja erikoismerkit
  >> help lang    % Language constructs
  >> help elmat   % Elementary matrices
  >> help specmat % specialized matrices
  >> help elfun   % Elementary functions
  >> help specfun % Special functions
  >> help matfun % Matrix functions - Numerical linear algebra
  >> help datafun % Data analysis and Fourier Transforms
  >> help polyfun % Polynomial and interpolation functions
  >> help graphics, help plot
  >> help ode45

Myös muita kuin "getting started" - viitteitä

Alkukokeilu

Matlabin ääreen kokeilemaan

Suorita ajatuksella alla olevat Matlab-kehotteen >> jäljessä olevat rivit. Älä ujostele omien variaatioiden kokeilua.
  >> a=[1 2 3 4 5]      % Vaakavektori
  >> c=[6;7;8;9;10]     % Pystyvektori
  >> a*c           % Matriisitulo, tässä tapauksessa vektorien sisätulo
  >> sisa=dot(a,c) % Funktio dot tekee saman vektoreille
  >> ulko=c*a      % pysty*vaaka antaa "ulkotulon"
Edellä olevat voidaan tehdä kätevästi ja yleispätevästi näin:
>> a=1:5;        % Puolipiste estää tulostuksen.
>> c=(6:10)'   % A' on A:n transpoosi.               
Ulkotulokokeilu:
  >> help ones
  >> ykkossarake=ones(5,1)
  >> rivi=[1 2 3]
  >> ykkossarake*rivi 
Mitä siis saat, kun kerrot rivivektorin ykkössarakkeella? Miksi?
Entä yleisesti: Olkoot u ja v pystyvektoreita (ei välttämättä samanpituisia). Mitä on u*v' ?

Kaksoispiste-operaattori, osamatriisi , transpoosi

  >> a=1:5
  >> A=[a;a]
  >> A=A(:,1:3)
  >> A'
  >> A*A'
  >> A'*A

Avustusjärjestelmä ja oppaat

Toistetaan vielä: Kannattaa pitää aktiivisena myös

Matriisikertolasku vs. taulukko-operaatiot:

>> a*a     % Virhe, vain neliömatriisi voidaan kertoa itsellään.
Entä, jos haluttaisiin kertoa a: n vastinkoordinaatit keskenään? Tällöin laitetaan kertomerkin eteen piste (.) kuvastamaan "pisteittäistä" laskutoimitusta:
>> b=a.*a
>> a.^2       % Antaa saman (Skalaari 2 osaa laajentua a:n pituiseksi vektoriksi)
>> a.*b
>> a.*c       % Toimii samankokoisille matriiseille, 

Matemaattisia funktioita

Matlabissa on laaja valikoima matemaattisia funktioita. Yleensä ne toimivat "taulukko-mielessä", eli funktion soveltaminen matriisiin soveltaa sitä jokaiseen matriisin alkioon.
>> exp(a)
>> log(ans)
>> sqrt(a)
>> a.^(1/12) 
>> exp(i*pi)

Laskenta- ja näyttötarkkuus ja -muoto, format

Matlab suorittaa laskut n. 16:n numeron tarkkuudella.
Komennolla format voidaan vaikuttaa näyttöasuun ja vain siihen, laskentatarkkuuteen se ei vaikuta.
>> v=pi/10*(1:10)
>> format long
>> v            % Katsotaan muuttujan v sisältö.
>> format       % Takaisin oletusnäyttöasuun
>> 2^54         % e-notaatio (e:n jälkeen on 10:n potenssi)
>> format bank  % 'Pankkimuoto'
>> ans          % Edellisen laskun tulos.
>> format compact  % Tiivistää tyhjiä rivejä pois. (Tässä käytämme sitä.)

Matriisifunktioita

Matriisin koko- ja muodostamisfunktioita
    size  Matriisin koko, näinkin: [m,n]=size(A)
    reshape  Matriisin uudellenmuotoilu
    ones     Ykkösistä koostuva matriisi
    zeros    Nollamatriisi
    eye    Yksikkömatriisi
    rand     Satunnaislukumatriisi
    diag     Vektorista diagonaalimatriisi, 
             matriisin diagonaalivektori
    spdiags  Harvan matriisin muodostaminen diagonaaleista.
    blkdiag  Lohkodiagonaalimatriisi
    repmat   Matriisin rakentaminen toistamalla lohkoa.
    vander Vandermonden matriisi 
    magic  Taikaneliö ('Magic square')
  
Datankäsittelyyn
sum, diff,sort,mean, max, min, prod, cumsum, cumprod 
Kokeile vaikka tähän tapaan:
>> A=[1 2 3;4 5 6]
>> size(A)
>> [m,n]=size(A); [m n]
>> zeros(1,5), ones(5,1)
>> ones(size(A))
>> sum(A), mean(A), prod(A), ...
>> mesh(eye(30,30))  % Klikkaa kiertokuvaketta ja kiertele.
>> A(1,:)
>> A(:,3)
>> A(:)     % tai mutkikkaammin:  reshape(A,m*n,1)
>> reshape(ans,2,3)
>>  % Huom! Matlab on sarakeorientoitunut.
Mieti:(a) Miten saisit matriisin kaikkien alkioden summan, keskiarvon,tulon.
(b) Miten muodostaisit matriisin A rivisummat (-keskiarvot, -tulot)?
Vihje: Muista, matriisin A transpoosi on A' (reaaliselle matriisille A).
(c) Kirjoita Matlab-lauseke luvun n! laskemiseen. Älä käytä gamma-funktiota muuta kuin vaihtoehtotäydennyksenä.
(d) Taikaneliöt, kts help magic.
Suorita A=magic(n) sopivalla pienehköllä n:llä. Osoita laskemalla, että rivisummat=sarakesummat=lävistäjäsumma=sivulävistäjäsumma.
Ohje: diag antaa päälävistäjän, miten saat sivulävistäjän? No miten vaihdetaan sarakkeiden järjestys?

Laajan oppaan matriisit 2.2.2

Varattuja nimiä ei ole, mutta kuitenkin on

>> pi,i,j     % Matlabin tuntemia vakioita.
>> i=1        % Tämä on kuitenkin luvallinen sijoitus.
>> clear i    % Poistetaan edellinen arvo, jolloin palataan i:n oletusarvoon.
>> i=sqrt(-1) % Vaihtoehtoisesti näinkin.
Kts. tarkemmin tästä lyhyestä

Yhteenveto ja kertaus

Alla olevassa taulukossa on esitetty tiivistetysti syöte ja vastaava tulos
Siis esimerkiksi pari ensimmäistä riviä tiivistävät seuraavan Matlab-istunnon:
>> 2+3
ans =
     5
>> 7-5
ans =
     2
Voit leikata/liimata ("copy/paste") punaisia soluja tai niiden osia Matlab- tai Octave-komentoikkunaan ja tarkkailla tuloksia ja tehdä omia muunnelmia.
.
SyöteTulosKommentit
2 + 3
7-5
34*212
1234/5786
2^5
ans = 5
ans = 2
ans = 7208
ans = 0.2173
ans = 32
Lukujen aritmetiikka toimii odotetulla tavalla. Huomaa muuttuja ans, kun tulosta ei käyttäjän toimesta mihinkään sijoiteta.
a = sqrt(2) a = 1.4142 Sijoitus muuttujaan a.
b = a, pi, 2 + 3i b = 1.4142
ans = 3.1416
ans = 2.0000 + 3.0000i
Samalle riville voidaan kirjoittaa useita komentoja pilkulla tai puolipisteellä eroteltuina. pi, i ja j ovat vakioita. Kompleksiluku voidaan kirjoittaa muodossa 2+3i ilman kertomerkkiä, muttei 2+i3, eikä tietenkään x+yi, vaan x+y*i (i3 ja yi tulkitaan muuttujan nimiksi).
Suositus: Käytä aina kertomerkkiä.
c = sin(pi)
eps
5*10^9
c = 1.2246e-016
ans = 2.2204e-016
ans = 5.0000e+009
"eps" on liukuluklaskennan suhteellinen tarkkuusraja. Sitä pienempi lisäys lukuun 1 antaa tuloksen 1. Huomaa, että Matlab käyttää tieteellisen laskennan e-notaatiota, jossa e ei tarkoita Neperin lukua, vaan erottaa mantissan ja eksponentin.
d = [1 2 3 4 5 6 7 8 9]
e = [1:9]
f = 1:9
d = 1 2 3 4 5 6 7 8 9
e = 1 2 3 4 5 6 7 8 9
f = 1 2 3 4 5 6 7 8 9
"d", "e", ja "f" ovat vektoreita, kaikki samoja. Kaksoispiste- operaattori ":" muodostaa lukuvektorin 1:n askelin. Huomaa, että sisäkkäiset hakasulut eivät muuta tietorakennetta (toisin kuin vaikkapa Maplessa).
g = 0:2:10
0:-0.2:-0.4
f(3)
f(2:7)
f(:)
g = 0 2 4 6 8 10
ans = 0 -0.20 -0.40
ans = 3
ans = 2 3 4 5 6 7
1 2 3 4 5 6 7 8 9
Kaksoispisteen yhteyteen voidaan lisätä myös askel, joka voi olla mikä tahansa reaaliluku, myös negatiivinen. Huomaa, että indeksivektorien avulla voidaan poimia annetun vektorin (tai matriisin) osia.
Huomaa myös, että esim. f(3) ei tarkoita funktion f arvoa pisteessä 3, vaan vektorin f kolmatta alkiota. (Emmehän ole edes määritelleet mitään f-funktiota.)
h = [1 2 3];
h'
 
 
(tyhjää)
ans = 1
      2
      3
Puolipiste ";" estää tulostuksen. Yksinkertainen hipsukka " ' " transponoi matriisin. (Kompleksitapauksessa myös konjugoi.)
h * h'
h .* h
h + h
ans = 14
ans = 1 4 9
ans = 2 6 8
Kertolaskut: Tähti " * " on matriisikertolasku, operandien oltava "kertomiskelpoiset"
" .* " on vastinalkioiden välinen kertolasku, matriisien oltava samankokoiset. (Skalaari kelpaa aina toiseksi operandiksi ("skalaarin laajennussääntö"))
g = [ 1 2 3; 4 5 6; 7 8 9] g = 1 2 3
    4 5 6
    7 8 9
Matriisien muodostaminen.
g(2,3)
g(3,:)
g(2,3) = 4
 
sarakejono=g(:);
 
ans = 6
ans = 7 8 9
g = 1 2 3
    4 5 4
    7 8 9
Matriisin alkiot ja osat.
Huomaa: pelkkä kaksoispiste ":" tyliin g(3,:) juoksuttaa koko rivin tai sarakkeen, jos tyyli on g(:,2). g(:) jonouttaa pikäksi vektoriksi sarakkeittain.
g^2
 
 
g .^ 2
 
 
ans =  30  36  42
       66  81  96
      102 126 150
ans =  1  4  9
      16 25 36
      49 64 81
Ensimmäinen kertoo matriisin itsellään (oltava neliömatriisi). Toinen korottaa jokaisen alkion toiseen potenssiin (minkäkokoinen tahansa).

M-tiedostot, työn dokumentointi

Otan tähän kopion lyhyen oppaan m-tiedostoja-osan alusta:

Avataan Matlab-editori (New m-file) ja kirjoitetaan seuraavat komennot:

%% Tenttipisteiden jakauma
pisteet=[10 11 15 3 29 7 0 9 30 2 1 8 20 22 5 9 23 24];
jarjestyksessa=sort(pisteet)
keskiarvo=sum(pisteet)/length(pisteet) % tai mean(pisteet)
hajonta=std(pisteet)
plot(sort(pisteet))
figure
hist(pisteet,6)
Talletetaan tiedostoon tentti.m Matlab/Octave-istunnossa suoritetaan komento tentti.
(Tiedoston oltava polun varrella.)
Matlabin m-tiedostoon talletetut komennot suorittuvat, kun Matlab-istunnossa kirjoitetaan ao. tiedoston nimi. Usein tällaista skriptitiedostoa käsitellään pääohjelman tavoin. Usein se sisältää funktiokutsuja, Matlab:n funktioihin tai itse määriteltyihin.

Työstä saa html-dokumentin kuvineen ja sisällysluetteloineen klikkaamalla Matlab-editorin FILE-valikon valintaa publish. (Tapahtuu sitten, kun Matlab-tulkin havaitsemat virheet on korjattu.)

Huom! Julkaisuominaisuus publish, kuten myöskään opastava editori ei ole käytettävissä Octavessa.

Selitykset m-tiedostoissa sijoitetaan %-merkin taakse. Kappalejako saadaan aikaan %%-alulla, samalla syntyy sisällysluettelo. KÄTEVÄÄ, käytä ihmeessä hyväksi harjoitustöissä ym.

Kokeile: Kirjoita ja aja yllä oleva tai jokin muu. Tulos on alihakemistossa html (Vau!)

Grafiikan perusharjoittelua

Viitteestä Newcastle/matlab-mini.pdf

Käyrän piirtoa ja juuren etsintää

Kirjoita Matlab-istuntoon seuraavanlaisia rivejä:
>> clf  % Mahd. vanhojen grafiikkaröpellysten putsaus.
>> x=linspace(0,20,25); % Väli [0,20] jaetaan 24 osaväliin (25 jakopisteellä).
>> y=sin(x)+exp(-x/10); 
>> plot(x,y,'ro',x,y,'g');  % 'r' - "red", 'o' - rinkula, ei yhdysjanoja,
>>                          % 'g' - "green"
>> title('Annetun funktion kuvaajan pisteet ja yhdistysjanat');
>> shg  % Näytä grafiikka.
Saadaan funktion sin x + e-x/10 kuvaaja välillä [0, 20].
Kokeile myös erikseen: plot(x,y,'ro') ja plot(x,y,'g') ja hold on . Sileämpi kuva saadaan aloittamalla esim:
>> x=linspace(0,20,100); tai käyttämällä funktiota fplot, joka muodostaa laskentapisteistön "älykkäästi", "adaptiivisesti".
 >> fplot('sin(x)+exp(-x/10)',[0,20])
Tämä on "vanhanaikainen" ja väistyvä tapa, jossa funktio annetaan merkkijonona. Nykyisin (ja tällä kurssilla [maaliskuu 2012] yksinomaan) käytetään modernia "funktiokahvaa, function handle" näin:
 >> fplot(@(x) sin(x)+exp(-x/10) , [0,20])
Anna vielä komento grid on, niin näet selvästi, että funktiolla on 0-kohta lähellä arvoa x=10. Voit vielä piirtää x-akselin:
>> hold on;  %Seuravat piirtokomennot eivät pyyhi edellisiä.
>> plot(x,zeros(size(x)),'b');
>> zoom on;  % zoomausnappula löytyy myös suoraan kuvaikkunan kuvakkeista.
Hiiriosoittimella voit nyt kuvaikkunassa zoomailla ja tarkentaa 0-kohdan approksimaatiota.

Matlab:ssa on nollakohdan hakemiseen funktio "fzero".-

>> x0=fzero(@(x) sin(x)+exp(-x/10) , [9 10])
x0 =
9.8091
>> format long   % Tuloksen näyttö täydellä tarkkuudella.
>> x0
x0 =
   9.809140437417911
>> format % Palautetaan oletusnäyttötarkkuus.

Vertailuksi Maple:n funktiomäärittely

> f:=x->sin(x)+exp(-x/10)

3-D piirto

Suoraviivaisena esimerkkinä piirretään funktion z(x,y) := x2 - y2 kuvaajapinta.
      x=-3:.5:3;
      y=-2:.5:2;
      [X,Y] = meshgrid(x,y);
      Z = X.^2 - Y.^2;             % Huomaa pisteittäiset potenssit (.^).
      clf                          % Clear figure, putsaa vanhat.
      mesh(x,y,Z);
      shg                          % show graphics, näytä heti!
Erilaisia samaan dataan liittyviä, kuvaa muodostavia ja sääteleviä komentoja on runsas valikoima. Tässä eräitä:
      surf(x,y,Z)
      colorbar
      axis([min(x) max(x) min(y) max(y) min(min(Z))-1 max(max(Z))+1])
      xlabel('x-akseli');
      ylabel('y-akseli');
      zlabel('z-akseli');
Jos klikkaat keskellä työkaluikoneja olevaa ympyriäistä nuolta, pääset pyörittelemään hiirellä kuvaa.

3D-grafiikan mahdollisuusia kuvaava munkkirinkilä

Kermit Sigmon:lta peräisin oleva esimerkki. Tähän kannattanee palata vasta hiukan myöhemmässä opettelun vaiheessa. Mikään ei estä kuitenkaan "copy-pastettamasta" tätä funktiota Matlab-polun varrella olevaan tekstitiedostoon torus.m ja ajamasta alla olevilla esimerkkikomennoilla tuntuman saamiseksi 3d-grafiikan näyttävyydestä ja mahdollisuuksista.
function [xx,yy,zz] = torus(r,n,a)
%TORUS Generate a torus
% torus(r,n,a) generates a plot of a torus with central
% radius a and lateral radius r. n controls the number
% of facets on the surface. These input variables are optional
% with defaults r = 0.5, n = 20, a = 1.
%
% [x,y,z] = torus(r,n,a) generates three (n+1)-by-(2n+1)
% matrices so that surf(x,y,z) will produce the torus.
%
% See also SPHERE, CYLINDER
%%% Kermit Sigmon, 11-22-93
if nargin < 3, a = 1; end
if nargin < 2, n = 20; end
if nargin < 1, r = 0.5; end
theta = pi*(0:2*n)/n;
phi = 2*pi*(0:n)'/n;
x = (a + r*cos(phi))*cos(theta);
y = (a + r*cos(phi))*sin(theta);
z = r*sin(phi)*ones(size(theta));
if nargout == 0
surf(x,y,z)
ar = (a + r)/sqrt(2);
axis([-ar,ar,-ar,ar,-ar,ar])
else
xx = x; yy = y; zz = z;
end
Tämä esimerkki kuvaa samalla, miten funktion argumenttilista voidaan rakentaa vaihtuvanpituiseksi. Kaikki alla olevat kutsutavat ovat mahdollisia:
>> [x,y,z]=torus; % Muodosta torusdata, ei piirtoa.
>> [x,y]=torus;  %  Vain x- ja  y-koordinaatit.
>> torus; % Piirrä torus oletusarvoilla.
>> torus(0.6); % Piirrä arvolla r=0.6, sekä n:n ja a:n oletusarvoilla.
>> x=torus(0.7, 25); % 

Värikkään toruksen metamorfoosi kohti munkkirinkilää

Suorita komento >> torus Kuten edellä jo nähtiin, kuvaa voidaan muokkailla jälkeenpäin, tällä kertaa vaikkapa näin:
>> shading interp
>> colormap(copper)
>> axis off
Luentotehtävä: Maalaa yllä oleva torus-koodi ja kopioi omaan Matlab-työhakemistoosi tiedostoon torus.m. (Saat sen myös suoraan tästä. )
Kokeile yllä esitettyjä komentoja, ja miksei muitakin.
Last modified: Mon Dec 12 15:05:15 EET 2011