MATLAB-opas

Grafiikka

MATLAB sisältää monipuoliset piirtokomennot datan 2- ja 3-ulotteiseen visualisoimiseen. Katso esimerkiksi komentoja plot ja plot3.

Käyrien piirtäminen

Käyriä voi piirtää plot-komennon avulla. Ajatellaan, että haluamme piirtää käyrän y=x3-2x+1 välillä [-2,2]. Näin se käy: Muuttujaksi x otetaan sataan osaan diskretoitu x-akseli.
» x=linspace(-2,2,100);
Luvun 100 voi jättää pois, sillä 100 on oletusarvo. Lasketaan y-vektoriin vastaavat funktion arvot. Huomaa .^ (mieti tarkkaan pisteen merkitys).
» y=x.^3-2*x+1;
komento
» plot(x,y)
piirtää x-vektorin ja y-vektorin vastinkomponenttien ilmaisemat koordinaattipisteet (x(i),y(i)), ja yhdistää ne välijanoilla. Kun pisteitä on tarpeeksi (usein 100 riittää), saadaan sileä käyrä kuvaksi.
plot1

Kokeile minkälaisen käyrän saat jos 100:n sijasta käytät arvoa 10.

Kuvan skaalausta voi muuttaa komennolla axis. Perusmuoto on axis([xmin xmax ymin ymax]), joka määrää koordinaatiston rajat. axis-komennon argumenttina voi olla myös erinäisiä merkkijonoja, joista useimmin tarvittavia lienevät axis('equal') ja axis('square'). Alkutilaan päästään komennolla axis('normal').

axis('equal') ja axis('square'), jotka muuten voi antaa myös tyyliin axis equal, ovat erityisen tarpeellisia silloin, kun halutaan esim. ympyrän näyttävän ympyrältä.

Kokeile miten äsken saamasi kuva muuttuu kun käytät yllä mainittuja axis-komennon eri muotoja. Kuvaa voi käsitellä kuvaikkunan työkalunauhan valikosta näkyvillä tavoilla. Sitä voi "zoomata" (suurennuslasi), kuvaan voi lisätä tekstejä (insert-valikosta "text") jne. Samoja asioita voi hoitaa myös komennoilla, kuten zoom on.

Jos haluat piirtää toisen käyrän jo olemassaolevaan kuvaan, niin anna komento hold on. Tämän jälkeen kaikki seuraavat käyrät tulevat edellisten 'päälle', kunnes annetaan komento hold off. Piirrä yllä saadun käyrän kanssa samaan kuvaan y=2cos(x2-5x+17).

Toinen tapa usean käyrän piirtämiseksi samaan kuvaan on plot-komennon muoto plot(x1,y1,x2,y2,x3,y3,...). plot-komennossa voi lisätä viivatyyppimääreen kullekin haluamalleen käyrälle. Jos haluttaisiin vaikkapa piirtää sinikäyrä sinisellä, kosinikäyrä katkoviivalla ja lisäksi merkitä jälkimmäiselle rinkuloilla kaikki pi/2:n monikerrat välillä [0,10], olisi sopivaa tehdä näin:

» x=linspace(0,10);
» x1=0:pi/2:10;
» plot(x,sin(x),'b',x,cos(x),'--',x1,cos(x1),'o')
» grid
plot

Huom 1: plot(x1,cos(x1),'o') ('o' :n sijalla käy esim. 'x' tai '.') piirtää vain ao. pisteet, mutta jättää yhdistysjanat piirtämättä.

Huom 2: Yleinen muoto on plot(x1,y1,'mjono1',x2,y2,'mjono2',x3,y3,...), missä 'mjono1', 'mjono2',... ovat yllä esiintyvän tyylisiä merkkijonoja, joilla ilmaistaan väri tai viivatyyppi. Argumentit voidaan mieltää kolmikoiksi, yksi kolmikko kutakin piirrettävää käyrää kohti. Mistä tahansa kolmikosta voidaan jättää merkkijono-osa pois, jolloin ko. käyrä piirretään oletusvärillä ja -tyypillä.

Komennollagrid- voidaan kuvaan lisätä koordinaatti- (hila-) viivat, mikä on usein hyödyllistä. Kokeile joitakin yllä esitetyn kaltaisia yhdistelmiä.

