3. BETEKINTÉS A MATLAB PROGRAMRENDSZERBE Írta: Hujter Mihály Bevezetés A MATLAB* (a név a MATrix LABoratory = mátrix-ODERUDWyULXP NLIHMH]pVEO HUHG HJ\ LQWHUDNWtY WXGRPiQ\RV pV PV]DNL V]iPtWiVRN FpOMiUD NLIHMOHV]WHWW PiWUL[DODS~ programrendszer, mely oktatási célokra is rendkívül alkalmasnak bizonyult. Összetett numerikus problémák is megoldhatók vele anélkül, hogy bonyolult programokat kellene írni. A programrendszert eredetileg Cleve Moler írta FORTRAN nyelven hosszú évekig tartó fejlesztés eredményeképpen. A hátteret adó mátrixalgoritmusok a LINPACK és az EISPACK SURMHNWHNEOV]iUPD]QDN$]~M0$7/$%-ot már C-ben készítette el a The MathWorks, Inc.. 1pY V]HULQW D V]HU]N Steve Bangert, Steve Kleiman, John Little és Cleve Moler. A MATLAB-hoz kiegészítéseket írtak: Lennart Ljung, Carl de Boor, Richard Chiang, Michael Safonov és sokan mások. A rendszernek IBM-kompatibilis AT-kre DOS fölé is több változata forgalmazott. A programrendszer csak a licenszegyezmény feltételeit megtartva használható. (A feltételek UpV]OHWHVOHtUiVDD>@MHO]pVLURGDOPLKLYDWNR]iVEDQWDOiOKDWy A MATLAB indítása A DOS-ból a MATLAB utasítással léphetünk be a programba és az exit vagy a quit utasítással léphetünk majd ki a munka befejeztekor. A rendszerben való tájékozódást jól segíti a help EHOVSDUDQFVDPLYHOOHNpUGH]KHWDEHpStWHWWIJJYpQ\HNPYHOHWHNpVXWDVtWiVRNOLVWiMD$ help IJJYpQ\QpYXWDVtWiVQpYNRQVWDQVYDJ\PYHOHWLMHO D PHJQHYH]HWW IJJYpQ\ XWDVtWiV NRQVWDQV YDJ\ PYHOHWL MHO KDV]QiODWiUyO WRYiEEL információt ad. Pl. help pi révén megtudhatjuk, hogy pi jelöli a Ludolf-IpOHV]iPRW1pKiQ\KDV]QRVOHKHWVpJpUOHJ\ bemutatót kaphatunk a *
The MathWorks, Inc. (Natick MA01760 USA) szabadalma
demo és az intro utasításokkal (help = segíts; demo = demonstrate = tarts bemutatót; intro = introduce = vezess be). Ë]HOtWDUHQGV]HUQ\~MWRWWDOHKHWVpJHNUO A MATLAB egy interaktív számítógépes matematikai programrendszer, mely különösen alkalmas vektorokkal és mátrixokkal kapcsolatos számításokra. A hasonló célú rendszerek N|]O D UHQGNtYO WHUPpV]HWHVpVHJ\V]HUKDV]QiODWiYDOiWWHNLQWKHWSURJUDPR]KDWyViJiYDO Wnik ki. Lássuk, milyen természetesen tudjuk vele megoldani például az 4x+5y+6z=7, 5x+6y+7z=8, x+7y+7z=9 egyenletrendszert! Miután elindítjuk a programot, az A=[4 5 6;5 6 7;1 7 7] utasítás definiálja az együtthatók mátrixát, a b=[7;8;9] SDUDQFVSHGLJD]~QMREEROGDOYHNWRUW0RVWHJ\V]HUHQ A\b révén már meg is kapjuk x, y és z értékét: -0.3333 -0.3333 1.6667 Ha jobban tetszik a végeredmény közönséges tört alakban, akkor d=det(A) az A mátrix determinánsa, így a round([A\(d*b) [d;d;d]]) utasítás megadja egymás alatt x, y és z értékét közönséges tört alakban, csak éppen a W|UWYRQDODNKLiQ\R]QDNVRURQNpQWDV]iPOiOypVQHYH]N|]|WW,WWround DNHUHNtWpVWYpJ] beépített függvény, és az a szerepe, hogy a gép egész számokat írjon, a tizedespont utáni nulla számjegyeket ne mutassa: -2 6 -2 6 10 6 Lehet azonban még ennél is elegánsabban a rat beépített függvénnyel, amely egy vektor komponenseit tört alakban közelíti, s mivel esetünkben kis számlálójú és neYH]MUDFLRQiOLV számokról van szó, pontosan meg is adja: [sz,ne]=rat(A\b) (QQHNHUHGPpQ\HNpSSHQDV]iPOiOyNpVDQHYH]NpUWpNHLWNDSMXNPHJ sz=
-1 -1 5 és ne= 3 3 3 A det beépített függvény egy négyzetes mátrix determinánsát számítja ki. A \ (= backslash = fordított per-jel) a mátrixokra vonatkozó baloldali osztás jele. Ha A n-szer n-es, B n-szer m-es mátrix, akkor az A\B kifejezés lényegében ugyanazt jelenti, mint az inv(A)*B kifejezés attól eltekintve, hogy a számítógép másképpen számítja ki. A * ( = star = csillag) jel mátrixszorzást jelent, az inv pedig az A mátrix inverzét. Az is látszik, hogy a szögletes ]iUyMHOHNpVDSRQWRVYHVV]VHJtWVpJpYHOKRJ\DQpStWKHWQNIHOHJ\PiWUL[RWHOHPHLEOYDJ\ akár részmátrixaiból. A bYHNWRUWDV]|JOHWHVV]iUyMHOHNpVDSRQWRVYHVV]NVHJtWVpJpYHOszor 1-HV PiWUL[QDN D]D] RV]ORSYHNWRUQDN GHILQLiOWXN D SRQWRVYHVV] PLQGLJ D]W MHOHQWL YpJHYDQDVRUQDNDN|YHWNH]PiWUL[-alkotóelem már új sorba kerül), így a d*b szorzat is 3szor 1-es, hiszen d skalár, azaz 1-szer 1-es mátrix. Tehát A\(d*b) is egy 3-szor 1-es mátrix, ami mellé odaírtuk a [d;d;d] jelöléssel felírt 3-szor 1-es mátrixot, melynek mindhárom eleme d pUWpN $ NpW RV]ORSYHNWRU HJ\PiV PHOOp tUiViUD FVDN D VSDFH UHV NDUDNWHU elválasztójelet kellett beírnunk. Itt [d;d;d] helyett írhattuk volna azt is, hogy [d d d]', mivel az ' (= apostrophe = aposztróf) a transzponálás jele. Azt is írhattuk volna, hogy d*ones(3,1), hiszen a ones beépített függvény egy olyan mátrixot készít, melynek minden eleme 1-HV D IJJYpQ\ HOV DUJXPHQWXPD D NpV]tWHQG FVXSD-1-mátrix sorainak száma, a második argumentum az oszlopok száma. Az inv(A) kifejezés helyett pedig lehet azt írni, hogy A^(-1). Itt ^ az egész mátrixra vonatkozó hatványozás jele. Ha elemenként akarunk hatványozni, akkor ^ helyett azt írjuk, hogy .^ (pont és hatványozás). Pl. a p=[2;3;5;7;11;13] [ones(6,1) p p.^2 p.^3 p.^4 p.^5] parancsok azt a 6-szor 6-os mátrixot eredményezik, melyben az i-edik sor j-edik eleme az iedik primszám (j-1)-edik hatványa: 1 2 4 8 16 32 1 3 9 27 81 243 1 5 25 125 625 3125
1
7
49
343
2401
16807
1
11
121
1331
14641
161051
1
13
169
2197
28561
371293
A MATLAB rendkívül tömör programozhatóságát mutatja az alábbi két rövid parancs, amik azt a 10-szer 10-es mátrixot eredményezik, amiben az i-edik sor j-edik eleme i ezer forint kamatos kamattal növelt értéke ezer forintos egységben számolva j év elteltével évi 7.8 százalék kamatlábra: t=1:10 t'*1.078.^t $]DOiEELDNEDQUpV]OHWHVHEEHQLVNLIHMWMND0$7/$%OHKHWVpJHLW Mátrixok A MATLAB programrendszerben lényegében egyetlen típusú objektum van: valós vagy komplex számokat tartalmazó mátrix; minden változó mátrixot jelöl. Az 1-szer 1-es mátrixok skalárok, az egyetlen sort vagy oszlopot tartalmazó mátrixok vektorok. A mátrixokat -
megadhatjuk közvetlenül az elemek felsorolásával;
-
összerakhatjuk kisebb mátrixokból;
-HONpV]tWKHWMNEHpStWHWWXWDVtWiVRNNDOIJJYpQ\HNNHOPYHOHWHNNHO -HOiOOtWKDWMXNSURJUDPVHJtWVpJpYHO -EHW|OWKHWMNNOVDGDWiOORPiQ\EyO Pl. az A változóhoz ugyanazt a 3-szor 3-as mátrixot rendelhetjük többféleképpen is: A=[1 2 3;4 5 6;7 8 9] A=[1 2 3 4 5 6 7 8 9] A=[1:3;4:6... ;7:9 ] Számokat megadhatunk - egész számként
(pl. 2)
- tizedes ponttal
(pl. 2.3)
-OHEHJSRQWRVDQ
(pl. 0.234e2)
$] HJ\ PiWUL[VRUEDQ V]HUHSO HOHPHN HOYiODV]WiVD , FRPPD YHVV] YDJ\ VSDFH szünet), a sorok elválasztása ; VHPLFRORQ SRQWRVYHVV] YDJ\ HQWHU VRUYpJHNRFVLYLVV]D VHJtWVpJpYHO W|UWpQKHW %HpStWHWW IJJYpQ\HNNHO HJ\V]HUHQ WXGXQN HOiOOtWDQL speciális mátrixokat: Így pl. rand(n) n-szer n-es, a rand(n,m) n-szer m-es pszeudóvéletlen valós számokból álló mátrix (az elemek független, a [0,1] intervallumban egyenletes eloszlásúak); hilb(n) n-szer n-es, ún. Hilbert-mátrix (ami a rosszul
kondicionált mátrixok mintapéldája): H(i,j)=1/(i+j-1). Mátrixok és vektorok egyes elemeire a szokásos módon, kerek zárójelek között megadott indexekkel hivatkozunk: A(3,2) az A mátrixban a harmadik sor második eleme, x(3) az x vektor harmadik komponense (függetlenül attól, hogy sor vagy oszlopvektorról van szó). Megemlítjük, hogy ha egy vektort konponenseivel adjuk meg, akkor az sorvektor lesz. Pl. y(1)=6; y(2)=4 eredménye: 6
4
Ha helyette oszlopvektort akarunk, írhatjuk ezt: y=zeros(2,1); y(1)=6; y(2)=4 0YHOHWHN $0$7/$%PiWUL[PYHOHWHL +
összeadás
(skalárokra és mátrixokra egyaránt),
-
kivonás
(skalárokra és mátrixokra egyaránt),
*
szorzás
(mátrixokra),
^
hatványozás
(mátrixokra),
'
transzponált képzés
(mátrixokra),
\
baloldali osztás
(mátrixokra),
/
jobboldali osztás
(mátrixokra).
$] XWROVy |W PYHOHWHW DONDOPD]KDWMXN VNDOiURNUD PLQW -szer 1-es mátrixokra is. Ha a PiWUL[PpUHWHN QHP |VV]HLOON KLED]HQHWHWNDSXQNNLvéve a skalár-mátrix esetet, amikor a PYHOHWDVNDOiUpVDPiWUL[HJ\HVHOHPHLN|]|WWKDMWyGLNYpJUHDKRJ\D]WHOLVYiUMXN Ha A invertálható négyzetes mátrix, bHJ\PHJIHOHOPpUHWRV]ORS- ill. sorvektor, akkor az x=A\b az Ax=b, ill. az x=b/A az xA=b lineáris egyenletrendszerek megoldása. Ha A négyzetes mátrix, akkor a gép Gauss-eliminációval faktorizálja A-WpVDWpQ\H]NHWKDV]QiOMD az Ax=b megoldására. Ha A nem négyzetes, akkor a Householder-féle ortogonalizáció WpQ\H]LWYHV]LDJpSD]DOXO- illetve túlhatározott egyenletrendszernek a legkisebb négyzetek értelmében való megoldására. A jobboldali osztás a baloldali osztás segítségével, b/A=(A'\b') alapján megy. (A Gauss-elimináció, a Householder-féle ortogonalizáció és a NpVEELHNEHQ PpJ HOIRUGXOy HJ\pE QXPHULNXV PyGV]HUHNEHOL IRJDOPDN GHILQtFyMD PHJWDOiOKDWyD>@MHO]pVLURGDOPLKLYDWNR]iVEDQ A *, ^ és /PYHOHWHNQHPDPiWUL[RNUDKDQHPHOHPHQNpQWKDMWyGQDNYpJUHKDDPYHOHWL jelet egy . GRW SRQW HO]LPHJËJ\XJ\DQD]WHUHGPényezi az alábbi három utasítássor: [1 2 3 4].*[1 2 3 4] [1 2 3 4].^2 [1 4 9 16]
A + és - jelek helyett is írhatnánk azt, hogy .+ vagy .-, de ez semmi különbséget nem HUHGPpQ\H]QHKLV]HQH]HNDPYHOHWHNPiUHOHYHHOHPHQNpQWpUWHOPH]HWWHN Utasítások, kifejezések, változók A gép az utasításokat sorban interpretálja és kiértékeli. Az utasítások alakja: változó=kifejezés YDJ\HJ\V]HUHQ kifejezés $NLIHMH]pVHNPYHOHWLMHOHNEOIJJYpQ\-, konstans-pVYiOWR]yQHYHNEOpSOKHWQHNIHO$] értékadó kifejezések eredménye egy-HJ\ PiWUL[ OHV] DPL pUWpNNpQW KR]]iUHQGHOGLN D megadott változóhoz. Ha nem adunk meg változót, akkor a gép automatikusan az ans (= DQVZHU YiODV] YiOWR]yW iOOtWMD HO pV D NLV]iPtWRWW HUHGPpQ\W pUWpNNpQW DQQDN DGMD Speciális skalárértékek a NaN (= not a number = nem egy szám) és az inf (= positive infinity SR]LWtYYpJWHOHQ $]HOEELSOHUHGPpQ\HD]XWyEELpUWpNH$]eps (= epsilon = epszilon) pedig egy nagyon kicsi pozitív szám, definíció szerint az 1.0 és a nála nagyobb, legközelebbi, a gépen ábrázolható szám különbsége. Ez egy konkrét szám, de NaN és inf FVDNV]LPEyOXPRND]XWyEELWIHNYQ\ROFDVIRUPiMiEDQMHO]LNLDJpS $] XWDVtWiVRN iOWDOiEDQ HQWHU NRFVLYLVV]D OHWpVpYHO YpJ]GQHN GH D] XWDVtWiVW IRO\WDWKDWMXNHJ\YDJ\W|EEIRO\WDWyODJRVVRUEDQKDD]HQWHUHOWWKiURPSRQWRWtUXQN A=A+B... +C (J\VRUEDQW|EEXWDVtWiVLVOHKHWKDN|]WNYHVV]YDJ\SRQWRVYHVV]YDQ A=2*B, C=3*A; D=C +D SRQWRVYHVV] YDQ DNNRU D] D]W PHJHO] XWasítás eredménye nem jelenik meg a NpSHUQ\QYHVV]QpOSHGLJLJHQ6RUYpJpUHIHOHVOHJHVDYHVV]GHtUKDWySRQWRVYHVV] A MATLAB különbséget tesz az utasítások, függvények és változók nevében a kis- és QDJ\EHWN N|]|WW tJ\ x és X nem ugyanaz. Tehát csak a quit utasítással lehet kilépni a MATLAB-ból; a QUITFVXSDQDJ\EHWYHOtUYD PiUPiVWMHOHQW $ YiOWR]yNDW QHP GHNODUiOMXN D]RNQDN D JpS PHJIHOHO PpUHW WiUWHUOHWHW IRJODO pV D változók nevét és utolsó értékét a MATLAB futásának teljes idejére megjegyzi. A változókról a who (= kik vannak) utasítással kérhetünk egy listát, a már szükségtelen változókat pedig clear (=törölj) paranccsal távolíthatjuk el, és így memóriát szabadíthatunk fel. A MATLAB-ot quit-HOYH D] |VV]HV YiOWR]y HOYHV]LN +D HJ\ NpVEEL IXWWDWiVNRU PpJLV szükségünk lenne a változókra, akkor azokat a save (= ments) segítségével tehetjük el (természetesen még a quit HOWW D] |VV]HV DEEDQ D SLOODQDWEDQ PHJOpY YiOWR]y QHYH pV pUWpNHEHNHUOD0$7/$%0$7DGDWiOORPiQ\ED+DNpVEELsmét belépünk a MATLAB-ba, akkor load (= tölts) állítja vissza munkaterületünknek a save pillanatában megvolt állapotát.
0iWUL[pUWpNIJJYpQ\HN Speciális mátrixokat ad: eye V]HPN|]SRQWLKHO\]HWGRORJ egységmátrix zeros (= nullák) nullamátrix ones (= egyesek) csupaegyesmátrix diag (= diagonal) diagonális mátrix triu (= triangular, upper) PiWUL[IHOVKiURPV]|JUpV]H tril (= triangular, lower) mátrix alsóháromszög része rand (= random) véletlen számok mátrixa Itt zeros(m,n) egy m-szer n-es, zeros(n) pedig egy n-szer n-es csupanulla mátrix; ha A egy mátrix, akkor zeros(A) egy A-YDO PHJHJ\H] PpUHW FVXSDQXOOD PiWUL[ 8J\DQH] ones, természetesen nullák helyett egyesekkel, és eye LV LO\HQ GH LWW FVDN D IiWOyEDQ vannak egyesek, máshol nullák. Ha x egy vektor, akkor diag(x) egy diagonális mátrix, PHO\QHN IiWOyMiEDQ IHQWUO OHIHOp D] x elemei vannak; ha A négyzetes mátrix, akkor a diag(A) egy vektor az AIiWOyMiEyOV]iUPD]yHlemekkel. Kitalálható, mi lesz diag(diag(A)) és az is, hogy triu(A) és trul(A) az A mátrixból egy-HJ\XJ\DQRO\DQPpUHWPiWUL[RW NpV]tWDIiWOyDODWWLOOIHOHWWFVXSDQXOODPiWUL[RWDPLPiVKROPHJHJ\H]LNA-val. Mátrixot építhetünk részmátrixokból is. Ha pl. A egy 3-szor 3-as mátrix, akkor 5-ször 5-ös mátrixot ad: [A zeros(3,2);ones(2,3) eye(2)] For, while és if utasítások (]HNKDVRQOyDQPN|GQHNDKKR]DPLWPiVQ\HOYHNEOLVPHUQN for i=1:n, x(i)=i^2; end vagy for i=1:n x(i)=i^2; end egy n-YHNWRUWiOOtWHOXJ\DQD]WPLQW for i=n:-1, x(i)=i^2; end csak az utóbbi fordított sorrendben csinálja. Az end önmagában áll, nincs begin párja; szerepe a for-ciklus lezárása. A fenti H Hilbert-mátrixot így is képezhetnénk: for i=1:n, for j=1:n, H(i,j)=1/(i+j-1); end, end A while-ciklus általános alakja: while reláció utasítások
end Az utasításokat a gép ismételgeti, amíg a reláció igaz. Ha például a egy adott szám, akkor az alábbi program meghatározza azt a legkisebb n egész számot, melyre 2-nek az n-edik hatványa legalább a. n=0; while 2^n
(= greater than = nagyobb, mint) <= OHVVWKDQRUHTXDOWR NLVHEEYDJ\HJ\HQO >= JUHDWHUWKDQRUHTXDOWR QDJ\REEYDJ\HJ\HQO == HTXDOWR HJ\HQO ~= QRWHTXDOWR QHPHJ\HQO A == jel csak a relációkban használatos, értékadásra az = jel való. A relációkat a & (= AND = ÉS) | (= OR = VAGY) ~ (= NOT = NEM) jelekkel kapcsolhatjuk össze. Ha a relációjeleket skalárokra alkalmazzuk, akkor a reláció pUWpNHVNDOiU YDJ\DWWyOIJJHQKRJ\DUHOiFLyLJD]YDJ\KDPLV(J\|QPDJiEDQiOOy skalár is reláció, melynek értéke akkor és csak akkor hamis, ha a skalár számértéke 0. Azonos PpUHW PiWUL[RNUD DONDOPD]YD D UHOiFLy pUWpNH HJ\ -kat és 1-eseket tartalmazó mátrix, PHO\QHNHOHPHLDPHJIHOHOPiWUL[HOHPHNN|]|WWLUHOiFLyHUHGPpQ\pWPXWDWMiN7DOiOMDNLPL ez: a=rand(n), b=triu(a), a==b Ha a while-ciklusban, vagy az if-utasításban a reláció mátrixokra vonatkozik, akkor a program csak abban az esetben tekinti az eredményt igaznak, ha a relációs mátrix minden eleme nemnulla. Ha egy utasítást A=B esetén akarunk végrehajtani, akkor azt írjuk:
if A==B, utasítás; end De ha az utasítást akkor akarjuk végrehajtatni, ha AQHPHJ\HQOB-vel, akkor if A==B, else utasítás; end OHV]DMypVQHPD]HOVQHNHV]QNEHMXWy if A~=B, utasítás; end melyben az utasítás csak akkor kerül végrehajtásra, ha az A és B mátrixok egymástól elemenként minden helyen külön-NO|QNO|QE|]N 6NDOiUpUWpNIJJYpQ\HN Bizonyos MATLAB-IJJYpQ\HN DODSYHWHQ VNDOiURNUD pUWHOPH]HWWHN GH DONDOPD]KDWyN PiWUL[UDLVD]XWyEELHVHWEHQDIJJYpQ\HOHPHQNpQWpUWHQG$OHJJ\DNUDEEDQKDV]QiOWLO\HQ függvények: sin (= sine = szinusz) cos (= cosine = koszinusz) tan (= tangent = tangens) asin (= arc sine = árkusz szinusz) acos (= arc cosine = árkusz koszinusz) atan (= arc tangent = árkusz tangens) exp (= exponential = exponenciális) log (= logarithm = logaritmus) természetes logaritmus sqrt (= square root = négyzetgyök) abs (= absolute value = abszolútérték) round (= kerekíts ) egész számra kerekít rem (= remainder = maradékrész) sign VLJQXP HOMHO floor (= padló ) alsó egészrész ceil (= ceiling = mennyezet ) IHOVHJpV]UpV] Talán csak a rem függvény igényel némi magyarázatot: rem(x,y) értéke x-yn, ahol az n értéke az x/y hányados alsó egész része. VektorérWpNIJJYpQ\HN +DH]HNHWDYHNWRUpUWpNIJJYpQ\HNHWm-szer n-es mátrixokra alkalmazzuk (ahol m legalább DNNRURV]ORSRQNpQWpUWGQHNpVD]HJ\HVRV]ORSRNUDYRQDWNR]yHUHGPpQ\HNHJ\n-hosszú sorvektort adnak. Sorvektor esetén az eredmény skalár, és ugyanaz, mint ami a sorvektor WUDQV]SRQiOWMiUDOHQQH,O\HQYHNWRUpUWpNIJJYpQ\HN max (= maximum) legnagyobb elem min (= minimum) legkisebb elem sum (= összeg) az elemek összege
prod median mean any all Némi magyarázatra
(= product = szorzat) az elemek szorzata (= medián) N|]pSVQDJ\ViJ~HOHP (= átlag) az elemek számtani középe (= bármelyik) 1 ill. 0, ha van ill. nincs nemnulla (= mindegyik) 1 ill. 0, ha mind ill. nem mind nemnulla szorul any és all $] HOEEL DEEDQ D NRPSRQHQVEHQ DG pUWpNHW
DPHO\LN RV]ORSEDQ HOIRUGXO -WyO NO|QE|] V]iP D] XWyEEL SHGLJ FVDN DEEDQ D komponensben, amelyik oszlopban minden szám 0-WyO NO|QE|] 0LQGNpW IJJYpQ\ esetében a többi komponens 0 lesz. Az A mátrix legkisebb ill. legnagyobb eleme így írható fel: min(min(A)) ill. max(max(A)) 0iWUL[pUWpNIJJYpQ\HN 1pKiQ\LJHQKDV]QRVPiWUL[pUWpNIJJYpQ\ eig (= eigen- = saját-) poly (= characteristic polynomial) inv (= inverse) det (=derminant) rank (= rang) size (= méret) lu /pV8EHWN qr (= Q és R bHWN hess (= Hessenberg) chol (= Cholesky) svd (= singular value decomp.) expm (= exponent of a matrix) sqrtm (= square root of a matrix) norm (=norma) cond (= condition number)
sajátértékek és -vektorok karakterisztikus polinom mátrix inverze determináns független oszlopok száma mátrix méretét adó 2-vektor LU-felbontás QR-felbontás Hessenberg-alak Cholesky-felbontás szingulárisérték-dekompozíció mátrixexponens mátrix-négyzetgyök 1-, 2-, végtelen- , Frobenius-norma kondíciószám 2-normában
Egy függvénynek esetenként lehet vagy egy, vagy két outputargumentuma is: eig(A) az A sajátértékeit tartalmazó vektor, [U,D] = eig(A) eredménye pedig egy U mátrix, mely az A sajátvektorait tartalmazza, és egy D diagonális PiWUL[IGLDJRQiOLViEDQD]A sajátértékeivel. Pl. [U,D] = eig(diag(1:3))
eredménye: U= 1 0 0
0 1 0
0 0 1
D= 1 0 0 0 2 0 0 0 3 Ide kapcsolódik a poly függvény, ami egy négyzetes mátrix karakterisztikus polinomját (az HJ\WWKDWyNEyO NpS]HWW VRUYHNWRUW V]iPtWMD NL D] HJ\WWKDWyN FV|NNHQ NLWHYN V]HULQWL VRUUHQGEHQpUWHQGNKDDPiWUL[n-szer n-es, akkor az eredményvektornak a hossza n+1. Pl. poly([1 2 3;4 5 6;7 8 0]) értéke 1 -6 -72 -27 A polyVHJtWVpJpYHOHJ\SROLQRPRWDQQDNJ\|NHLEOLVHOiOOtWKDWXQNSO poly([1;2;4]) értéke 1
-7
14 -8 hiszen (x-1)(x-2)(x-4)=x3-7x2+14x-8. 5pV]PiWUL[RNpVDNHWWVSRQW 9HNWRURN pV UpV]PiWUL[RN KDV]QiODWiYDO D PHJOHKHWVHQ |VV]HWHWW DGDWNH]HOpVL KDWiVRN pUKHWN HO $ NHWWVSRQW FRORQ DPL PLQG D YHNWRURN HOiOOtWiViUD PLQG SHGLJ UpV]PiWUL[RNNLMHO|OpVpUHKDV]QiOKDWy pVDYHNWRURNNDOW|UWpQLQGH[HOps a kulcsa a hatékony DGDWNH]HOpVQHN /HKHWYp WHV]LN KRJ\ FV|NNHQWVN D FLNOXVRN DONDOPD]iViW DPLN WHUPpV]HWHVHQODVVtWMiNDJpSHW pVKRJ\HJ\V]HUiWWHNLQWKHWSURJUDPRNDWtUMXQN$] 0:19 kifejezés a [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] kifejezéssel ekvivalens. Ez egy kicsit következetlen a for-ciklusbeli jelöléssel, hiszen for i=0:19 nem azt jelenti, hogy i egy 20-hosszú sorvektor, hanem azt, hogy i sorban felveszi a vektor elemeit skalárértékként. $ NHWWVSRQW DONDOPD]iVDNRU VHP D] DOVy pV IHOV KDWiUNpQW V]HUHSO V]iPRN VHP SHGLJ D Q|YHNPpQ\QHPV]NVpJNpSSHQHJpV]pUWpNHN 1.2:-0.2:-0.4 ugyanaz, mint
[1.2 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4] Szinusz-táblázatot készít 15 fokpercenként: x=[0:0.25:90]'; y=sin(x.*pi./180); [x y] 0LYHODV]LQXV]HOHPHQNpQWpUWHQGDN|]pSVXWDVtWiVD]x vektorból egy y YHNWRUWiOOtWHO $NHWWVSRQWWDONLYiODV]WKDWMXNHJ\PiWUL[YDODPHO\UpV]PiWUL[iWLV A(1:4,3) egy 4-KRVV]~RV]ORSYHNWRUDPiWUL[RV]ORSiEyOD]HOVHOHPHWWDUWDOPD]]D$NHWWVSRQW önmagában a teljes sor vagy oszlop kijelölése: A(:,3)az A mátrix 3. oszlopa, A(1:4,:) pedig az A HOV VRUiEyO iOOy PiWUL[ 7HWV]OHJHV HJpV]HOHP YHNWRUW DONDOPD]KDWXQN indexként: A(:,[2,4])a 2. és 4. oszlopot tartalmazza. Ilyen indexelés értékadás mindkét oldalán lehet: A(:,[2 4 5])=B(:,1:3) az A PiWUL[ pV RV]ORSiQDN D KHO\HWWHVtWpVpW tUMD HO D B PiWUL[ HOV RV]ORSiYDO sorban, ahogyan jönnek egymás után. Az A mátrix 2. és 4. oszlopát jobbról [1 2;3 4]gyel szorozva: A(:,2,4)=A(:,2 4)*[1 2;3 4] 0LWPYHO x=x(n:-1:1) az n-hosszú x vektoron? Ugyanez mennyivel bonyolultabb Pascal, FORTRAN vagy C nyelven! M-adatállományok A MATLAB végre tudja hajtani adatállományban tárolt utasítások sorozatát is. Az ilyen adatállományokat M-adatállományoknak nevezzük, mivel azok DOS-ban .MNLWHUMHV]WpVHN A tipikus MATLAB-munka nagyrészt M-adatállományok írásából, javításából áll. Kétféle Madatállomány van: program- és függvény-adatállomány. $] HOV HJ\V]HUen MATLAB-XWDVtWiVRN HJ\ VRUR]DWD D EHQQH V]HUHSO YiOWR]yN JOREiOLV változók, a végrehajtás megváltoztatja a környezetet. Program-adatállományokat gyakran használunk nagy mátrixok feltöltésére; ilyen adatállományban az esetleg elkövetett hiba könnyen kijavítható. A BEVISZ.M négysoros adatállomány tartalma: A=[ 1 2 3 4 5 6 7 8 ]; ekkor a BEVISZ utasítás hatására létrejön a 2-szer 4-es A mátrix a megjelölt tartalommal. (Érdemes felfigyelni arra, hogy itt nem kell a sorok végére kiírni a három pontot.) Ha V]HUHWQpQNEHOHMDYtWDQLDPiWUL[EDV]|YHJV]HUNHV]WYHOiWtUMXND]BEVISZ.M adatállományt, majd újra kiadjuk az BEVISZ parancsot. Az M-adatállományok hívatkozhatnak más M-
adatállományokra és rekurzívan önmagukra is. Függvény-adatállományokkal még többre juthatunk: írhatunk magunknak függvényeket, amelyek ugyanolyan jogállásúak, mint a beépített függvények. A változók lokálisak. function C=AABB(A,B) % AABB két négyzetes mátrix négyzetének szorzata. C=A^2*B^2; Ezt a három sort a AABB.M adatálORPiQ\ED WHVV]N D DGDWiOORPiQ\QpY N|WHOH]HQ D függvénynév .M NLWHUMHV]WpVVHO$]HOVVRUGHNODUiOMDDIJJYpQ\HOMiUiVQHYpWD]LQSXW- és output-DUJXPHQWXPRNDW +D H] D VRU QHP V]HUHSHOQH DNNRU D] DGDWiOORPiQ\ HJ\V]HUHQ program-adatállomány volna). A z=AABB(x,y) utasítás átadja az x és y változók értékét a lokális A és B függvénybeli változóknak, majd az eredményt a z változóba kapjuk vissza. Minthogy a változók lokálisak, nevük független az egyéb MATLAB-változókétól. Egy függvénynek akár több output argumentuma is lehet: function [xx,dd]=STATISZT(X) % Az X mátrix oszloponkénti várható értéke és szórása. % Az eredmény két sorvektor. [m n]=size(X); % Sorok és oszlopok száma xx=sum(X)/m; dd=sqrt(sum(X.^2)/m-xx.^2); Ha a fenti programot elhelyeztük a STATISZT.M adatállományba, az [x,d]=STATISZT(X) révén x-ben megkapjuk az X mátrix várhatóértékét, d-ben a szórását. Alkalmazhatjuk a fenti eljárást egyetlen output-argumentummal is: x=STATISZT(X) eredménye x-ben az X várhatóértéke. Itt X.^2 elemenként végrehajtott négyzetreemelés, sum YHNWRUpUWpN sqrt VNDOiUpUWpN IJJYpQ\ sum(X)/m pedig mátrix-VNDOiU PYHOHW $ V]i]DOpNMHO D]W MHOHQWL KRJ\ D VRU KiWUDOpY UpV]H FRPPHQW PDJ\DUi]y V]|YHJ D 0$7/$% H]W D VRUUpV]W ILJ\HOPHQ NtYO KDJ\MD D] HOV QpKiQ\ PDJ\DUi]y VRU NLYpWHOpYHO melyek az M-adatállomány leírását adják; a help STATISZT parancs hatására ez a NpSHUQ\QPHJMHOHQLN Karakterfüzér, hibaüzenet, input 6]|YHJ NDUDNWHUI]pU VWULQJ LOOV]|YHJpUWpNYiOWR]yDSRsztrófjelek között adható meg: s='Hány sor kell egy jól megírt M-adatállományba?' utasítás az s-QHN DG pUWpNHW $ V]|YHJ D NpSHUQ\Q D disp (= display = mutasd) függvény VHJtWVpJpYHOMHOHQtWKHWPHJ disp(s) Persze közvetlenül is írhattuk volna: disp('Már egy sem, mert csak elrontaná!')
Hibaüzenetet az error (= hiba) függvénnyel adhatunk ki a saját programjainkból: error('Józsikám, nullával akarsz osztani?') Mellékeredményként ki is lépünk az M-adatállományból; ebben különbözik az error a disp-WO0-adatállományokból interaktívan is megkérdezhetünk inputadatokat: n=input('Hány iteráció kéne, haver? n=') $]DSRV]WUyIRNN|]|WWPHJDGRWWV]|YHJPHJMHOHQLNDNpSHUQ\QpVDSURJUDPYiUDPtJD] adatot begépeljük. Az enterre a begépelt adat n értéke lesz, és a program fut tovább. M-adatállományok szerkesztése és DOS-parancsok Ha szükség van egy új M-adatállományra, majd a MATLAB-munka folytatására, miközben szöveget szerkesztünk, a MATLAB-ot aktív állapotban tarthatjuk (hogy változók el ne vesszenek). A ! (= exclamation mark = felkiáltó- vagy helyesebben felszólítójel) speciális parancs, ami a MATLAB-ot félbeszakítja; a ! jel mögé egy DOS-parancsot írhatunk, és az végrehajtódik a MATLAB-ból való kilépés nélkül. Pl. !NE BONEY.M OHKHWYp WHV]L D] BONEY.M adatállomány szerkesztését a NE V]|YHJV]HUNHV]WYHO PDMG D] editorból való kilépés után pontosan oda jutunk vissza a MATLAB-ba, ahonnan elhagytuk azt. A MATLAB-ban a dir GLUHFWRU\ EHWUHQGHVQpYOLVWD XWDVtWiVPHJDGMDD]DNWXiOLV DOS-könyvtár adatállomámyainak listáját, a what (= mik vannak) pedig csak az Madatállományokat. Ezek helyett természetesen azt is lehet írni, hogy !dir ill. !dir *.M. A delete (= törölj) és type (= gépelj) utasításokkal adatállományokat törölhetünk, ill. MHOHQtWKHWQN PHJ D NpSHUQ\Q D chdir (= change directory = változtass könyvtárat) utasítással pedig aktuális DOS-könyvtárat válthatunk. Ezek a parancsok mind megvannak a DOS-ban is, de MATLAB-ban sem kell eléjük felkiáltójel. Algoritmusok hatékonyságának mérése Az algoritmusok hatékonyságának mérésére két szám szolgál: flops (= flop-ok = OHEHJSRQWRVPYHOHWHN- összeadások és szorzások - száma) és etime (= elapsed time = HOWHOW JpSLG $] HOV PLQGLJ NLDGMD D 0$7/$%-indulástól a függvény meghívása SLOODQDWiLJYpJUHKDMWRWW|VV]HVOHEHJSRQWRVPYHOHWHNV]iPiW$flops(0) utasítással ezt a számot visszaállíthatjuk az induláskori nullára. Ha így nullázunk közvetlenül egy algoritmus YpJUHKDMWiVDHOWWPDMGNLDGMXNDflops utasítást közvetlenül az algoritmus után, megkapjuk D] DOJRULWPXV OHEHJSRQWRV PYHOHWV]iPiW $ clock yUD IJJYpQ\ D] DNWXiOLV LGW mondja meg századmásodperc pontossággal; a 6-hosszú vektor komponensei az évszám, hónapsorszám, nap, óra, perc, másodperc. Két ilyen t és u LGDGDWYHNWRUUD etime(t,u) kiadja a u-tól t-LJ HOWHOW LGW .LPpUKHWMN PHQQ\L LG NHOO HJ\ DGRWW Ax=b lineáris egyenletrendszer Gauss-HOLPLQiFLyYDOW|UWpQPHJROGiViKR] time=clock; x=A\b; time=etime(clock,time)
0HQQ\LYHOW|EELGNHOOx=inv(A)*b végrehajtásához? Output-formátum A MATLAB az összes számolást dupla pontossággal végzi, az eredmények megjelenítését D]RQEDQV]DEiO\R]KDWMXND]HOVD]DODSpUWHOPH]pV format short
fixpontos ábrázolás tizedespont után 4 jeggyel
format long
fixpontos ábrázolás tizedespont után 14 jeggyel
format short e OHEHJSRQWRViEUi]ROiVWL]HGHVSRQWXWiQMHJJ\HO format long e
OHEHJSRQWRViEUi]ROiVWL]HGHVSRQWXWiQMHJJ\HO
A kiadott formátum-utasítás érvényben marad, amíg egy másikat ki nem adunk. Az alábbi utasítiVKDWiViUDD]UHVVRURNNLtUiVDHOPDUDGWHKiWHJ\NpSHUQ\UHMyYDOW|EEDGDWIpU format compact Ez független a többi format-utasítástól. Akár hexadecimálisan is kinyerhetjük az eredményt: format hex Pénzadatoknál eleve csak századpontossággal kell kiírni az eredményt, ekkor format bank SUDNWLNXV+DFVDND]HUHGPpQ\HOHPHLQHNHOMHOpUHYDJ\XQNNLYiQFVLDN format + (NNRUFVDND]HOMHOHNHWPXWDWMDDJpSQXOODKHO\HWWUHVKHO\HWKDJ\3O format +; triu(ones(3))-tril(ones(3)) eredménye: ++ - + -Naplózás $QDSOyNpV]tW diary adatállománynév XWDVtWiVGLDU\ QDSOy KDWiViUDPLQGD]DPLPHJMHOHQLNDNpSHUQ\QDJUDILNDNLYpWHOpYHO NLtUyGLND]DGDWiOORPiQ\QpYQHY$6&,,-adatállományba is (ha az adatállománynév elmarad, DNNRUD',$5<QHYDGDWiOORPiQ\ED PLQGDGGLJPtJ diary off (= napló ki) utasítással ezt meg nem tiltjuk; a diary on (= napló be) hatására az adatállományba írás ismét folytatódik. Grafika
Síkbeli grafikonok és háromdimenziós hatású háló-IHOOHWHN LV PHJMHOHQtWKHWN (]HNUO D OHKHWVpJHNUOHJ\EHPXWDWyWWDUWDplotdemo utasítás (ami a PLOTDEMO.M adatállományt hívja meg). A plot beépített utasítás x-y grafikonok készítésére szolgál; ha x és y azonos hosszúságú vektorok, akkor plot(x,y)IHOUDM]ROMDD]WDJ|UEpWDPLWDPHJIHOHOx(i),y(i)) koordinátájú pontok összekötésével kapunk. A szinuszfüggvény grafikonja a [4,4] intervallumon: x=-4:0.01:4; y=sin(x); plot(x,y) Ekkor az x vektor az értelmezési tartomány felosztását tartalmazza 0.01 lépésközzel, az y YHNWRUSHGLJDPHJIHOHOIJJYpQ\pUWpNHNHW $ JUDILNXV NpSHUQ\UO WHWV]OHJHV JRPEQ\RPiVUD YLVV]DWpUKHWQN D SDUDQFVNpSHUQ\K|] míg az shg (= show graph = grafikont mutass) utasítással visszanézhetünk az aktuális JUDILNXV NpSHUQ\UH (J\ UDM]RQ DNiU W|EE J|UEpW LV iEUi]ROKDWXQN D UDM]UD WHQJHO\HNUH IHOtUDWRNDW WHKHWQN .O|QE|] WtSXV~ JUDILNRQRNDW J\iUWKDWXQN D] iEUi]ROiVKR] alkalmazhatunk logaritmikus, illetve fél-ORJDULWPLNXVVNiOiW$JUDILNXVNpSHUQ\UOKDUGFRS\ a print XWDVtWiVVDONpV]tWKHW A mesh (= háló) függvénnyel térhatású hálófelület-grafikont is rajzoltathatunk. A hálófelületet egy x-\ VtNEDQ PHJDGRWW GHUpNV]|J KiOy PHWV]pVSRQWMDLKR] WDUWR]y z-értékek definiálják. Egy z=f(x,y) kétváltozós függvénynek egy téglalap feletti grafikonját ábrázolandó megadunk egy-egy x és y vektort a téglalap oldalainak felosztására. A meshdom (= mesh domain = háló értelmezési tartománya) függvénnyel csinálunk egy X mátrixot, amelynek minden sorában az x vektor áll, oszlopainak hossza pedig megegyezik az y hosszával, és hasonlóan egy Y mátrixot, melynek minden oszlopa y, és az ilyen oszlopok száma megegyezik x hosszával: [X,Y]=meshdom(x,y); Ezután kiszámítjuk a Z mátrixot úgy, hogy az f függvényt elemenként alkalmazzuk X-re és Y-ra. Pl. a z = f(x,y) = exp( -x2 - y2 ) grafikonja a [-2,2]-szer [-2,2]-es négyzet fölött, 0.2 felosztással: x=-2:0.2:2; y=x; [X,Y]=meshdom(x,y); Z=exp(-X.^2-Y.^2); mesh(Z) $]HOVVRUKHO\HWWU|YLGHEEHQH]LVPHJIHOHO [X,Y]=meshdom(-2:0.2:2,-2:0.2:2); A 2. sor maga a függvénydefiníció, és a 3. sor pedig az alábbi ábrát rajzolja ki:
Karakterfüzérváltozók és függvény-adatállományok kiértékelése Ezt a két feladatot az eval és feval beépített utasítások végzik. Ha t egy NDUDNWHUI]pUpUWpN VWULQJYDOXH YiOWR]yDNNRU eval(t) HJ\V]HUHQYpJUHKDMWMDDt-EHQOHtUWXWDVtWiVW(]DOHKHWVpJNO|Q|VHQDNNRUKDV]QRVKD0adatállományokat azok nevét tartalmazó változóval akarunk meghívni. Egy másik alkalmazás SOD]DPLNRUHJ\NDUDNWHUI]pUEHQOHtUWV]DEiO\DODSMiQW|OWQNIHOHJ\PiWUL[RWPLQWSOD Hilbert-mátrixot az alábbiak szerint: t='1/(i+j-1)'; for i=1:n, for j=1:n, M(i,j)=eval(t); end, end A feval egy függvényt értékel ki a megadott helyeken. Ha pl. van egy function plotf(f,x) y=feval(f,x); plot(x,y) tartalmú függvényadatállományunk, akkor az f változónak értékként beírt függvények grafikonját így kaphatjuk meg: x=0:.1:10; plotf('sin',x), plotf('cos',x), plotf('exp',x) Az alábbiakban további alkalmazásokat találunk. Egyenletek és egyenletrendszerek megoldása Ha mondjuk keressük az f(x)=2sin(x)-1 függvény gyökét 0.5 közelében (azaz a keresést 0.5EOLQGtWYD DNNRUHOEEOHNHOOtUQXQND]f függvényt-adatállományként: function y=f(x) y=2.*sin(x)-1; majd az FZERO.M adatállomány segítségével (amit a rendszerhez adnak) így kapjuk meg a gyököt: fzero('f',0.5).
Egy egyenletrendszer megoldása hasonlóképpen történhet az FSOLVE.M
adatállomány
sHJtWVpJpYHO DPLW V]LQWpQ D UHQGV]HUKH] DGQDN /iVVXN D N|YHWNH] HJ\HQOHWUHQGV]HU megoldását: sin(x) + y2 + log(z) = 7; 3x + 2 y - z 3= -1; x + y + z = 5. Most is kell írnunk egy függvény-adatállományt, melybe 0-ra rendezve írjuk az egyenleteket: function u=f(w) x=w(1); y=w(2); z=w(3); u=zeros(3,1); u(1)=sin(x)+y^2+log(z)-7;u(2)=3*x+2^y-z^3+1;u(3)=x+y+z-5; (]XWiQSOD]>@SRQWN|]HOpEHQOpYPHJROGiVWtJ\NDSMXNPHJ fsolve('f',[1;1;1])
Közönséges differenciálegyenletek megoldása Két beépített függvényt is találunk közönséges differenciálegyenletek (numerikus) megoldására: ode23
UHQG5XQJH-Kutta módszer
ode45
UHQG5XQJH-Kutta-Fehlberg módszer
Pl. tekintsük a Van der Pol-HJ\HQOHWNpQW LVPHUW HOVUHQG N|]|QVpJHV GLIIHUHQFLiOegyenletrendszer alakjában felírt feladatot: dx1/dt = x1(t) (1-x22(t)) - x2(t) dx2/dt = x1(t) Az (x1(t),x2(t DODN~PHJROGiVPHJNHUHVpVHtUiQ\iEDWHHQGHOVOpSpVNpQWV]HUNHV]WQNHJ\ függvény-adatállományt, amit elnevezünk VDP.M névre, és amiben leírjuk az egyenletrendszert: function DxPerDt=VDP(t,x) DxPerDt=zeros(2,1); DxPerDt(1)=x(1).*(1-x(2).^2)-x(2); DxPerDt(2)=x(1); Ahhoz, hogy pl. a [0,20] intervallumban megkaphassunk egy numerikus megoldást [t,x] alakban (ez három oszlopból álló mátrix), ezt írjuk: t0=0; tf=20; x0=[0;0.25]; % Peremfeltételek [t,x]=ode23('VDP',t0,tf,x0); $]HUHGPpQ\WD]WiQDNiUNpSHUQ\UHLVUDM]ROWDWKDWMXNplot(t,x) segítségével. Adatok importja és exportja ,WWPRVWFVDNDOHJHJ\V]HUEEPyGRNDW mutatjuk be, ahogyan egy ASCII-adatállományból egy MATLAB-EHOL PiWUL[YiOWR]y IHOW|OWKHW LOO DKRJ\DQ D 0$7/$% HJ\ PiWUL[D $6&,,DGDWiOORPiQ\EDNLWHKHW
Legyen adott egy ASCII-adatállomány, melyben soronként egy mátrix sorainak elemei vannak (legalább egy-HJ\ UHVNDUDNWHUUHOHOYiODV]WYD0RVWD]HOVVRUHOptUMXND]WDVRUW hogy ans=[ az utolsó sora után pedig azt, hogy ]; $]tJ\Q\HUWNHWWYHOW|EEVRUWWDUWDOPD]yDGDWiOORPiQ\WPHQWVNHOPRQGMXN BEMENET.M néven. Ezt az M-adatállományt BEMENET utasításként meghívva ans megadja az importált mátrixot. Ha pedig a MATLAB-ból egy mátrixot a KIMENET.TXT ASCII-adatállományba akarjuk kitenni, akkor csupán annyit kell csinálnunk, hogy kiszámítjuk a mátrixot vagy kiírjuk a már kiszámított mátrix nevét, ha van neki (ennek hatására az ans változó felveszi ezt az értéket), majd ki kell adnunk: save KIMENET.TXT ans -ascii Dupla pontosságú kiírás: save KIMENET.TXT ans -ascii -double Természetesen az ans helyére közvetlenül is beírhatjuk a mátrixváltozó nevét, de használhatjuk a diary utasítást is. ÈEUiNiWYpWHOHV]|YHJV]HUNHV]WNEH Hogyan tudjuk a MATLAB által szolgáltatott ábrákat átvenni valamilyen V]|YHJV]HUNHV]WEH"+RJ\H]OHKHWVpJHVDUUDDPHJPXWDWRWWiEUDDEL]RQ\tWpNDMHOHQV]|YHJ is egy Windows- V]|YHJV]HUNHV]WEHQ NpV]OW $ PHJROGiV NXOFVD D 0$7/$% UHGV]HUKH] adott GPP.EXE (vagy PCGPP.EXESURJUDP LOOD]HQQHNDKDV]QiODWiWOHKHWYpWHYmeta beépített MATLAB-utasítás. Ha egy M-adatállományunk valahol egy grafikont rajzol (akár plot, akár mesh révén), akkor a kirajzolás után írjuk pl. azt, hogy meta FIZIKA aminek eredményeként DOS-ban egy FIZIKA.MET QHY ~Q PHWDILOH NHOHWNH]LN DPL D NpSHUQ\QpSSHQDEEDQDSLOODQDWEDQOiWKDWyJUDILNXViEUDHJ\IDMWDNyGROiViWWDUWDOPD]]D$ GPP.EXE (vagy PCGPP.EXE) program pedig ezt a metafile-t alakítja át kivánságunk szerint DOS-NpSHUQ\NpSSp YDJ\ SHGLJ SO :LQGRZV-DODS~ V]|YHJV]HUNHV]WNEH EHLOOHV]WKHW képpé. Figyelem, a GPP.EXE (vagy PCGPP.EXE) program nem a MATLAB rendszeUEO hanem DOS-ból futtatható! Ha pl. a FIZIKA.METPHWDILOHWDUWDOPiW9*$NpSHUQ\DNDUMXN látni, akkor azt írjuk, hogy
GPP/dvga FIZIKA Ha pedig Windows-kompatibilis képet akarunk, akkor GPP/dhpgl FIZIKA HJ\OHKHWVpJHVPHJROGiV0LQGNpWiWDODNtWiVPHJOHKHWVHQLGLJpQ\HV7HUPpV]HWHVHQKDD GPP.EXE helyett a PCGPP.EXE van meg, akkor azt kell alkalmaznunk.) A fenti két utasítás N|]ODHOVQHPiOOtWHO~MDGDWiOORPiQ\WGHDPiVRGLNLJHQPHO\QHNQHYH FIZIKA.HPG lesz. Ezt a képet pl. a Microsoft Word 2.0 for Windows már be tudja illeszteni, ha megmondjuk neki, hogy HP Graphic Language +3 JUDILNXV Q\HOY NpSUO YDQ V]y Onnét kiküldhetjük azt a Paint Brush Windows-programba, és az ottani formátumot már PLQGHQPiV:LQGRZVIHOHWWLV]|YHJV]HUNHV]WLVpUWL2WWPpJNR]PHWLNi]KDWMXNLVDNpSHW :LQGRZVEDQ D]WiQ OHKHWVpJQN YDQ D Q\RPWDWyQN iOWDO Q\~MWRWW OHKHWVpJHN V]HULQWL WHWV]OHJHVNpSILQRPViJEDQLOOPpUHWEHQHVHWOHJPpJV]tQHVEHQLV NLQ\RPWDWQLD]iEUiW A plot utasítással és a s]tQHNNHONDSFVRODWEDQPHJNHOOPpJHPOtWHQQNDN|YHWNH]NHW$ plotDODSpUWHOPH]pVHHUHGHWLOHJW|EEV]tQGHD:LQGRZV-DODS~V]|YHJV]HUNHV]WNEHYDOy képátalakítások csak fekete-IHKpUEHQ PN|GQHN (]pUW FpOV]HU D JUDILNRQW PiU HOHYH FVDN fekete-fehérre kérni. Ha pl. a fenti differenciálegyenlet [t,x] megoldását két függvénygörbés grafikonként akarjuk fekete-IHKpUEHQDNpSHUQ\QOiWQL~J\KRJ\x(1)-nek pontozott vonal, x(2)-QHN IRO\WRQRV YRQDO IHOHOMHQ PHJ DNNRU D] HJ\V]HU plot(t,x)helyett azt írjuk, hogy plot(t,x(:,1),':w',t,x(:,2),'-w') Ezt az ábrát kapjuk:
A fenti írásmódban 'w' MHOHQWL D NpSHUQ\Q D ZKLWH IHKpU V]tQW DPLEO :LQGRZVEDQ fekete lett. A '-' jelentése solid line (= folyamatos vonal), a ':' jelentése dotted line (= SRQWR]RWW YRQDO (J\pE OHKHWVpJHN '--' (= szaggatott vonal) és '-.' (= pontozottV]DJJDWRWWYRQDO $NpSHUQ\QLJHQQ\RPWDWiVEDQQHPOiWV]LNDYRQDODNN|]WLNO|QEVpJ Áttekintés a további javasolt irodalomról
A MATLAB programrendszerbe jó betekintést nyújt magyarul [2], ami [1] magyar fordítása. [1] és [4] angol nyelven ad elég részletes ismertetést, de a legteljesebb [5]. Ez egy rövid EHYH]HWQNtYOKiURPIUpV]WWDUWDOPD](OV]|UD0$7/$%-nak PC-re való installálásáról olvashatunk, majd a rendszer általános bemutatása következik, végül a szövegszerkesztési és Q\RPWDWiVL OHKHWVpJHNNHO LVPHUNHGKHWQN PHJ $ PiVRGLN IUpV]EO D 0$7/$% OHJIRQWRVDEE V]ROJiOWDWiVDLW WDQXOKDWMXN PHJ D PiWUL[PYHOHWHNHW D JUDILNiW, a más programnyelvekkel való kapcsolatokat és az M-adatállományokat. Sok példán keresztül LVPHUNHGKHWQNPLQGH]HNNHO$KDUPDGLNIUpV]D]~QUHIHUHQFLD-fejezet. Ebben a beépített IJJYpQ\HN WHOMHV UpV]OHWHVVpJ OHtUiViW WDOiOMXN >@ HJ\ SiU ROGDODV DQJRO-magyar szótár közel ezer szócikkel. Azoknak hasznos, akik (csak) egy kicsit értik az angolt, és szeretnék N|]YHWOHQODEHpStWHWW+(/3VHJtWVpJpYHOLOOD]DQJROQ\HOYGRNXPHQWiFLyEyO PHJpUWHQL és megtanulni a MATLAB-ot. A legújabb MATLAB-fejlesztpVHNUO>@-ben olvashatunk. [7]EO D 0$7/$% PyGV]HULQHN KiWWHUpW EL]WRVtWy QXPHULNXV PyGV]HUHNEHOL IRJDOPDNDW pV algoritmu-sokat ismerhetjük meg.
Irodalom
[1] Sigmon, K., MATLAB Primer, Department of Mathematics, University of Florida (1989) [2] Gyurkovics É., Oktatási segédanyag a MATLAB használatához K. Sigmon "MATLAB 3ULPHU FtP PYH DODSMiQ %XGDSHVWL 0V]DNL (J\HWHP *pSpV]PpUQ|NL .DU 0DWHPDWLND Tanszék, Budapest (1993) [3] MATLAB 4.0 adds visualization object-oriented graphics, sound output, sparse matrices, and more, The Math Works Newsletter 6 (2) (1992) 1-3 [4] Coleman,T.F., van Loan,C., Handbook of Matrix Computations, SIAM, Philadelphia (1988) 187-260 [5] PC-MATLAB for MS-DOS Personal Computers: User's Guide, The Math Works, Inc. (1990) [6] Hujter M., Angol-magyar szótár a MATLAB programhoz, Miskolc-Egyetemváros (1994) megjelenés alatt [7] Stoyan, G.; Takó G.; Numerikus módszerek 1., ELTE-TypoTEX, Budapest (1993)