Bevezetés a MATLAB használatába Kiegészítő jegyzet Dinamikus rendszerek paramétereinek becslése c. tárgyhoz Magyar Attila
Pannon Egyetem Automatizálás Tanszék
Tartalomjegyzék 1. 2. 2.1. 2.2. 3. 3.1. 3.2. 3.3.
3.4. 4. 4.1.
4.2.
5. 5.1. 5.2. 5.3. 6. 6.1. 6.2.
6.3. 6.4. 7.
MATLAB . . . . . . . . . . . . . . . . Alapok . . . . . . . . . . . . . . . . . . Súgó . . . . . . . . . . . . . . . . . . . Naplózás . . . . . . . . . . . . . . . . . Változók, értékadás . . . . . . . . . . . Skalár változók . . . . . . . . . . . . . Vektor változók . . . . . . . . . . . . . 3.2.1. Indexelés . . . . . . . . . . . . . Mátrix változók . . . . . . . . . . . . . 3.3.1. Speciális mátrixok . . . . . . . 3.3.2. Indexelés . . . . . . . . . . . . . Munkatérbeli változók . . . . . . . . . Műveletek . . . . . . . . . . . . . . . . Alapvető műveletek . . . . . . . . . . . 4.1.1. Összeadás, kivonás, szummázás 4.1.2. Szorzás, osztás, inverz . . . . . 4.1.3. Hatványozás . . . . . . . . . . . 4.1.4. Komplex számok . . . . . . . . További műveletek . . . . . . . . . . . 4.2.1. Alapvető függvények . . . . . . 4.2.2. Mátrixfüggvények . . . . . . . . 4.2.3. Polinomok . . . . . . . . . . . . Grafikus ábrázolás . . . . . . . . . . . Kétdimenziós ábrák . . . . . . . . . . . Háromdimenziós ábrák . . . . . . . . . Nyomtatás fájlba . . . . . . . . . . . . Programozás . . . . . . . . . . . . . . . Szkriptek . . . . . . . . . . . . . . . . 6.1.1. Egy példa szkript . . . . . . . . Függvények . . . . . . . . . . . . . . . 6.2.1. Változótípusok . . . . . . . . . 6.2.2. Súgó írása . . . . . . . . . . . . 6.2.3. Hibakezelés . . . . . . . . . . . 6.2.4. Egy példa függvény . . . . . . . Ciklusok . . . . . . . . . . . . . . . . . Elágazások . . . . . . . . . . . . . . . . Simulink . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 3 3 3 4 4 5 6 6 7 8 9 10 10 10 11 13 14 15 15 17 19 22 22 27 27 27 28 29 31 31 31 31 31 31 31 31
1 MATLAB
1.
3
MATLAB
A Matlab egy sokoldalú matematikai programcsomag, amely a mérnöki számításokat egyszerűsíti le. (A Matlab neve a MATrix és a LABoratory szavakból ered.) A Matlab nyelve egy magas szintű, BASIC-szerű programozási nyelv, éppen ezért könnyű vele dolgozni. Elsősorban numerikus és mátrixalgebrai feladatokra dolgozták ki, kiegészítő csomagokkal (Toolbox-ok : egy bizonyos feladatosztályhoz tartozó parancsok gyűjteménye) azonban rengeteg területen alkalmazható az irányítástechnikától a bioinformatikán át a jelfeldolgozásig.
2. 2.1.
Alapok Súgó
A help utasítás segítségével az egyes Matlab utasítások leírását és szintaxisát ismerhetjük meg. Használata: >> help utasitas_nev Például a koszinusz függvény esetén: >> help cos [Enter] COS cosine COS(X) is the cosine of the elements of X. A kiválóan használható online súgó a főablakból érhető el egy ikonra kattintva (1. ábra), illetve parancssorból az alábbi utasítással: >> helpdesk
2.2.
Naplózás
A gyakorlaton való munkát könnyíti meg a Matlab naplózási funkciója: >> diary on >> ... >> diary off mely az aktuális könyvtárban egy diary.txt fájlba menti az on és az off között kiadott parancsokat és a kapott eredményeket.
3 Változók, értékadás
4
1. ábra. Matlab főablak
3.
Változók, értékadás
A változónevek számok és betűk kombinációi, a megkötés csupán annyi, hogy az első karakter nem lehet szám, valamint a változónév maximális hossza 31 karakter lehet. Szerepelhet benne a _ (alulvonás) karakter.
3.1.
Skalár változók
Az értékadás minden esetben a = használatával történik: >> a=3.45 az a változó értéke legyen 3.45 a= 3.4500 A változó típusának megválasztása automatikus, nem kell foglalkoznunk a megadásával. A fenti esetben valós lesz az a változó. Amennyiben nem akarjuk, hogy az eredmény megjelenjen a parancsablakban, egy pontosvesszővel zárjuk le az utasítást: >> a=3.45; >>
3 Változók, értékadás
5
Komplex számok megadása az alábbi módokon történhet: >> c=1+2*i c= 1.0000 + 2.0000i >> d=2+3*j d= 2.0000 + 3.0000i Komplex számok esetében fontos művelet a konjugálás (a képzetes rész előjele megfordul), erre a ’ operátor használatos: >> c’ ans = 1.0000 - 2.0000i
3.2.
Vektor változók
Veltorok megadása szögletes zárójelek között történik: >> v=[1 2 3] sorvektor v = 1
2
3
illetve: >> w=[1;2;3] oszlopvektor w = 1 2 3 Tehát sorvektorok esetén az egyes elemek közé szóköz (vagy vessző) kerül, oszlopvektor esetén pedig pontosvessző.
3 Változók, értékadás
6
Transzponálás segítségével kaphatunk oszlopvektorból sorvektort (és fordítva), ezt a Matlabban a ’ jelöli: >> w’ ans = 1 2 3 Amennyiben komplex elemű vektoraink vannak, a ’ operátor értelemszerűen a konjugált transzponáltat jelöli. 3.2.1.
Indexelés
Vektorok elemeire az alábbi módon hivatkozhatunk: >> w(2) a w vektor 2. eleme ans = 2 Vektor értékadása történhet elemenként is: >> w(3)=2.3+4*i w = 1.0000 2.0000 2.3000 + 4.0000i
3.3.
Mátrix változók
Mátrixok megadása nagyon hasonló a vektorokéhoz, például a 4 5 6 2 5 4 mátrix esetében: >> A=[4 5 6;2 5 4] A=
3 Változók, értékadás
7
4 5 6 2 5 4 A transzponálás hasonlóan működik, mint a vektoros esetben. 3.3.1.
Speciális mátrixok
Vannak speciális mátrixok, amelyeket az egyszerűség kedvéért külön utasítással lehet létrehozni: >> eye(4) 4 × 4-es egységmátrix ans = 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> zeros(3,2) 3 × 2-es nullmátrix ans = 0 0 0
0 0 0
>> ones(3,2) 3 × 2-es mátrix csupa egyesekkel ans = 1 1 1
1 1 1
>> rand(2,3) 2 × 3-as véletlen mátrix, aminek az elemei a [0 , 1] intervallumon egyenletes eloszlásúak ans = 0.9501 0.2311
0.6068 0.4860
0.8913 0.7621
3 Változók, értékadás
8
>> randn(2,3) 2 × 3-as véletlen mátrix, aminek az elemei 0 várhatóértékű és 1 szórású normális eloszlásúak ans = 1.0668 0.0593
-0.0956 -0.8323
0.2944 -1.3362
A véletlenszám generálás természetesen skalárokra is működik: s=randn s = 0.7143 3.3.2.
Indexelés
A mátrixok elemeire, soraira, oszlopaira, illetve részmátrixaira a vektoroknál leírt módszer általánosításával hivatkozhatunk: >> A(1,2) az A mátrix 1, 2 indexű eleme ans = 5 Egész sorra való hivatkozás: >> A(2,:) az A mátrix második sora ans = 2
5
4
Oszlopra való hivatkozás: >> A(:,1) az A mátrix első oszlopa ans = 4 2 Részmátrixra való hivatkozás:
3 Változók, értékadás
9
>> D=rand(5,5) legyen D egy 5 × 5-ös véletlen mátrix >> D = 0.4565 0.0185 0.8214 0.4447 0.6154
0.7919 0.9218 0.7382 0.1763 0.4057
>> D(2:4,1:2)
0.9355 0.9169 0.4103 0.8936 0.0579
0.3529 0.8132 0.0099 0.1389 0.2028
0.1987 0.6038 0.2722 0.1988 0.0153
a 2 − 4 sor és az első kettő oszlop elemei
ans = 0.0185 0.8214 0.4447
0.9218 0.7382 0.1763
Egy mátrix (vagy vektor, vagy skalár) méretének lekérdezése a size utasítás segítségével történik: >> size(A) ans = 2
3
Amennyiben az A mátrix esetében csak a sorok, vagy csak az oszlopok számára vagyunk kíváncsiak, a size(A,1) vagy a size(A,2) utasítás használható.
3.4.
Munkatérbeli változók
Ha kíváncsiak vagyunk az aktuálisan használt változónevekre, illetve a változók méretére és típusára, akkor a legegyszerűbb a Parancsablak (Command window) bal oldalán az Aktuális könyvtár (Current directory) helyett a Munkatér (Workspace) tabot kiválasztani (2. ábra). A Parancsablakban a whos utasítással ugyanez az információ válik elérhetővé.
4 Műveletek
10
2. ábra. Munkatérbeli változók megjelenítése
4.
Műveletek
4.1.
Alapvető műveletek
4.1.1.
Összeadás, kivonás, szummázás
Skalárokon triviális, mátrixok és vektorok esetén vigyázni kell, hogy az operandusok méretei megegyezzenek. Vektorokon (v sorvektor, w pedig oszlopvektor): >> v-w ??? Error using ==> Matrix dimensions must agree. >> v-w’ ans = 0
0
0.7000 + 4.0000i
4 Műveletek
11
Mátrixokon: >> A=[2 2;3 3]; >> B=[1 2 4;3 4 5]; >> A+B ??? Error using ==> + Matrix dimensions must agree. >> B=[1 2;3 4]; >> A+B ans = 3 6
4 7
Szummázás: egy vektor elemeit adja össze, illetve mátrixok esetén az oszlopok elemeinek összegeit tartalmazó sorvektor az eredmény. >> sum(B) ans = 4
6
>> sum(sum(B)) ans = 10 4.1.2.
Szorzás, osztás, inverz
A szorzás és az osztás skalárokra triviális, mátrixok esetén a méreteknek stimmelniük kell. Skalárokra az inverz a reciprokkal egyezik meg, mátrixoknál van jelentősége. Vektorok szorzása (v = [1, 2, 3], w = [1, 2, 2.3 + 4i]T , a = 3.45): >> w*v ans = 1.0000 2.0000
2.0000 4.0000
3.0000 6.0000
4 Műveletek
12
2.3000 + 4.0000i
4.6000 + 8.0000i
>> v*w ans = 11.9000 +12.0000i >> a*v ans = 3.4500
6.9000
10.3500
Mátrixok szorzása (v = [1, 2, 3], a = 3.45): >> A=rand(3,4); >> B=randn(4,2); >> A*B ans = 2.3917 0.6315 2.3585
-1.8969 -1.2047 -2.5930
>> B*A ??? Error using ==> * Inner matrix dimensions must agree. >> v*A ans = 4.4324
3.8420
2.9469
2.9212
1.6077 1.4443 2.9195
1.8118 0.6991 2.3189
2.8915 0.0678 2.3504
>> a*A ans = 2.5764 1.5356 3.2148
6.9000 +12.0000i
4 Műveletek
13
A mátrixok invertálását elvégző utasítás az inv(): >> D=rand(3,3) D = 0.3795 0.8318 0.5028
0.7095 0.4289 0.3046
0.1897 0.1934 0.6822
1.7927 -0.6878 -1.0142
-0.2351 -0.3548 1.7974
0.0000 1.0000 0
0 0 1.0000
>> inv(D) ans = -0.9828 1.9776 -0.1587 >> D*inv(D) ans = 1.0000 0.0000 -0.0000
4.1.3.
Hatványozás
A hatványozást megvalósító Matlab operátor a ^, mind skalárokra, mind pedig mátrixokra értelmezve van. Pl.: >> A=2*ones(3) A = 2 2 2 >> A^2
2 2 2
2 2 2
(A2 = A · A, a mátrix szorzás szabályai szerint)
4 Műveletek
14
ans = 12 12 12
4.1.4.
12 12 12
12 12 12
Komplex számok
Komplex számoknak a kanonikus (z = a + bi), illetve exponenciális alakját (z = reiϕ ) használhatjuk. Megjegyzés: Az exponenciális alak trigonometrikus ekvivalense z = r(cos(ϕ)+ i sin(ϕ)). Komplex számok képzetes részének megadása az i és a j betű segítségével történik, éppen ezért ezeket csak olyan esetekben használjuk változóként, amikor nem komplex számokkal dolgozunk! >> z=3+4*j komplex szám megadása z = 3.0000 + 4.0000i A valósrészt visszaadó utasítás: >> real(z) ans = 3 A képzetes részt visszaadó utasítás: >> imag(z) ans = 4 Átalakítás exponenciális alakra: >> angle(z) z fázisszögének meghatározása
4 Műveletek
15
ans = 0.9273 >> abs(z)
az eredmény radiánban (−π és π közötti érték) z abszolútértékének (hosszának) meghatározása
ans = 5 Komplex szám megadható közvetlenül exponenciális alakban is: >> 3*exp(i*pi) ans = -3.0000 + 0.0000i A komplex konjugált meghatározására a korábban megismert ’ operátor mellett a conj() utasítás is használható: >> conj(z) ans = 3.0000 - 4.0000i Az olyan műveleteknél, melyek komplex számok esetében több eredményt is adhatnak, (eml: egy komplex számnak n db n-edik gyöke van, vagy komplex logaritmus) Matlabban mindig csak egy eredményt kapunk.
4.2.
További műveletek
4.2.1.
Alapvető függvények
Az alábbiakban csak felsorolásszerűen, példa nélkül adjuk meg a Matlabban elérhető alapvető matematikai függvényeket. A help(utasitasnev) utasítással egy rövid súgót kapunk a parancsablakba, amely részletezi a kérdéses utasítás működését (milyen összefüggést valósít meg), illetve szintaxisát.
Trigonometrikus függvények.
4 Műveletek
16
acos acosh acot acoth asin asinh atan atanh cos cosh cot coth sin sinh tan tanh
arkusz koszinusz arkusz koszinusz hiperbolikusz Arkusz kotangens Arkusz kotangens hiperbolikusz Arkusz szinusz Arkusz szinusz hiperbolikusz Arkusz tangens Arkusz tangens hiperbolikusz Koszinusz Koszinusz hiperbolikusz Kotangens Kotengens hiperbolikusz Szinusz Szinusz hiperbolikusz Tangens Tangens hiperbolikusz
Exponenciális és logaritmus függvények. exp log log2 log10 sqrt
Exponenciális Természetes alapú logaritmus (ln) Kettesalapú logaritmus Tizesalapú logaritmus Négyzetgyök
Kerekítés és maradékos osztás. fix Kerekítés 0 felé floor Kerekítés −∞ felé ceil Kerekítés +∞ felé round Kerekítés a legközelebbi egész felé mod Modulo osztás rem Osztás utáni maradék sign Előjelfüggvény Diszkrét matematika. factor factorial gcd lcm nchoosek perms
Prímtényezős felbontás Faktoriális Legnagyobb közös osztó Legkisebb közös többszörös Összes lehetséges kombináció Összes lehetséges permutáció
n k
4 Műveletek
4.2.2.
17
Mátrixfüggvények
A Matlabban rengeteg lineáris algebrai és mátrixanalízisbeli függvény segíti a munkát, ezek közül csak a fontosabbakat soroljuk fel. • Mátrix determinánsa: det >> det(A) Visszatérési értéke 0, ha a mátrix szinguláris, azaz nem invertálható. • Mátrix rangja: rank >> rank(A) A mátrix lineárisan független sorainak, vagy oszlopainak számát adja meg. • Mátrix (vagy vektor) norma: norm >> norm(A) Mátrix, vagy vektor `2 normáját adja vissza. Mátrix esetén ez a legnagyobb szingulárisérték, vektor esetében pedig a vektor hossza. • Mátrix nyoma: trace >> trace(A) A mátrix főátlójában álló elemek összege. • Mátrixinverz: inv >> inv(A) Az A·A−1 = I egyenletet kielégítő mátrixot adja vissza, ha létezik. • Sajátérték, sajátvektor: eig Az Av = λv egyenletet kielégítő (λ, v) sajátvektor-sajátérték párok meghatározására. Pl: >> A=rand(3); >> [s_vektor,s_ertek]=eig(A) s_vektor = 0.5396 0.6639 0.5178
0.7050 -0.0492 + 0.3569i -0.5466 - 0.2728i
0.7050 -0.0492 - 0.3569i -0.5466 + 0.2728i
0 0.0658 + 0.3097i 0
0 0 0.0658 - 0.3097i
s_ertek = 1.9681 0 0
4 Műveletek
18
A példában az s_ertek nevű diagonális mátrix tartalmazza főátlójában az A sajátértékeit, az egyes sajátértékekhez tartozó sajátvektorok pedig az s_vektor mátrix megfelelő oszlopai. • Mátrix exponenciális: expm >> expm(A) Az exponenciális függvény végtelen sorba fejtve általánosítható mátrixokra is: exp(A) =
∞ X Ak k=0
k!
• Mátrix logaritmus: logm >> logm(A) A mátrix exponenciális függvény inverze. • Mátrix négyzetgyök: √ √ √ sqrtm A az a mátrix, amely kielégíti az A · A = A >> sqrtm(A) egyenletet. • Elemenkénti műveletek: Mátrixokra és vektorokra egyaránt érvényes, hogy a művelet operátora elé kitett pont (.) az eredeti művelet elemenkénti változatát hajtja végre, pl: >> X=2*ones(3,3) X = 2 2 2
2 2 2
2 2 2
12 12 12
12 12 12
>> X^2 ans = 12 12 12 >> X.^2 ans =
4 Műveletek
19
4 4 4
4 4 4
4 4 4
• Megjegyzés: Ha a Matlabban egy, a matematikából skalárváltozósnak megismert függvényt (pl. sin, exp, stb.) hívunk meg mátrix, vagy vektor argumentummal, akkor az egyes elemek függvényértékeit tartalmazó ugyanolyan méretű mátrixot, vagy vektort kapjuk vissza, pl: >> Y=ones(2,3); >> exp(Y) ans = 2.7183 2.7183
4.2.3.
2.7183 2.7183
2.7183 2.7183
Polinomok
A polinomokat az teszi nagyon vonzóvá, hogy bármely műveletet könnyedén el lehet rajtuk végezni - még a differenciálást, és az integrálást is. A Matlab a polinomokat vektorokként tárolja, a vektor elemei pedig a polinom együtthatói. Ezt a függvénycsaládot a Matlab analitikus úton tudja differenciálni és integrálni (A Symbolic Math Toolbox használatával többféle analitikus, illetve szimbolikus számolás is elvégezhető - nem csak polinomokra). A fontosabb utasításokat az alábbiakban részletezzük. • Polinom definiálása: poly Annak a polinomnak az együtthatóit adja vissza sorvektorként, amelynek gyökei az argumentumként megadott vektor elemei. >> r=[1 2 3]; az r vektor tartalmazza a polinom gyökeit >> p=poly(r)
a polinom megadása a gyökeivel történik, azaz p(x) = (x − 1)(x − 2)(x − 3)
p =
4 Műveletek
20
1 -6 11 -6 az első helyen a független változó legmagasabb kitevőjű hatványának együtthatója áll, azaz p(x) = x3 − 6x2 + 11x − 6. • Polinom kiértékelése: polyval >> x=4; >> polyval(p,x) a p polinomot szeretnénk kiértékelni x-ben. ans = p(4) = 6
6
a kiértékelés elvégezhető vektorosan is: >> t=rand(1,5); öt véletlenszerű pontban szeretnénk kiértékelni p-t. >> polyval(p,t) ans = -1.8589
-0.8588
-2.3070
-3.1777
-4.1228
• Polinomok szorzása: conv Az argumentumban megadott polinomok összeszorzásával kapott polinom együtthatóit tartalmazó sorvektorral tér vissza. Ez az utasítás gyakorlatilag két vektort konvolvál össze, innen a neve. Példa: szorozzuk össze a p(x) = (x−1)(x−2), és a q(x) = (x−2)(x−3) polinomokat: >> p=poly([1 2]); >> q=poly([2 3]); >> conv(p,q) ans = 1
-8
23
-28
12
p(x)q(x) = x4 − 8x3 + 23x2 − 28x + 12 • Polinomosztás: deconv Az utasítás hívásánál figyelni kell arra, hogy ennél a műveletnél képződhet maradék is. Az eredménynek két változót kell biztosítani: [s,r]=deconv(q,p), azaz q(x)-et elosztva p(x)-szel a hányados s(x), a maradék pedig r(x),
4 Műveletek
21
és q(x) = s(x)p(x) + r(x). >> p=poly([1 2]); >> q=poly([1 2 3]); >> [s,r]=deconv(q,p) s = 1
-3
0
0
r = 0
0
maradék nélkül el tudtuk osztani
>> w=poly([5 6 3]); >> [s,r]=deconv(q,p) s = 1
-11
0
0
r = 28
-68
itt már van maradék is
• Polinom deriváltja: polyder Például w(x) = (x − 5)(x − 6)(x − 3) = x3 − 14x2 + 63x − 90 deriváltja dw(x) = 3x2 − 28x + 63 dx >> polyder(w) ans = 3
-28
63
• Polinom gyökei: roots Az argumentumként megadott polinom gyökeit adja vissza egy oszlopvektorban. >> roots(w) ans =
5 Grafikus ábrázolás
22
6.0000 5.0000 3.0000
5.
Grafikus ábrázolás
Az adatok kirajzoltatására számos lehetőség van Matlabban, itt csak a legegyszerűbbeket mutatjuk be.
5.1.
Kétdimenziós ábrák
A legtöbbet használt parancs, amivel kétdimenziós ábrákat hozhatunk létre, a plot, de a kirajzolni kívánt adatok jellegétől függően más utasításokra is szükség lehet. A plot egy univerzális parancs, amellyel elsősorban folytonos adatsort tudunk ábrázolni, ha azonban diszkrét adatsorral van dolgunk, előnyösebb a stem utasítás, amellyel impulzussorozatként ábrázolhatjuk az adatainkat. Hasonló esetben használható a stairs, amely nulladrendű tartószervvel mintavételezett jelekként ábrázolja adatainkat. Kétváltozós függvényeket a contour utasítás segítségével szintvonalakkal ábrázolhatunk két dimenzióban. A Matlab a grafikai műveleteknél is mátrixokkal és vektorokkal dolgozik, ezért ha jó minőségű ábrákat szeretnénk készíteni, az ábrázolandó függvény értelmezési tartományának megfelelő finomságú felosztását kell elkészíteni. A feleslegesen finom felosztás kerülendő, mert idő és számításigényes. • Felosztás adott lépésközzel Az indexelésnél már megismert : operátorral történik. >> s=3:7 az s vektor fogja tartalmazni a [3 7] intervallum 1 lépésközű felosztását s = 3 4 5 6 7 Ha finomabb felosztást szeretnénk előállítani, nem árt, ha változtatni tudjuk a lépésközt az alábbi módon: >> t=-pi:pi/2:pi a [−π π] intervallum felosztása π2 lépésközzel. Szintaxis: also_hatar:lepeskoz:felso_hatar t = -3.1416
-1.5708
0
1.5708
3.1416
5 Grafikus ábrázolás
23
• Felosztás adott számú részintervallumra: Amíg az előbbiekben a felosztás lépésközét adhattuk meg, addig ebben az esetben az intervallum határai mellett azt a számot adjuk meg, ahány részre osztani szeretnénk az intervallumot: >> r=linspace(1,3,5) Szintaxis: linspace(also,felso,hanyfele) r = 1.0000
1.5000
2.0000
2.5000
3.0000
• plot utasítás: Nagyon általános parancs, sokféle opcionális argumentummal hívható, itt csak a leggyakrabban használt kombinációkat mutatjuk be. >> t=-pi:pi/10:pi; Felosztás >> plot(t,sin(t)) kirajzoltatás: első argumentum a felosztást tartalmazó vektor, második a függvény értékeit tartalmazza a felosztási pontokban (itt a sin utasítás egy t-vel azonos méretű vektorral tér vissza, melynek elemei t komponenseinek szinuszai) Az utasítás eredményéül kapott ablak a 3. ábrán látható.
3. ábra. A plot utasítás eredménye
Amennyiben bele szeretnénk szólni az ábra színébe, a vonalstílusba és a vektorpontokba rajzolt szimbólumokba, egy harmadik argumentumot
5 Grafikus ábrázolás
24
is meg kell adni a plot parancsnak, ami egy speciális sztring, aminek az első eleme a vonalstílust határozza meg: -: -. r g b c m y k w
Vonaltípus Folytonos vonal Szaggatott vonal Pontvonal Szaggatott pontvonal Színek Piros Zöld Kék Cián Magenta Sárga Fekete Fehér
+ o * . x s d ^ v > < p h
Szimbólum Plusz jel Kör Csillag Pont Kereszt Négyzet Rombusz Háromszög ↑ Háromszög ↓ Háromszög → Háromszög ← Ötágú csillag Hatágú csillag
Például egy véletlen számsorozat ábrázolása magenta színű pontvonallal, a pontokban hatágú csillagokkal (4. ábra): >> t=linspace(1,100,30); >> y=randn(size(t)); >> plot(t,y,’:mh’) • stem utasítás: Olyankor használjuk, ha az ábrán ki szeretnénk hangsúlyozni az adatsor diszkrét voltát (5. ábra). Szintaxisa hasonló a plot utasításéhoz. Például: >> t=-pi:pi/10:pi; >> stem(t,sin(t)) • stairs utasítás: Nulladrendű tartószervvel mintavételezett rendszerek jeleinek ábrázolásához (6. ábra). Szintaxisa hasonló a plot utasításéhoz. >> t=-pi:pi/10:pi; >> stairs(t,sin(t),’r--’) • Több ábra egymáson: hold Ha kettő, vagy több ábrát szeretnénk ugyanabban az ablakban ábrázolni, akkor a hold utasítást használjuk:
5 Grafikus ábrázolás
25
4. ábra. A plot utasítás eredménye a megadott vonaltípussal, színnel, és szimbólummal
5. ábra. A stem utasítás eredménye
>> plot(...); Első plot utasítás >> hold on A hold funkció bekapcsolva >> plot(...) A további ábrák a korábbival egy ablakba kerülnek. A hold funkció kikapcsolható a hold off utasítással.
5 Grafikus ábrázolás
26
6. ábra. A stairs utasítás eredménye
• Rácsozat: grid Használata hasonló a hold-hoz, rácsozatot jelenít meg az aktuális ábrán. • Képmagyarázat: legend Ha egy ablakban ábrázoltunk több adatot, ajánlatos kitenni egy jelmagyarázatot, amely megkönnyíti az olvasást (7. ábra). Az utasítás argumentumai a megyarázatban megjelenítendő sztringek, az ábrák sorrendjében, pl: t=pi/2:pi/10:4*pi; plot(t,exp(-0.5*t).*sin(t)) hold on grid on plot(t,exp(-0.5*t),’:r’) legend(’exp*sin’,’exp’) • Egyéb ábrafeliratok: Az ábra címét a >> title(’abra_cim’) utasítással adhatjuk meg, a tengelyek feliratait pedig az >> xlabel(’x_tengely_felirat’) >> ylabel(’y_tengely_felirat’) >> zlabel(’z_tengely_felirat’) (3D esetben z-tengely is van) utasításokkal változtathatjuk meg.
6 Programozás
27
7. ábra. A legend, hold, és a grid utasítás haználata
5.2.
Háromdimenziós ábrák
5.3.
Nyomtatás fájlba
Hasznos lehet még az ábrák fájlba való exportálása. Erre a nem túl elegáns [Alt]+[PrintScreen] kombináción kívül két lehetőség is van a Matlabban. Az egyik az ábrát tartalmazó Figure ablak File → Export menüjén keresztül, a másik pedig a parancssoros megoldás: >> print -depsc fajlnev A fajlnev nevű színes eps fájlba menti az aktuális grafikus ablak ábráját. >> print -djpeg90 fajlnev A fajlnev nevű, 90%-os minőségű jpeg fájlba menti az aktuális grafikus ablak ábráját. >> print -dtiff fajlnev A fajlnev nevű színes tiff fájlba menti az aktuális grafikus ablak ábráját. >> print -dpng fajlnev A fajlnev nevű színes png fájlba menti az aktuális grafikus ablak ábráját.
6.
Programozás
Ha egy bonyolultabb feladattal szembesülünk, kényelmesebben megoldható egy szkript segítségével, ami nem más, mint kötegbe szedett Matlab utasítások összessége. Ha olyan a feladat, hogy többször kell elvégezni különböző adatokon, egy függvény írása ajánlatosabb, mivel ennek argumentu adható
6 Programozás
28
át híváskor. Szkriptekben és függvényekben is megkönnyíti a feladat algoritmizálását a ciklusok és feltételvizsgálatok használata. A Matlab programnyelve hasonló a Basic-hez, elsajátítása egyszerű. A megírt szkripteket és függvényeket egy .m kiterjesztésű ún. M-fájlba mentjük. Új M-fájlokat a Matlab főablak File → New menüpontjában hozhatunk létre, létezőket pedig a File → Open menüpontban nyithatunk meg. Az M-fájlok szerkesztése történhet tetszőleges szövegszerkesztővel, de a Matlab beépített Editor -ja kényelmesebbé teszi a munkát (8. ábra).
8. ábra. A Matlab Editor ablaka Szkriptekben és függvényekben egy adott sorban a % jelet követő szövegrész megjegyzésnek minősül, azt a Matlab nem értelmezi utasításként. Több sornyi kódrészletet a 9. ábrán látható módon lehet egyszerűen kommentezni.
6.1.
Szkriptek
A legegyszerűbb M-fájl fajta, sem bemeneti, sem kimeneti argumentumai nincsenek. A szkriptek látják a Munkatér összes változóját, és módosítani is tudják azokat, illetve új változókat hozhatnak létre a Munkatérben.
6 Programozás
29
9. ábra. Többsoros kódrészlet kommentezése
Akkor hasznosak, ha rendszeresen több Matlab utasítást akarunk egymásután végrehajtani. A szkript végrehajtása a fájl nevének (kiterjesztés nélkül) begépelésével történik. 6.1.1.
Egy példa szkript
Az alábbi szkript egy 5 × 5-ös véletlen mátrx sajátértékeit rajzolja ki a komplex számsíkon (10. ábra), feliratozza az ábrát, végül pedig a sajat.eps nevű eps fájlba exportálja: % Egy véletlen matrix sajatertekeinek kirajzoltatasa A=randn(5,5); [u,v]=eig(A); valosresz=real(diag(v)); kepzetesresz=imag(diag(v)); plot(valosresz,kepzetesresz,’ro’) xlabel(’Re’) ylabel(’Im’) grid on
6 Programozás
30
title(’Sajátértékek’) print -depsc sajat A szkript hívása pedig a Parancsablakban az alábbi módon: >> sajat
10. ábra. A sajat.m szkript által kirajzolt ábra
7 Simulink
6.2.
Függvények
6.2.1.
Változótípusok
6.2.2.
Súgó írása
6.2.3.
Hibakezelés
6.2.4.
Egy példa függvény
6.3.
Ciklusok
6.4.
Elágazások
7.
Simulink
31