Uuden piirtoikkunan saa avatuksi komennolla figure. Piirtoikkunoilla on numero, jonka avulla useista ikkunoista voidaan valita se, johon halutaan piirtää: komento figure(n), missä n on ikkunan numero, ohjaa seuraavat käyrät ikkunaan n.

Piirtämishuomioita

Funktiossa linspace on oletusarvona jako sataan osaan, mikä on usein sopiva 2D-piirroksiin. Tavallisimmin piirto tehdään siten tähän tapaan:

» x=linspace(a,b); % a:lla ja b:llä oltava numeeriset arvot.
» y=lauseke;
Lauseke, jossa esiintyy x, kuten y=exp(sin(x))+x.^3;
» plot(x,y)

Toinen tapa x-diskretointiin on antaa jakovälien lukumäärän sijasta jakovälin pituus h, jolloin kirjoitettaisiin
>> x=a:h:b;

Yllä kannattaa panna merkille puolipisteen käyttö, joka säästää tarpeettomalta pitkän vektorin tulostukselta.

Yhteenveto käyrän ja (x,y)-taulukon piirtämisestä
  • Muodostetaan vektorit x ja y. Ne voivat olla annettua dataa tai y-arvot ovat tarkasteltavan funktion arvoja x-pisteissä.
  • plot(x,y) piirtää tasoon (xi,yi)-pisteet ja yhdistää jananpätkillä.
  • plot(x,y,'o') piirtää pelkät pisteet ilman yhdistysjanoja käyttäen 'o'-merkkejä.

Yhteenveto grafiikkaikkunoiden hallinnasta
  • hold on aiheuttaa edellä piirretyn kuvan jäädyttämisen, jolloin seuraavat piirtokomennot piirtävät edellisen kuvan päälle.
    Takaisin "pyyhkimistilaan": hold off
  • figure avaa uuden kuvaikkunan. Jos halutaan jatkaa piirtämistä aiemmassa tai uudessa ikkunassa, voidaan komentaa esim.
    figure(2)

Kompleksilukujen piirto

Piirtofunktion plot argumentiksi voidaan antaa myös kompleksiluku(vektori). Tällöin ohjelma piirtää kyseiset kompleksipisteet tasoon. Pisteet yhdistetään taas oletusarvoisesti. Pelkät pisteet saadaan vastaavasti kuin edellä.

Esim

Piirrä kompleksitasoon pisteet 0,1,1+i,i.

>> plot([0,1,i,1+i])     % Kuva on ääriään myöten täynnä.
>> axis([-.2 1.2 -.2 1.2]) % Väljennetään akseleita
>> axis square             % Sama skaala molemmilla akseleilla.
Sama uudelleen, mutta pelkät pisteet punaisella ristillä ('xr').
>> plot([0,1,i,1+i],'xr')     % Kuva on ääriään myöten täynnä.
>> axis([-.2 1.2 -.2 1.2])    % Väljennetään akseleita
>> axis square                % Sama skaala.
complplot1



Matlab-funktion piirto, fplot

fplot on vaihtoehtoinen tapa funktion piirtämiseen. Tällöin funktion on oltava joko MATLAB-funktio (kuten sin, cos, exp, ...) tai itse määritelty funktio (joko m-tiedosto tai ns. funktiokahva tai vanhanaikainen "inline"-määrittely).

Esim: fplot(@sin,[0,2*pi]) tekee saman kuin x=linspace(0,2*pi);plot(x,sin(x)). Erona on se, että fplot suorittaa ns. adaptiivisen diskretoinnin, joka mahdollistaa tarkan kuvan vähemmällä laskentatyöllä.

>> f=@(x) x.^2   % Lue: f="at(x), x toiseen", vrt: f=x->x^2 (Maple)
>> fplot(f,[0,1])
Tai voitaisiin käyttää "nimetöntä funktiotyyliä":
>> fplot(@(x) x.^2,[0 1])

Parametrimuotoiset käyrät tasossa

