Bevezetés a MATLAB programba Gerardo Rodriguez Universidad de Salamanca
MATLAB (MÁTrix LABoratórium) egy interaktív program rendszer numerikus számításokra ,és numerikus grafikára. Ahogy a név sugallja, a MATLAB elsősorban mátrix számításokhoz van tervezve; lineáris egyenletek megoldására, mátrixok létrehozására, és így tovább. Továbbá változatos grafikai képességek továbbfejleszthetők olyan programokkal ,amik a saját programnyelvében lettek megírva. MATLAB a MATLAB nyelvben íródott.A legegyszerűbb mód végrehajtani a kódot, amit egy konzolba beírtunk.,>>, a „Command Window” (parancs ablakba) az egyik elem a „MATLAB Asztal” . Parancsok sorozatát el tudja menteni egy szöveges dokumentumba, tipikusan a „MATLAB editor” használatával, ahogyan egy szkript, vagy egy betokosodás egy függvénybe, a parancsok kibővítése lehetséges. A következő részekben bemutatásra kerül néhány hasznos képessége a MATLAB –nak több példával . A legjobb mód megtanulni, használni a MATLAB–ot, hogy: olvasás közben használjuk és próbálgatjuk a példákat.
Vektorok és Mátrixok megadása. Az alap adattípus a MATLAB-ban az „n” dimenzionális sor duplapontosságú számokkal. Az új adattipus tartalmazza a struktúrákat, osztályokat és a (cell array) cella sorokat, amikben a sorok különböző adattipussal rendelkezhetnek. A következő parancsok megmutatják, hogy adjunk meg számokat, vektorokat és változókat >> a = 2 //scalar
Enter leütése után ezt kell látnia: a= 2 >> x = [1;2;3] //Vector
Nyomj Entert, x= 1 2 3 >> A = [1 2 3;4 5 6;7 8 0] //Matrix
Nyomj entert, A= 123 456 780
Észrevehettük, hogy a mátrix sorai el vannak különítve pontosvesszőkkel , amíg az oszlopok „space” –szel vannak elválasztva. Hasznos parancs a „whos”, ami megmutatja az összes deklarált változó nevét és típusát: >> whos Name Size Bytes Class A 3x3 72 double array
a 1x1 8 double array x 3x1 24 double array Grand total is 13 elements using 104 bytes
Jegyezzük meg, hogy a szereplő 3 változó mindegyike egy-egy sorban van,az alakja a „sor”nak határozottan pontos típus. A skaláris ’a’ egy 1x1 –es sor, a vektor ’x’ egy 3x1 –es sor, és a mátrix ’A’ egy 3x3 –as sor(lásd „size” rész minden változónál). Egy mód megadni egy n dimenziós sort (n>2) , összefűzni kettő vagy több (n-1)-dimenziós sort használva a „cat” parancsot. Példának a következő parancs összefűz kettő 3x2 –es sort, hogy létrejöjjön egy 3x2x2 –es sor: >> C = cat(3,[1,2;3,4;5,6],[7,8;9,10;11,12]) C(:,:,1) = 12 34 56 C(:,:,2) = 78 9 10 11 12 >> whos Name Size Bytes Class A 3x3 72 double array C 3x2x2 96 double array a 1x1 8 double array x 3x1 24 double array Grand total is 25 elements using 200 bytes
Jegyezzük meg hogy a „3” as argumentum a „cat” parancs sorában, jelzi, hogy az összefűzés előfordul hosszában a harmadik dimenzió .((???)) Ha D és E k x m x n –es sorok,akkor a parancs: >> cat(4,D,E)
Akkor k x m x n x 2 –es sor fog létrejönni ( kipróbálható ). MATLAB megengedi a soroknak, hogy komplex elemei legyenek. A komplex elem kifejezni akármelyik beépített változót i vagy j: >> sqrt(-1) ans = 0 + 1.0000i
Ez a példa megmutatja, milyen komplex számokat tud meg jeleníteni a MATLAB –ban; ez azt is megmutatja, hogy a négyzetgyök egy beépített funkció. Az eredménye az utolsó számításnak nincs átadva a változónak, hogy automatikusan átadja az „ans” változót lehet használni, mint bármilyen más változót a későbbi számításokban. Íme egy példa : >> 100^2-4*2*3 //Press enter ans = 9976 >> sqrt(ans) //Press enter
ans = 99.8799 >> (-100+ans)/4 //Press enter ans = -0.0300
Az aritmetikai operátorok működnek ,ahogy reméltük skalárokkal. A beépített változó, ami gyakran hasznos „pi”: >> pi //Press enter ans = 3.1416
Néhány egyszerű hasznos funkció, mint sine , cosine , exponential és logarithm már előre el van készítve.Példa: >> cos(.5)^2+sin(.5)^2 //Press enter ans = 1 >> exp(1) //Press enter ans = 2.7183 >> log(ans) //Press enter ans = 1
Ha bármiféle kétségek akadnak a parancsokkal vagy függvényekkel kapcsolatban , egy kiterjedt online segítségnyújtó rendszer elérhető az alábbi paranccsal: help <parancs-neve>. Példa: >> help ans ANS The most recent answer. ANS is the variable created automatically when expressions are not assigned to anything else. ANSwer. >> help pi PI 3.1415926535897.... PI = 4*atan(1) = imag(log(-1)) = 3.1415926535897....
Érdemes a ”help help” parancssal kezdeni, ami megmutatja ,hogy hogy tud a help segíteni a rendszer működésén , ahogy a kapcsolódó parancsok is teszik. Ha önmagában beírjuk a help parancsot ,akkor ki fog írni egy listát azokból a címszavakból, amikben a help tud segíteni; a listában megtalálhatjuk az „elfun—elementary math functions” –t . Beírva a „help elfun” parancsot ki fogja listázni a matematikai függvényeket nekünk.
Aritmetikai műveletek mátrixokon. MATLAB tud egyszerű aritmetikai műveleteket végrehajtani mátrixokon vektorokon és skalárokon: összeadás, kivonás, szorzás. Továbbá a MATLAB definiálja a mátrixok osztását csakúgy, mint a vektoriális műveleteket. A vektoriális műveleteket(összeadás, kivonás, és skalárral való szorzás) akár n dimenziós sorszámmal bármilyen n értékkel kivéve a szorzás és az osztás, ami korlátozva van a mátrixokon és vektorokon (n=<2). Egyszerű műveletek. Hogyha A és B sorok, akkor MATLAB képes kiszámolni A+B és A-B –ket ,amikor ezek a műveletek definiálva vannak. Például:
>> A = [1 2 3;4 5 6;7 8 9]; >> B = [1 1 1;2 2 2;3 3 3]; >> C = [1 2;3 4;5 6]; >> whos Name Size Bytes Class A 3x3 72 double array B 3x3 72 double array C 3x2 48 double array Grand total is 24 elements using 192 bytes >> A+B ans = 234 678 10 11 12
De ,ha begépeljük : >> A+C ??? Error using ==> + because Matrix dimensions must agree. Mátrix szorzás is definiálva van, mint: >> A*C ans = 22 28 49 64 76 100 >> C*A ??? Error using ==> * because Matrix dimensions must agree.
Ha A egy négyzetes mátrix és m egy pozitív egész szám, akkor A^m a terméke m faktoriális A. Azonban nincs definiálva a szorzás több dimenziós sorok esetén: >> C = cat(3,[1 2;3 4],[5 6;7 8]) C(:,:,1) = 12 34 C(:,:,2) = 56 78 >> D = [1;2] D= 1 2 >> whos Name Size Bytes Class C 2x2x2 64 double array D 2x1 16 double array Grand total is 10 elements using 80 bytes >> C*D ??? Error using ==> * No functional support for matrix inputs.
Ugyanazzal a jellel , az exponenciális ^ jel csak 2 dimenziós mátrixokra van értelmezve.
Mátrix egyenletek megoldása „mátrix osztással”. Ha A egy négyzetes,vagy egység mátrix, akkor a megoldás Ax=b azaz beülteti ezt a műveletet a backslash operátorral:
. MATLAB
>> A = rand(3,3) A= 0.2190 0.6793 0.5194 0.0470 0.9347 0.8310 0.6789 0.3835 0.0346 >> b = rand(3,1) b= 0.0535 0.5297 0.6711 >> x = A\b x= -159.3380 314.8625 -344.5078
Megjegyzés: használata a rand függvénynek létrehoz egy egyenletesen feltöltött mátrixok 0,1 értékkel feltöltve (lásd „help rand” több információkét) Az A\b (matematikailag) egyenlő b baloldali szorzása -nel (azonban MATLAB nem számítja ki a mátrix inverzét,helyette megoldja az egyenletrendszert közvetlenül). Amikor nem négyzetes mátrixnál használjuk akkor a backslash operátor megoldja a legkisebb alkalmas négyzetes részt; lásd a „help slash”-t részletekért. Természetesen, más aritmetikai operátorokkal, a mátrixoknak kompatibilis méterűnek kell lenniük. Az osztás operátor nincs definiálva n dimenziós sorokra n>2 esetén.
„Vektorizált” függvények és operátorok. MATLAB –nak sokféle parancsa van, amivel különleges mátrixokat lehet csinálni; a következő parancssor vektort készít, aminek az összetevői aritmetikailag növekednek: >> t = 1:5 t= 12345
Az összetevők nem csak egységnyivel változhatnak: >> x = 0:.1:1 x= Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000 A „linspace” parancs-nak hasonló eredménye van. Ez létrehoz egy lineárisan elosztott vektort. Pl: linspace (a,b,n) létrehoz egy n hosszúságú a vektort
>> linspace(0,1,11) ans = Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000
Van egy hasonló parancs, a logspace ami egy logaritmikusan elosztott vektort hoz létre: >> logspace(0,1,11) ans = Columns 1 through 7 1.0000 1.2589 1.5849 1.9953 2.5119 3.1623 3.9811 Columns 8 through 11 5.0119 6.3096 7.9433 10.0000
Lásd „help logspace” részletekért A lineárisan elosztott vektor elemei figyelembe véve, mint egy egydimenziós cella, ami hasznos grafikai függvényekkel. Egy y=F(x) grafikon készítéséhez és sorszeletekkel való összekapcsolásához készít egy cellát az y és x vektorban, ami hasonló függvényértékekkel rendelkezik. Nagyon egyszerű létrehozni a szükséges vektorokat, hogy ábrázoljunk egy beépített függvényt, mivel MATLAB függvények vektorizáltak. Ez azt jelenti, hogy a beépített függvények olyanok, mint a „sine” ami hozzá van rendelve egy sorhoz,az eredménye új sor, ugyanazzal a mérettel, aminek a bejegyzései a függvény sorának eredeti bejegyzéseivel.(lásd Ábra 1): >> x = (0:.1:2*pi); >> y = sin(x); >> plot(x,y)
Ábra 1: Graph of y = sin(x)
MATLAB rendelkezik vektorizált aritmetikai operátorokkal, amik ugyanazok , mint az eredeti operátorok, „.”-al megelőzhető . mint pl . >> x = (-5:.1:5); >> y = x./(1+x.^2); >> plot(x,y)
Ábra 2 : Az egyezik minden x komponens és x./z oszt minden x komponenst, megegyezik z komponenssel. Összeadást és kivonást hajt végre a definíció szerint tehát nincs „.+” vagy „.-„ operátor. Megjegyzés : a különbség A^2 és A .^2. Az első van egyedül definiálva hogyha A egy négyzetes mátrix, amíg a második egy bármilyen n dimenziós sorhoz van definiálva.
Különbféle parancsok. Egy fontos operátor MATLAB-ban az egyszerű „ ’ ” jel, ami a konjukció műveletet jelenti: >> A = [1 2;3 4] A= 12 34 >> A' ans = 13 24 >> B = A + i*.5*A B= 1.0000 + 0.5000i 2.0000 + 1.0000i
3.0000 + 1.5000i 4.0000 + 2.0000i >> B' ans = 1.0000 - 0.5000i 3.0000 - 1.5000i 2.0000 - 1.0000i 4.0000 - 2.0000i
(megjegyzés ’ és .’ jelek egyenértékűek mátrixokon valós értékek esetén). A következő parancsok gyakran hasznosak. Több információt tudhatunk meg az on-line help rendszerből.
Mátrixok létrehozása • • • •
zeros(m,n) létrehoz egy m xn -es mátrixok csupa nulla értékekkel; ones (m,n) létrehoz egy m x n -es mátrixok csupa egy értékekkel; eye (n) létrehoz egy n x n –es azonosság mátrixok diag (v) (v egy n-vektor) létrehoz egy n x n –es diagonális mátrixot v érték van az átlón
Például: >> ones(3,4) ans = 1111 1111 1111 >> v=[-1 2 3.5] v= -1.0000 2.0000 3.5000 >> diag (v) ans = -1.0000 0 0 0 2.0000 0 0 0 3.5000
A zeros és a ones parancsnak megadhatunk egy egész típusú argumentumot; k argumentum esetén k dimenziós sort.
Képernyő és grafika formázása A következő parancsok különböző kinézeteket kínálnak a különböző kimeneteken. format : Kimenet beállítása >> format short, pi ans = 3.1416 >> format short e, pi ans = 3.1416e+000 >> format long, pi ans = 3.14159265358979 >> format long e, pi
ans = 3.141592653589793e+000
format compact összesűríti az extra sorokat (minden kimenet ezen a papíron kompakt formában lesz). format loose az extra sorokat. visszahelyezi >> format loose, pi ans = 3.1416 • xlabel('string'), ylabel('string') tengelyeket az aktuális ábrán;
egyenként felcímkézi a függőleges és vízszintes
• title('string') címet ad az ábrának; • axis([a b c d]) megváltoztatja az alakját a jelenlegi ábrának dycbxa -ra≤≤≤≤,; • grid négyzetrácsot rak a jelenlegi ábrára; • hold on megállítja a jelenlegi ábrát, így a későbbi ábrákkal együtt meg tud jelenni; • hold off elengedni a jelenlegi ábrát, így a következő törölni fogja majd azt; • subplot több ábrát rak a grafikus ablakba. Például: >> xlabel('x-axis'); >> ylabel('y-axis'); >> title('example');
>> axis([-1 1 -1 1]);
>> grid on
Az y=exp(-x^2) függyvény lesz kirajzolva nevével a tengelyen négyzetráccsal >> u=x.^2; >> y= exp(-u); >> plot (x,y);
Most a subplot funkciót fogjuk használni ,hogy megjelenjenhessenek a különbféle funkciók egyszerre >> subplot(2,1,1); >> fplot('sin(x)',[0 2*pi]) >> subplot(2,1,2);
>> fplot('cos(x)',[0 2*pi])
Vegyes • • • • • • • •
max(x) visszatér x legnagyobb bejegyzésével, ha x egy vektor;nézd a help max -ot ha x egy k dimenziós sor min(x) ugyanugy mint a max; abs(x) akkora sorral tér vissza amekkora az x aminek a bejegyzései x bejegyzéseinek nagyságának felel meg size(A) visszatér egy 1xk vektorral a k dimenziós sor sorainak számával, oszlopainak számával, stb. length(x) visszatér a sor hosszával save fname elmenti a jelenlegi változókat fname.mat fájlnévvel load fname betölti a változókat egy fname.mat fájlból quit kilép a MATLAB –ból
Például: >> x=[ 3 -4 60 -71 -13 12];
>> max(x) ans = 60 >> min(x) ans = -71 >> abs(x) ans = 3 4 60 71 13 12
Egy példa: Numerikus integrálás. A numerikus integrálás a megközelítő számítása az integrál számításnak, numerikus módon. Módszerek széles választéka áll rendelkezésünkre numerikus integráláshoz. A példában hármat fogunk használni: téglalap szabály, a trapéz szabály és a Simpson szabály, ezek fogják meghatározni a közelítő integrált:
1.- téglalap szabály. Az első nagyon egyszerű, a terv hogy megközelítsük f(x) függvényt minden intervallumon egy konstanssal és tekintetbe véve a területet a négyzet szélessége h = xi+1 – xi és magassága f(xi) ith intervallumra. Ez a mód kiszámolni a területek összegeit minden téglalapnak az intervallumban. Az intervallum szét lesz osztva 2,4,8,16,32,64 és 128 al-intervallumokra. Az első példa két al-intervallummal: Három pont az intervallumban (0,1) szükséges. >> X=linspace(0,1,3) X= 0 0.5000 1.0000
A
függvény értékei Y változóba vannak elmentve
>> Y=sqrt(1-X) Y= 1.0000 0.7071 0
Az első téglalap magassága f(0) tehát y vektor első pontja el van mentve >> q=Y(1) q= 1
A második téglalap magassága f(1) tehát y vektor második pontja is el van mentve >> q=q+Y(2) q= 1.7071
A téglalapok szélessége 0.5 tehát ezt összeszorozva a magasságok értékével kialakul a terület. >> q=q*1/2 q=
0.8536
Hogy kiterjesszük az al-intervallumot, ciklust kell alkalmaznunk a vektor irányításához, 129 pontra van szükség, hogy 128 részre bontsuk az intervallumot. >> X=linspace(0,1,129);
A
függvény értékei ismét Y változóba vannak elmentve
>> Y=sqrt(1-X); >> q=Y(1);
In this case, the sum is from f(0) to f(127), that is from the first component Y(1) to the next to last Y(128). Ebben az esetben az összeg f(0) tól f(127)ig van, első komponenstől y(1) az utolsóig y(127) . >> for j=1:127 q=q+Y(j+1); end >> q=q*1/128;
A következő program integrált fog számítani 2 ,4 ,8 ,16 ,32 ,64 ,128 al intervallumok segítségével: function rectangleRule=rectangleRule(Y) q=zeros(7,1); N=2; %Number of subintervals for i=1:7 h=1/N; q(i)=Y(1); for j=1:N-1 q(i)=q(i)+Y(j*(256/N)+1); end q(i)=q(i)*h; N=N*2; end disp('Approximations with the rectangle rule:') q
A bemenete a függvénynek egy 256 elemű vektor a függvénnyel ami [0,1] intervallummal integrál >> X=linspace(0,1,257); >> Y=sqrt(1-X); >> rectangleRule(Y)
Approximations with the rectangle rule: q= 0.85355339059327 0.76828304624275 0.72063022162445 0.69483119687723 0.68118393627894 0.67408331137851 0.67043190729683
2. – Trapéz szabály. Ebben a példában az utolsó programot módosítottuk, hogy megközelítse az integrált trapéz szabállyal: function trapezoidalRule=trapezoidalRule(Y) q=zeros(7,1); N=2; %Number of subintervals for i=1:7 h=1/N; q(i)=0.5*Y(1); q(i)=q(i)+0.5*Y(257); for j=1:N-1 q(i)=q(i)+Y(j*(256/N)+1); end q(i)=q(i)*h; N=N*2; end disp('Approximations with the trapezoidal rule:') q
Ennek a függvénynek a bemenete egy 256 elemű vektor a függvénnyel, ami [0,1] intervallummal integrál >> X=linspace(0,1,257); >> Y=sqrt(1-X); >> trapezoidalRule(Y) Approximations with the rectangle rule: q= 0.60355339059327 0.64328304624275 0.65813022162445 0.66358119687723 0.66555893627894 0.66627081137851 0.66652565729683
3. – Simpson szabály Végül a Simpson szabály lesz alkalmazva, a program módosítva lett: function simpsonRule=simpsonRule(Y) q=zeros(7,1);
N=2; %Number of subintervals for i=1:7 h=1/N; q(i)=Y(1); q(i)=q(i)+Y(257); k=0; for j=1:N-1 k=k+1; q(i)=q(i)+4*Y(k/2*(256/N)+1); k=k+1; q(i)=q(i)+2*Y(k/2*(256/N)+1); end k=k+1; q(i)=q(i)+4*Y(k/2*(256/N)+1); %Last interval middle point. q(i)=q(i)*h/6; N=N*2; end disp('Approximations with Simpson rule:') q
Ennek a függvénynek a bemenete egy 256 elemű vektor a függvénnyel, ami [0,1] intervallummal integrál >> X=linspace(0,1,257); >> Y=sqrt(1-X); >> simpsonRule(Y) Approximations with Simpson rule: q= 0.65652626479257 0.66307928008502 0.66539818862815 0.66621818274618 0.66650810307836 0.66661060593627 0.66664684620310
Az eredményei a három féle módszernek: