6. Előadás Matlab grafikus lehetőségei, 2D, 3D-s grafikák. Salamon Júlia Előadás I. éves mérnök hallgatók számára
Grafikák A Matlab programcsomag egyik nagy erőssége az igen hatékony és rugalmas grafikai rendszere. Kétdimenziósgrafikákió A Matlab használatával bárki kirajzolhat egy olyan grafikont, amelyet úgy adtak meg, hogy felsorolták az összetartozó koordinátákat. Ezt egyszerűen plot utasítással érhetjük el. Háromdimenziós grafikák Rajzolhatunk háromdimenziós görbéket, ezt a plot3 utasítással érhetjük el, hálós felületeket a mesh parancs használatával, vagy felületeket a surf utasítást alkalmazva. 2010.12.01. VI. előadás 2
Plot utasítás Az első paraméter mindig az argumentumokat, míg a második az ábrázolandó függvény értékeit tartalmazza. plot(x,y) plot(z) plot(...,str) plot(x1,y1,str1, x2,y2,str2,...) Kirajzolja az y vektort az x vektornak megfelelően, vagyis az (x i,y i ) valós pontpárokat ábrázolja az x,y koordinátarendszerben. d A z vektorban levő komplex számokat ábrázolja, vagyis kirajzolja a (real(z), imag(z)) pontokat a komplex koordinátarendszerben. Az aktuális plot utasításban szereplő str sztring paraméterrel a rajz színét és a rajz vonaltípusát definiálhatjuk. Több grafikont készít ugyanabban a koordinátarendszerben, a megfelelő str1, str2,... szín- és vonaltípusok szerint. Ebben a parancsban valós és komplex adatokat nem lehet egyszerre használni. Ha nem adjuk meg a szín és a vonalfajtát, akkor a Matlab fogja megválasztani azt. 2010.12.01. VI. előadás 3
Vonalfajták jelek és színek Pont Vonal Szín. pont * csillag x x betűű o kör + plusz jel s négyzet d rombusz <,>,v,^ háromszögek p ötszög h hexagon - folytonos -- szaggatott : pontozott -. folyonos és pontozott y sárga r piros g zöld w fehér m magenta c cián b kék k fekete Vonalfajtákat és színeket lehet együtt is megadni. 2010.12.01. VI. előadás 4
Értelmezési tartományok Függvény típusa Polinom függvény Törtfüggvény Értelmezési tartomány Valós számok halmaza Nevező nem lehet nulla Gyökfüggvény Páros hatványú gyökök, gyök alatti kifejezése nem lehet negatív Exponenciális függvény Logaritmus függvény Trigonometrikus függvények Arcsin, arccos Arctg, arcctg Valós számok halmaza A logaritmus alapja és argumentuma szigorúan pozitív kell legyen Valós számok halamza, kivéve a tg. A kifejezés [-1,1] beli érték kell legyen Valós számok halmaza 2010.12.01. VI. előadás 5
Hibás függvényábrázolás 2010.12.01. VI. előadás 6
Példák 1. Rajzoljunk egy háromszöget. x=[1 3 2 1]; y=[0010]; plot(x,y) 2. Rajzold ki a f(x)=cos(8x)+cos(9x) cos(9x) függvény grafikonját. x=-3.2:0.01:9.5; y=cos(8*x)+ (8*x)+cos(9*x); plot(x,y) 2010.12.01. VI. előadás 7
Példák 3. Rajzold ki a f(t)=1/(1+(1+2i)t) függvény grafikonját. t=-100:0.01:100; 0 01 y=1./(1+(1+2i)*t); plot(y, 'dm') 4. Rajzold ki a f(x)=sin(x)/x függvény grafikonját. x=-20:0.1:20 y=sin(x)./x; plot(x,y,'--*r') 2010.12.01. VI. előadás 8
Címkék és rácsok elhelyezése A vízszintes és függőleges tengelyekre az xlabel és az ylabel parancsokkal, míg a rajz tetejére a title paranccsal tudunk szöveget kiíratni. A text parancs segítségével pedig a rajz bármelyik, koordinátájával megadott pontjára feliratot, szöveget helyezhetünk. A grid paranccsal egy olyan rácsot illeszthetünk a koordinátarendszerre, amely illeszkedik a tengelyek beosztására. Ha nem vagyunk teljesen elégedetek az ábránk megjelenésével az axis utasítással megváltoztathatjuk akár a vízszintes akár a függőleges tengely mentén. x=0:0.01:2*pi; p; y=sin(x); plot(x,y) xlabel('x tengely') ylabel('y tengely') title('szinusz fuggveny') grid on axis equal 2010.12.01. VI. előadás 9
2010.12.01. VI. előadás 10
2010.12.01. VI. előadás 11
Több rajz egy ábrán Plot utasításban, egymásután felsorolva az ábrázolandó grafikonokat x=0:0.1:2; plot(x,sin(x),'or',x,cos(x),'k',x,exp(x)-2,'*b') Hold parancsot használva. Hold on esetén minden későbbi rajzunk ugyan abba a koordinátarendszerbe rajzolódik, a hold off hatására a következő rajz törli az ablakot és új koordinátarendszert vesz fel. x=0:0.1:2; hold on plot(x,sin(x),'or') plot(x,cos(x),'k') plot(x,exp(x)-2,'*b') Subplot utasítást használva subplot(m,n,p) p) m*n rajzot illesztünk be egy ábrába, p azt jelöli, hogy sorfolytonosan számolva hányadik rajz aktív. 2010.12.01. VI. előadás 12
Példa subplot utasításra Akkor használjuk, amikor több rajz grafikonját összeszeretnénk hasonlítani, de nem azonos koordinátarendszerben szeretnénk őket ábrázolni. sin(x) sin(x) Hasonlítjuk össze a f függvények 1(x)=sin(x),f 2(x)=,f 3(x)= 2 grafikonjait. x x + 1 x=-10:0.1:10; 0 1 y=sin(x); subplot(1,3,1); plot(x,y) y=sin(x)./x; subplot(1,3,2); plot(x,y) y=sin(x)./(x.^2+1); subplot(1,3,3); plot(x,y) 2010.12.01. VI. előadás 13
Koordinátarendszerek loglog(x,y) semilogx(x,y) semilogy(x,y) Logaritmikus beosztást használ mindkét tengelyen. Csak az x (illetve y) tengelyen használ logaritmikus skálát, az y (illetve x) tengelyen marad a lineáris skála. polar(t,r,s), Polár-koordinátarendszerben rajzolja j ki az adatokat, ahol t vektorban vannak a szögek radiánban, r-ben a megfelelő szögekhez tartozó sugárérték, s az ábrázolás stílusát tárolja. bar(x,y) Az y vektorban lévő értékek oszlopdiagramját rajzolja ki. errorbar(x,y,e) Hibavonalas rajzolás, ahol az y értékek kerülnek kirajzolásra a megadott x helyeken egy, az e vektorban megadott nagyságú hibavonallal együtt. [t,r]=cart2pol(x,y) Az x,y derékszögű koordinátarendszerből elkészíti a polárkoordinátás megfelelőjét. [x,y]=pol2cart(t,r) A polárkoordinátákat derékszögű koordinátarendszerbe transzformálja. 2010.12.01. VI. előadás 14
Példák 1.Exponenciális függvény ábrázolása különböző sálázás mellett a [-10,10] intervallumon. x=-10:0.1:10; y=exp(x); subplot(1,4,1); 1); plot(x,y) subplot(1,4,2); loglog(x,y) subplot(1,4,3); semilogx(x,y) subplot(1,4,4); 4); semilogy(x,y) 2. Rajzoljuk meg az arkhimédeszi csigát. sz=0:0.1:8*pi; r=2./sz; polar(sz,r); r); 3. Rajzoljuk meg az f(x)=cos(x) függvény oszlopdiagramját. x=-1:0.1:1; y=cos(x); bar(x,y) 4. Hibavonalas rajzot adunk meg. x=0:0.1:3; y=exp(-x); e=rand(size(x))/10; errorbar(x,y,e); 2010.12.01. VI. előadás 15
Koordinátarendszer váltás 1. Polár koordinátarendszerről áttérünk derékszögű koordinátarendszerre. t=0:0.01:2*pi; r=sin(4*t).*cos(2*t); subplot(1,2,1); polar(t,r); [x,y]=pol2cart(t,r); subplot(1,2,2); plot(x,y); 2. Derékszögű koordinátarendszerről áttérünk polár koordinátarendszerre. x=-10:0.01:10; y=sin(x); subplot(1,2,1); plot(x,y); [t,r]=cart2pol(x,y); subplot(1,2,2); t(122) polar(t,r); 2010.12.01. VI. előadás 16
Adatok leolvasása rajzról [x,y]=ginput Ha utána az egérrel az ábrára váltunk, majd tetszés szerint az ábra bizonyos pontjaira kattintunk az egér bal gombjával, akkor azon koordináták eltárolódnak az x és y vektorokban. A beolvasás végét az Enter billentyű lenyomása jelenti. [x,y]=ginput(n) Itt előre rögzítjük, hogy a beolvasandó pontok száma legyen n. [x,y,t]=ginput waitforbuttonpress Ebben az esetben azt is eltároljuk, hogy az ábrára az egér melyik gombjával katintottunk, ttt k illetve milyen billentyűt nyomtuk le időközben. Ez a t vektorban lesz tárolva. Háromgombos egér esetén a t vektorba 1 tárolódik a bal gomb lenyomása esetén, 2 a középső és 3 a jobb gomb lenyomásakor. Billentyű lenyomásakor, pedig az illető karakter ascii kódja tárolódik. Megállítja a Matlabot amíg egy billentyűt vagy egérgombot meg nem nyomunk. 2010.12.01. VI. előadás 17
Példaprogram Egy ábrára a bal gomb lenyomásával rajzoljunk, addig amíg az egér jobb gombjával nem kattintunk a rajzra. figure; hold on axis([0 1 0 1]); [x,y,t]=ginput(1); plot(x,y,'o'); xx=x; yy=y; while t~=3 [x,y,t]=ginput(1); plot(x,y,'o'); xx=[xx x]; yy=[yy y]; plot(xx,yy) end 2010.12.01. VI. előadás 18
Görbék rajzolása A háromdimenziós görbéket ugyanúgy rajzoljuk, mint a kétdimenziósakat. Az utasítás hasonló azaz a szintaktikája ugyanaz. plot3(x,y,z) plot3(x,y,z,str) Kirajzolja és egy vonallal összeköti az x, y, z vektorok által megadott összes (x i,y i,z i ) pontot a három- dimenziós koordinátarendszerben. A vektorok csak egyenlő hosszúak lehetnek. Az aktuális plot3 utasításban szereplő str sztring paraméterrel a rajz színét és a rajz vonaltípusát definiálhatjuk. plot3(x1,y1,z1,str1, Több grafikont készít ugyanabban a x2,y2,z2,str2,...) koordinátarendszerben, a megfelelő str1, str2,... színés vonaltípusok szerint. Ha nem adjuk meg a szín és a vonalfajtát, akkor a Matlab fogjamegválasztani g azt. 2010.12.01. VI. előadás 19
Példaprogramok 1. Ábrázold a f(t)=(sin(t),t,cos 2 (t)) függvényt. t=0:0.1:8*pi; x=sin(t); y=t; z=cos(t).^2; plot3(x,y,z); grid on 2. Ábrázold a f(t)=(cos(4t)sin(t),sin(2t),t) függvényt. t=0:0.01:10*pi; x=cos(4*t).*sin(t); y=sin(2*t); z=t; plot3(x,y,z); grid on 2010.12.01. VI. előadás 20
Hálószerű felületek A Matlab a megadott háromdimenziós adatok alapján egy hálószerű felületet definiál a z koordináták alapján az x, y vektorok által meghatározott téglalaprács fölött. Egyenes vonallal l összeköti aszomszédos pontokat, t így olyan eredményt kapunk, mintha egy olyan hálót borítottunk volna a felületre, amelynek a csomópontjai megadott pontok, és csak a hálót látnánk. [u,v] v]=meshgrid(x,y) Két mátrixot állít elő, amelyek az x, y rácsrendszert definiálják. Haszna: összes lehetséges (u ij,v ij ) pontokkal definiált rácson z=f(u,v) utasítással pontonként értékeket definiálhassunk. mesh(z,c) mesh(x,y,z,c) Kirajzolja a z mátrix hálós rajzát. Ekkor a rácsozatot az (i,j) mátrixindexek definiálják, a függvényértékek a mátrix z ij elemei. A c paraméterben a színmátrixot adhatjuk meg. Kirajzolja a z mátrix hálós rajzát a c mátrixnak megfelelő színekkel, csak most a rácsozatot az (x ij,y ij ) pontpárok definiálják. (ha x hossza m, y-e n, akkor zmxn-es mátrix) meshc(...) h( Ugyanolyan hálós rajzot készít, mint ita mesh, csak itt még a grafikon alá az x, y síkra egy szintvonalrajz is készül. 2010.12.01. VI. előadás 21
Példaprogramok 1. Ábrázold a következő felületet: 2. Ábrázold a következő felületet: z=sin(x 2 +y 2 ) z=x 3 cos(y) [x,y]=meshgrid(-2:.01:2); [x,y]=meshgrid(-10:.1:10); z=sin(x.^2+y.^2); ^2); z=x.^3.*cos(y) mesh(x,y,z) mesh(x,y,z) 2010.12.01. VI. előadás 22
Felületek rajzolása surf(x,y,z,c) surfc(x,y,z,c) pcolor(z) pcolor(x,y,z) fill(x,y,c) fill3(x,y,z,c) Megrajzolja az (x ij,y ij,z ij ) pontokra illeszkedő felületeket. Ha x, y vektorok hossza m és n, akkor z mátrixnak mxn-esnek kell lennie, a felületeket az (x i,y j,z ij ) pontok definiálják. Ha az x, y paraméterek hiányoznak, a Matlab egyenletes téglalaprácsot l t vesz fl fel. c aszínmátrix. Kirajzolja még a szintvonalakat az xy síkban a felület alá. A z mátrix színes rajzát készíti el úgy, hogy a mátrix minden z ij elemének egy színt feleltet meg, és ezt ábrázolja az (i,j) rácsozaton. Egy kiszínezet két- illetve háromdimenziós poligont rajzol. A poligon csúcsait az x, y vektorok határozzák meg, a c adja meg a kitöltés színét. 2010.12.01. VI. előadás 23
Példaprogramok 1. Ábrázold a következő felületet: z=sin(x 2 +y 2 )/(x 2 +y 2 ) [x,y]=meshgrid(-4:0.05:4); z=sin(x.^2+y.^2)./(x.^2+y.^2); ( y ); surfc(x,y,z) shading interp 2. Ábrázold a következő felületet: z= (x 2 -y 2-1) (x 2 -y 2 +1) [x,y]=meshgrid(-4:0.1:4); z=(x.^2-y.^2-1).*(x.^2-y.^2+1); ( y ); surf(x,y,z) shading interp 2010.12.01. VI. előadás 24
Pcolor parancs Egy 4x4-ös rácsot szinez ki, veletlenszerűen. [x,y]=meshgrid(1:5) c=fix(rand(5)*16); pcolor(x,y,c) 2010.12.01. VI. előadás 25
Fill és fill3 parancsok subplot(2,1,1); x=[1 3 2]; y=[0 3 2.5]; fill(x,y,'b') subplot(2,1,2) B=[2 2 0]; A=[1 1 0]; C=[3 1 0]; D=[2 2.5 2]; fill3([a(1),b(1),c(1)],[a(2),b(2),c(2)],... [A(2) B(2) C(2)] [A(3),B(3),C(3)],'b') hold on fill3([c(1),a(1),d(1)],[c(2),a(2),d(2)],... [C(3),A(3),D(3)], 'k') k) fill3([a(1),b(1),d(1)],[a(2),b(2),d(2)],... [A(3),B(3),D(3)],'c') fill3([d(1),c(1),b(1)],[d(2),c(2),b(2)],... [D(3),C(3),B(3)],'m') ') grid on 2010.12.01. VI. előadás 26
Animációk készítése 1) Készíts egy programot, ahol egy körön mozogjon egy pont. x = -pi:.1:pi; for k=1:length(x) plot(cos(x),sin(x)); hold on plot(cos(x(k)),sin(x(k)),'*r'); hold off axis([-2 2-2 2]); pause(0.1) end 2) Készíts az előző feladathoz egy animációt (avi állományt). mov = avifile('e4.avi') x=-pi: -pi:.1:pi; for k=1:length(x) plot(cos(x),sin(x)); hold odon plot(cos(x(k)),sin(x(k)),'*r'); hold off axis([-2 2-2 2]); F = getframe(gca); mov = addframe(mov,f); end mov = close(mov); 2010.12.01. VI. előadás 27
Körön mozgó pont x = -pi:.1:pi; for k=1:length(x) plot(cos(x),sin(x)); hold on plot(cos(x(k)),sin(x(k)),'*r'); hold off axis([-2 2-2 2]); F = getframe(gca); nev=strcat('fnev',num2str(k+1000),'.jpg'); imwrite(f.cdata,nev); end 2010.12.01. VI. előadás 28