Funktio plot soveltuu sellaisenaan parametrimuotoiseen piirtoon. Ajatellaanpa yksinkertaisimpana esimerkkinä ympyrää, jonka luonnollinen parametriesitys on $x=cos(t), y=sin(t), t \in \left[0,2\pi\right]$
>> t=linspace(0,2*pi);
>> x=cos(t); y=sin(t);
>> plot(x,y)
>> axis equal; axis square;

3D-grafiikka

Avaruuskäyrät

Parametrimuodossa annettuja avaruuskäyriä voidaan piirtää funktiolla plot3 lisäämällä z-koordinaatti mukaan. Esimerkki selvittäköön asian. Jatketaan parametripiirtoesimerkkiä ottamalla mukaan z-koordinaatti, joka nousee lineaarisesti kulman t funktiona. Toisin sanoen piirrämme ruuviviivan: $$x=cos(t), y=sin(t), z=t, t \in \left[0,6\pi\right]$$
>> t=linspace(0,6*pi);
>> x=cos(t); y=sin(t); z=t;
>> plot3(x,y,z)
>> axis equal; axis square;
>> grid
Tämä on periaatteessa sama esimerkki kuin funktion plot3 avustussivulla. Kuvakin näkyy siellä (tosin hiukan eri parametrein).

Pintapiirrokset ja korkeuskäyrät

Kts. myös: Various views of meshgrid

Olkoon piirrettävänä funktion f(x,y)=e-x2-y2 määrittelemä pinta(pala) xy-tason neliön [-2,2] x [-2,2] alueella. Ajatus on, että jaetaan alue koordinaattiviivoilla suorakulmiohilaksi ja lasketaan kussakin hilapisteessä (xi, yj) funktion arvo zi,j=f(xi, yj). Näin saadaan korkeusmatriisi Z=(zi,j). Ajatellaan, että asetetaan kuhunkin hilapisteeseen (xi, yj) sauva, jonka (merkillä varustettu) pituus on zi,j. Näin syntyneen "sauvametsän" päällee asetetaan lepäämään "pintamatto".

Sama korkeusmatriisi soveltuu niin pinta- (surf), korkeuskäyrä- (contour) kuin yhdistelmäkuviin (surfc).

» x=-2:.1:2; y=x;       % x-ja y-akselin diskretoinnit tässä samoja.
» [X,Y]=meshgrid(x,y);  % X ja Y määräävät xy-alueen hilapisteistön.
» size(X), size(Y)
ans =
    41    41
ans =
    41    41

» Z=exp(-X.^2-Y.^2);   % Korkeusmatriisin arvot hilapisteissä. 
                       % Huomaa "pisteittäiset" laskutoimitukset.
» surf(x,y,Z)             % surf-funktio "asettaa maton
                          % sauvametsän päälle".
>> contour(x,y,Z)      % Korkeuskäyräpiirros
>> ezcontour('exp(-x^2 - y^2)',[-2 2 -2 2])  % "easycontour", ei tarvita 
>>                                % meshgridiä eikä "vektorointipisteitä".
surf1
Demonstroidaan view-komentoa:
» for j=1:5;view(-20+10*j,20*j),pause,end;  
Kuvan pyörittäminen käy vuorovaikutteisemmin kuvaikkunan työkalunauhan oikeanpuolimmaisesta painikkeesta.

meshgrid

Kts. myös: Various views of meshgrid

Kyseessä on monikäyttöinen ja tehokas (ja välttämätön) komento erityisesti pinta-ja korkeuskäyräpiirroksissa. Kuten todettu, funktion f(x,y) pintaa ym. varten tarvittava data koostuu matriisista Z=(zij), missä zij = f(xi, yj), kun pisteet xi ja yj muodostavat x-alueen (vast. y-alueen) diskretoinnin.
&matlab;:ssa voitaisiin toimia näin:

>> x=linspace(a,b,m); y=linspace(c,d,n);
>> Z=zeros(m,n);
>> for i=1:m
     for j=1:n
       Z(i,j)=f(x(i),y(j));
     end
   end
