Matlab program és programozási nyelv Farkas Csaba 1
Miről lesz szó 1 Bevezetés Rövid történelem-forrás wikipédia.hu 2 Matlap programozási nyelv Változók Mátrixok,vektorok Pontosvessző 3 Matlab mûveletek 4 Kirajzolások, kész programok Felületek kirajzolása 5 Matlab függvények
A MATLAB (MATrix LABoratory = mátrix laboratórium) egy interaktív, tudományos és mûszaki számítások elvégzésére kifejlesztett, mátrixalapú, magas színtû programozási nyelv. A MATLAB egy speciális programrendszer, amely numerikus számítások elvégzésére lett kifejlesztve és emellett egy programozási nyelv. A The MathWorks által kifejlesztett programrendszer képes mátrix számítások elvégzésére, függvények és adatok ábrázolására, algoritmusok implementációjára és felhasználói interfészek kialakítására. Habár a szoftver kizárólag numerikus, a MuPAD csomag hozzáadásával képes matematikai kifejezéseket grafikusan is megjeleníteni. 2004-ben, hivatalos információk alapján, a MATLAB több, mint 1 millió felhasználóval rendelkezett.
Rövid történelem-forrás wikipédia.hu A MATLAB-ot az 1970-es évek elején Cleve Moler kezdte el fejleszteni, az akkori Új-Mexikói Egyetem Számítástudományi Intézetének elnöke. Kezdetben csak a diákjai munkáját tervezte megkönnyíteni, hogy ezen keresztül el tudják érni a LINPACK és EISPACK csomagokat Fortran tudás nélkül. Hamarosan elterjedt más egyetemek hallgatói és munkatársai között is és így erős érdeklődésre tett szert az alkalmazott matematikával foglalkozók körében. Jack Little, egy mérnök, Molernél tett látogatása során felismerte a MATLAB-ban lévő lehetőségeket 1983-ban.
Rövid történelem-forrás wikipédia.hu Utána nem sokkal csatlakozott Molerhez és Steve Bangert-hez, majd újraírták a MATLAB-ot C nyelven és megalapították a The MathWorks-ot 1984-ben. Ezek az újraírt könyvtárak JACKPAC néven váltak ismerté. 2000-ben a MATLAB-ot ismét újraírták, hogy újabb módszereket alkalmazzon a mátrixokkal való műveletekre, ebből született a LAPACK csomag. A MATLAB először az irányítástechnikával foglalkozók körében lett alkalmazva, ami Little szakterülete volt, de gyorsan elterjedt más területeken is. Manapság szintén használatos még az oktatásban, különösen a lineáris algebra és numerikus analízis szemléltetésében és népszerű még a képfeldolgozással foglalkozó kutatók között is.
Változók A Matlab nyelv egy interpreter. A változókat létrehozzuk, nincs szükség azok deklarálására. A változókat megfeleltetésekkel hozzuk létre. A változók lehetnek: valós típusúak például a=ones(5,1);, amelyekrõl a rendszer megjegyzi, hogy mekkorák és a megfelelõ mennyiségû memóriát lefoglalja. A változók alapértelmezetten mátrixok, azonban lehetõség van magasabb fokú tenzorok definíciójára is, például az b=ones(5,5,2); egy 5 5 2-es méretû tenzort hoz létre, mely két darab 5 5-ös mátrixot tárol és melyekre a b(:,:,1), valamint a b(:,:,2) parancsokkal hivatkozunk. Egy mátrixban egy egész sort kettõsponttal választunk ki. A Matlab-ban nincsenek egész vagy logikai típusú változók. sztring típusúak például s= a1b2c3d4 egy sztringet hoz létre. A sztringek karakter típusú vektorok, melyekkel az összes mátrix mûvelet is végezhetõ. cella típusúak például c={ sty,[1;2;3;4;5;6],2}, mindegyik elem lehet különbözõ típusú és méretû. A cellák elemeire a c{3} jelöléssel hivatkozunk és nem tudunk a vektorokra illetve a mátrixokra jellemzõ mûveletek alkalmazni azokon.
Változók Az egész MATLAB programrendszer, a MATLAB nyelv köré épül, amit néha M-code-nak vagy egyszerűen M-nek hívnak. A legegyszerűbb módja az M-code fordításának az, hogy a fordítandó programot begépeljük a >> prompt után, a Command Windowban, ami a MATLAB felület része. Ebben az esetben a MATLAB egy interaktív matematikai burokként fog működni. Ha az M-code több sorból áll, érdemes a MATLAB Editort használni, amivel akár saját függvényt is készíthetünk.
Változók Mint általában, a Matlab rendszerben is segít a help parancs, mely egy adott parancshoz ad magyarázatot: a help <függvény> a függvényhez tartozó magyarázatot jeleníti meg. A rendszerbe be van építve egy további segítség, a demo parancs, mely példákon keresztül mutatja be a Matlab mûködését és az interpreter jelleg által nyújtott lehetõségeket.
Változók Változókat az értékadó operátorral lehet deklarálni, ami az =. A MATLAB egy dinamikusan típusos nyelv, ami azt jelenti, hogy a változókat típusdeklaráció nélkül is lehet használni, kivéve ha szimbolikus objektumnak szánjukőket. A változók, az értékeiket kaphatják konstansokból, számításokból vagy egy függvény visszatérési értékéből is. 1 >> x = 17 x = 17 >> x = hat x = 6 hat >> x = [3*4, pi/2] x = 12.0000 1.5708 >> y = 3*sin(x) 11 y = -1.6097 3.0000
Mátrixok,vektorok A MATLAB egy "Mátrix Laboratórium", így többféle kényelmes megadási módját kínálja a vektoroknak, mátrixoknak és többdimenziós tömböknek. A tömböket ciklus használata nélkül is fel lehet tölteni az alábbi szintaxissal:mettől:mennyivel:meddig. >> array = 1:2:9 array = 3 1 3 5 7 9 >> array = 1:3:9 array = 1 4 7 >> array = 1:5 8 array = 1 2 3 4 5 >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] A = 16 3 2 13 13 5 10 11 8 9 6 7 12 4 15 14 1
Mátrixok,vektorok A MATLAB nyelvben, ahogy a matematikában is, a tömbök és mátrixok indexelése 1-től kezdődik. A legtöbb programozási nyelvben ez leggyakrabban 0-tól történik. A mátrixokat, az elemek felsorolásával is meg lehet adni szóközzel vagy veszővel elválasztva úgy, hogy a listát szögletes zárójelek ([]) között helyezzük el. A pontosvessző azt jelenti a felsorolásban, hogy az utána álló elemek a következő sorba kerüljenek. A kerek zárójelek használatával al-mátrixok is megjeleníthetőek. >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] A = 16 3 2 13 4 5 10 11 8 9 6 7 12 4 15 14 1 >> A(2,3) 9 ans = 11 >> A(2:4,3:4) ans = 14 11 8 7 12 14 1
Pontosvessző Más programozási nyelvekkel ellentétben, ahol a pontosvessző (;) választja el egymástól a parancsokat, a Matlabban, a parancsok kiírása függ tőle. Ha egy parancs végén pontosvessző szerepel, akkor nem kerül kiíratásra. Ellenkező esetben kiíródik. Ha egy parancs vagy függvény nem rendelkezik visszatérési étékkel, akkor ugyanaz történik a pontosvessző megléte vagy hiánya nélkül is.
A Matlab nyelvben a vektorokra jellemzõ mûveletek jelölése intuitív: a mátrix transzponáltját a bt=b mûvelet, a mátrix-szorzatot a c=b(:,:,1)*a jelöli. Amennyiben a mûveletek operandusai nem megfelelõ méretûek, a rendszer hibaüzenetet ír ki. A szokásos aritmetikai mûveleteken kívül ismeri a rendszer a hatványozást is, a ˆ jelöléssel, melyek mind érvényesek a mátrixokra is. Az osztáshoz például két mûvelet is tartozik, melyek az A X = B X = A\B, valamint a X A = B X = A/B lineáris egyenleteket oldják meg. Sokszor szeretnénk, ha elemenként végezne a rendszer mûveleteket a mátrixokon, ezt a mûveleteknek pontokkal való prepozíciójával tesszük. Például a C=(b(:,:,2)) ˆ 2 a mátrix önmagával való szorzásának az eredményét, a C=(b(:,:,2)). ˆ 2 a mátrix elemeinek a négyzeteit tartalmazó mátrixot adja eredményül.
A plot függvény segítégével 2 dimenzióban ábrázolhatunk függvényeket, ahol az x tömb tartalmazza a megjelenítendo" tartományt, az y tömb pedig a függvényt. clc% lasd a fuggvenyek kozott, vagy help clc x = 0:pi/100:2*pi; y = sin(x); 4 plot(x,y);
1 %parametrikusan kirajzolva egy gorbe clc; t=1:0.01:10; x=sin(2*t); y=sqrt(sin(t)); 6 axis equal; box on; plot(x,y)
Felületek kirajzolása 3-dimenziós függvényeket a surf, plot3 és mesh függvényekkel lehet megjeleníteni. Az [u, v] = meshgrid(x, y) két mátrixot állít elő, amelyek az x, y rácsrendszert definiálják. Haszna: összes lehetséges (uij,vij) pontokkal definiált rácson z = f (u, v) utasítással pontonként értékeket definiálhassunk. Ha a háló négyzetes, akkor írhatjuk: [X, Y] = meshgrid(x) ami megfelel a [X, Y] = meshgrid(x, x)-nek. clc; 2 x=-4:.1:4; y=-3:.1:3; [X,Y] = meshgrid(x,y); Z = X.^2-2*(X.*Y) + 3*Y + 2; rotate3d; 7 surf(x,y,z); N=10*pi; t = 0:pi/50:10*pi; 3 plot3(sin(t),cos(t),t); grid on for j=0:pi/50:n plot3(sin(n-j),cos(n-j),n-j, ro ); 8 hold on; pause(0.2) end
Felületek kirajzolása 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áromdimenziós koordinátarendszerben. A vektorok csak egyenlő hosszúak lehetnek. A plot3 utasításban szereplő str sztring paraméterrel a rajz színét és a rajz vonaltípusát definiálhatjuk.
Felületek kirajzolása 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áromdimenziós koordinátarendszerben. A vektorok csak egyenlő hosszúak lehetnek. A 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,x2,y2,z2,str2,...) Több grafikont készít ugyanabban a 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 fogja megválasztani azt
Felületek kirajzolása 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áromdimenziós koordinátarendszerben. A vektorok csak egyenlő hosszúak lehetnek. A 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,x2,y2,z2,str2,...) Több grafikont készít ugyanabban a 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 fogja megválasztani azt mesh(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.
Felületek kirajzolása 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áromdimenziós koordinátarendszerben. A vektorok csak egyenlő hosszúak lehetnek. A 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,x2,y2,z2,str2,...) Több grafikont készít ugyanabban a 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 fogja megválasztani azt mesh(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. mesh(x,y,z,c) 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-é n, akkor z m n-es mátrix)
Felületek kirajzolása 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áromdimenziós koordinátarendszerben. A vektorok csak egyenlő hosszúak lehetnek. A 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,x2,y2,z2,str2,...) Több grafikont készít ugyanabban a 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 fogja megválasztani azt mesh(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. mesh(x,y,z,c) 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-é n, akkor z m n-es mátrix) surf(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 n m-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 vesz fel. c a színmátrix.
A programokban gyakran alkalmazzuk a következõ függvényeket: rand egy véletlen számot térít vissza a [0, 1] intervallumból az intervallumon egyenletes eloszlást feltételezve. Argumentum nélkül a függvény egy nulla és egy közötti véletlen számot, egy argumentummal egy k k méterû véletlen mátrixot, egy vektorra pedig egy tenzort térít vissza, melynek méreteit a vektor elemei tartalmazzák. A randn hasonlóan véletlen változókat visszatérítõ függvény, azonban azok nulla átlagú és egy szórású normális eloszlást követnek. ones a fenti esethez hasonlóan egy vektort, mátrixot vagy tenzort térít vissza, azonban az elemeket 1-gyel tölti fel. A zeros az elemeket lenullázza. linspace a bemenõ argumentumok skalárisak és a függvény visszatéríti az elsõ két argumentum mint intervallum N részre való felosztásának a vektorát; az N a harmadik bemenõ változó. randperm egy argumentummal a k hosszúságú [1,..., k] vektor egy véletlen permutációját téríti vissza. union a lista elemeit halmazként használva egyesíti a két bemenõ halmazt. setdiff a lista elemeit halmazként használva visszatéríti az argumentumok metszetét. Használhatjuk még a unique és az ismember parancsokat a halmazzal való mûveletekre.
find indexeket térít vissza. Egy vektor azon elemeinek indexét, mely egy bizonyos feltételnek eleget tesz. Használják a vektor elemeinek szelekciójára. repmat elsõ argumentuma egy mátrix, amit adott sokszorossággal bemásol az eredménybe. A sokszorosságot a második argumentum adja meg. reshape argumentumai egy vektor vagy mátrix illetve egy méret paraméter. A függvény az elsõ argumentum elemeit a második argumentumban található méretek szerint formázza át. Pl. a v 256 hosszú vektort az m 16 16-os vektorba a m=reshape(v,[16,16]) paranccsal alakítjuk át. meshgrid az elsõ argumentum elemeit X-tengelyként, a második argumentumét Y-tengelyként használva két m n-es mátrixot térít vissza, ahol az elemek a négyzetháló X, illetve Y koordinátái oszlop-szerinti bejárásban. Hasznos amikor egy felületet szeretnénk kirajzolni. diag ha a bemenõ argumentum egy mátrix, akkor az átlón levõ elemek vektora az eredmény, ha pedig egy vektor, akkor az az átlós mátrix, mely nulla a fõátló elemeit kivéve, ott meg a bemenõ vektor elemei találhatók. Igaz a b = diag(diag(b)) állítás. inline egy függvény, mely segít rövid függvényeket általában egysorosakat definiálni, a függvényekben az alapértelmezett argumentum az x, több argumentum esetén a sorrendet is lehet specifikálni.
load egy korábban elmentett állapottér változóit állítja vissza. A változók elmentéséhez használjuk a save parancsot. fprintf egy vektor eleit formázva kiírja, a C -hez hasonló szintakszisban. Hasonlóan mûködnek a disp, a sprintf, valamint a num2str parancsok. acosd az argumentumra alkalmazott inverz koszinusz függvény, fokokban kifejezve. Más trigonometriai függvények a szokásosak: sin, cos, tan, atan, melyeket lehet elemenként és egyben is alkalmazni, ekkor az eredmény a vektorok elemeire alkalmazott mûveletek vektora. chol egy négyzetes pozitív definit mátrix Cholesky-felbontása. Az A mátrix Cholesky-alakja egy olyan C mátrix, mely csak a fõátlón és az alatt tartalmaz nullától különbözõ elemeket és fennáll az A = C C T egyenlõség. Figyeljük meg, hogy a Cholesky-alakot a négyzetgyök általánosításának lehet tekinteni. plot két vektort megadva kirajzolja az (x 1 (i), x 2 (i)) pontokat és azokat összeköti egy vonallal. Egy argumentum esetén x 1 = [1,..., N] és x 2 a bemenõ paraméter. Opcionálisan lehet stílusparamétereket is megadni. A plot3 paranccsal háromdimenzióban lehet pontokat, vonalakat megjeleníteni. hist egy adott adatvektor elemeinek a gyakoriságát rajzolja ki. Alapértelmezetten a vektor legkisebb és legnagyobb eleme közötti intervallumot osztja fel 10 részre és számolja az egyes szakaszokba esõ pontok számát. Úgy az intervallum mérete, mint a részintervallumok számossága illetve mérete változhat.
contour egy Z mátrix által definiált felület kontúrjait rajzolja ki. A felület generálásánál általában használjuk a meshgrid parancsot. A felületek rajzolására használhatjuk a surf parancsot is. figure létrehoz egy új ábrát illetve, amennyiben létezik a kívánt ábra, akkor aktívvá teszi azt. subfigure mnk létrehoz az ábrán egy részábrát úgy, hogy az eredeti ábra terét m n részre osztja, majd annak a k-adik komponensét teszi aktívvá. xlim az aktuális rajzon beállítja az X tengely alsó és felsõ határát. Ugyanígy mûködnek az ylim és zlim parancsok az Y illetve a Z tengelyekre. quadprog az x T Hx + b T x + c másodfokú egyenlet minimumát határozza meg, ahol feltételezzük, hogy a megoldásokat az Ax > 0 konvex doméniumra szûkítjük.