Sitten vaan: >> surf(x,y,Z') . (Miksi pitää transponoida, no mesh-, surf- ym. komennoissa ajatellaan koordinaatistoa eikä matriisin indeksejä.)

Tällainen kävisi ajan oloon hermoille (eikö vaan?). (Sekä tehotonta että vaivalloista.) Pelastuksen tarjoaa meshgrid.

Kokeillaan:

>> x=0:3
x =
     0     1     2     3
>> y=-(0:2)
y =
     0    -1    -2
>> [X,Y]=meshgrid(x,y)
X =
     0     1     2     3
     0     1     2     3
     0     1     2     3
Y =
     0     0     0     0
    -1    -1    -1    -1
    -2    -2    -2    -2
Matriisit X ja Y ovat samankokoiset. Kun f on vektoroidusti määritelty funktio ("array smart"), niin Z=f(X,Y) on matriisi, jolle todellakin Zij = f(xi, yj).
Kun komennot mesh, surf, contour kirjoitetaan muodossa mesh(x,y,Z), ..., &matlab; antaa myös oikean koordinaatiston. Jos annetaan pelkkä matriisi Z, piirto tapahtuu matriisin Z indeksejä käyttäen aivan samoin kuin 2d plot-funktion tapauksessa.
Hilapisteet voi piirtää näppärästi:
>> plot(X(:),Y(:),'o')
>> axis([-0.1 3.1 -2.1 .1])
Tee ja tee (selväksi). Hilaruudukon taas näin:
>> plot(X,Y)
>> hold on
>> plot(X',Y')
(Aikamoista &matlab;-iloittelua!)

Pinta ympyräalueen päällä

Edellä oleva pintapiirto tuntuu olevan kovasti suorakulmioalueeseen rajoittuvaa. Mutta &matlab; on moneen taipuva työkalu. Mietitäänpä ympyräaluetta. Miten voitaisiin käyttää napakoordinaattimuunnosta hyödyksi. No kokeillaan funktiota f(x,y) = x y yksikkökiekon päällä.
>> t=linspace(0,2*pi,30);
>> r=linspace(0,1,10);
>> X=r'*cos(t);Y=r'*sin(t);  % Ulkotulot
>> Z=X.*Y;
>> surf(X,Y,Z)
>> surfc(X,Y,Z)
>> hold on
>> surf(X,Y,zeros(size(Z)))
surfnapa
EI HUONO!

Ruuviviiva lieriön pinnalla

Erinomaisen opettavainen esimerkki:

helix.m - Nancy Stanton: Helix on a cylinder

Alla annetaan helix.m-tiedoston listaus, sama, joka on edellisen linkin takana. Tässä on toinen esimerkki ympyräalueelle taipuvasta pintapiirroksesta yhdistettynä 3d-käyrän piirtoon plot3-funktiolla. Lisäksi nähdään malli m-tiedoston rakenteesta, jolla publish-työkalu tekee hienon dokumentin aina matemaattisia $\LaTeX$-kaavoja myöten.

Klikkaamalla näet Publish - tuotoksen

m-tiedostoista ja niiden kirjoittamisesta Publish-työkalulle sopivaan muotoon puhutaan seuraavassa kohdassa. Tämä toimikoon hyvänä pohjana.

Tiedosto helix.m:

%% Helix %% % Here is a way to plot a helix on a cylinder. % It will use a parametric description of the cylinder. The cylinder is a % right circular cylinder of radius 1 centered on the z-axis. It is the % set of all points of the form %% %
$$(\cos(U),\sin(U),V),\qquad 0 \le U \le 2\pi,\quad \mbox{--}\infty < V < \infty. $$
% 
% I'll limit the graph to 
%%
% 
$$ 0 \le V \le 6\pi.$$
%
% I begin by making a 50x50 mesh of the points [U,V] I'll use in the graph.

u=linspace(0,2*pi,50); v=linspace(0,6*pi,50);
[U,V]=meshgrid(u,v);

%%
% To be able to get a thick curve for the helix, I use the *plot3*
% command. I plot the helix as a very thick curve and use the command 
% *surf* to plot the cylinder.   
% The command *colormap white* prevents shading of the cylinder. 

t=linspace(0,6*pi,300);
plot3(cos(t),sin(t),t,'LineWidth',3), hold on
title('Helix on a cylinder')
surf(cos(U),sin(U),V), colormap white, hold off

[Edellinen] [Seuraava] [Alkusivu]