• Nem Talált Eredményt

A Matlab alapjai

2. Matematikai számítások Matlabbal 1. Alapvet˝ o információk a Matlabról

2.1.3. A Matlab elemei Jelkészlet

A Matlab-ban a következ˝o írásjeleket használhatjuk:

1. Az angol abc kis és nagybet˝ui, melyek között a Matlab különbséget tesz;

2. Számjegyek;

3. Space;

4. Speciális jelek: _ . , : ; < > / \* ^ ˜ = ( ) [ ] { } ’ ! @ & |% melyek közül a % jel után kommentárt írhatunk.

A (;) pontosvessz˝o parancszáró írásjel, ha a parancs után kitesszük, akkor a parancs eredménye nem kerül a képerny˝ore; egyébként pedig az eredmény, amely automatikusan azans(answer) változóba kerül, rögtön ki is jelz˝odik.

Numerikus adatok tárolása

A numerikus adatok tárolása automatikusan az ún. double lebeg˝opontos típusban (lásd IEEE754 szabvány) történik, de a Matlab további típusokat is használ:

1. El˝ojeles egészek: int8, int16, int32, int64;

2. El˝ojel nélküli egészek: uint8, uint16, uint32, uint64;

3. Egyszeres pontosságú lebeg˝opontos: single.

Ha egy értéket nem a double típusban akarunk tároltatni, akkor konvertáltatni kell:

>> z = int16(2013); uint32max = uint32(4294967295);

Az egyes tárolási típusok határait a 2.1. táblázat értékei tartalmazzák.

2.1. táblázat. Numerikus típusok tárolási határai

típus intmin(’típus’) intmax(’típus’) bájt

int8 -128 127 1

uint8 0 255 1

int16 -32768 32767 2

uint16 0 65535 2

int32 -2147483648 2147483647 4

uint32 0 4294967295 4

int64 -9223372036854775808 9223372036854775807 8

uint64 0 18446744073709551615 8

realmin(’típus’) realmax(’típus’)

single 1.175494e-038 3.402823e+038 4

double 2.2250738585072e-308 1.79769313486232e+308 8

Ha egy típusban a kiértékelés közben túl- vagy alulcsordulás történik, akkor vagy valótlan érték képz˝odik (az ebben a típusban tárolható értékek határa), vagy egy speciális jelentés˝u kód, az Inf. (A példákban – itt és a kés˝obbiekben is – többször is helytakarékos módon (üres sorokat elhagyva, sorokat összevonva) közöljük a rendszer válaszait.)

>> x=int16(30000), y=x+x, z=1e160, w=z*z, s=uint8(6), w=uint8(8), s-w x = 30000

y = 32767

z = 1.0000e+160 w = Inf

s = 6 w = 8 ans = 0

Avégtelenspeciális érték (Infinity) mellett a Matlab anem szám(Not a Number) fogalmat is használja, például ez jön létre a 0 és a végtelen szorzataként.

>> Inf*0 ans =

NaN

Megjegyzések:

1. Az egész típusok számjelz˝oje a tároláshoz használt bitek számát jelenti, például az int32 típusú adat 32 biten tárolódik, és a vezet˝o bit az el˝ojelbit.

2. Az int64 és uint64 típusok adminisztrációs célokat szolgálnak, az ilyen típusú adatokkal matematikai m˝uvelet nem végezhet˝o!

Szöveges adatok tárolása

Egy szöveg az írásjeleinek ASCII kódjaival sorvektorban tárolódik:

>> szoveg = 'Matlab', int8(szoveg) szoveg = Matlab

ans =

77 97 116 108 97 98

Láthatjuk, hogy az int8(szoveg) kifejezés eredménye az ans mátrixváltozóba került, és sorvektorként ki is íródott. Mivel egy szöveg az írásjelkódok sorvektoraként tárolódik, vele aritmetikai és mátrixm˝uvelet is elvégezhet˝o.

Hasonló, viszont double tárolású sorvektor az eredményünk, ha a double(’Matlab’) függvényhívást adjuk ki:

>> double('Matlab') ans =

77 97 116 108 97 98

Azt, hogy egy szöveg valójában írásjelenkénti kódokkal tárolódik, egyszer˝uen ellen˝orizhetjük:

>> szoveg + 1 % a sorvektor minden elemét 1-gyel növeljük

ans =

78 98 117 109 98 99

Szöveges adatot többféle célra használ a Matlab. Az egyik és nyilvánvaló célja a kiírandó szöveg el˝oállítása, tárolása, kiírása. A másik cél a begépelt képletek szövegszer˝u letárolása, majd elemzése, illetve végrehajtása.

A szövegként tárolt képlet azeval() függvény segítségével értékelhet˝o ki, illetve hajtatható végre. A következ˝o példánk mindezt tömören illusztrálja.

>> x=45; z='sin(x*pi/180)';

s=sprintf('sin(%d fok) = %g', x, eval(z));

text(0.2,0.5,s)

Az els˝o sorban a z változóban elhelyeztük szövegesen a kiértékelend˝o kifejezést, a második sorban az eval() függvényhívás el˝oállítja a kiszámított értéket, majd az sprintf() függvény a C nyelv szabályainak megfelel˝o kiíratható karakterláncot rendel az s változóhoz. Ezt a szöveget pedig a text() függvény egy grafikus ablakban pozícionáltan írja ki. Ezekr˝ol a függvényekr˝ol kés˝obb még lesz szó.

2.8. ábra: Karakterlánc kiírása

Komplex számok

A Matlab a komplex számokat is kezelni tudja, ha azt normál alakban adták meg: 4 + 3i. Az i szimbólum mellett a j szimbólum is (ezt a villamosmérnökök szeretik) az imaginárius egységet jelöli.

>> z=4+3i, abs(z), z*z' z = 4.0000 + 3.0000i ans = 5

ans = 25

Az els˝o sorban egy (,) vessz˝o jelekkel elválasztott kifejezéslistát közöltünk, melynek elemeit a Matlab egymás után kiértékelte. Az els˝o értékadó kifejezés azváltozóhoz rendelt egy komplex értéket, az abs(z) függvényhívás el˝oállította a komplex szám abszolút értékét, és a harmadik m˝uvelet pedig ennek a négyzetét. Itt találkoztunk el˝oször a változó mögé írt nagyon fontos (’) aposztróf m˝uveleti jellel, mely m˝uvelet egy mátrix konjugált transzponáltját állítja el˝o. Itt viszont az 1x1 méret˝u mátrix (skalár) esetében persze ez csak a konjugálást jelenti.

Az i szimbólum nem keveredik össze az i változóval, a használat módja dönti el az értelmezést. Ha az i azonosítót még nem használtuk változó tárolására, akkor a következ˝o írásmódok használhatók:

>> z = 4 + 3i, w = 4 + 3*i % mögé írva és szorzásjellel is jó z = 4.0000 + 3.0000i

w = 4.0000 + 3.0000i

Ha viszont az i már értéket kapott, akkor a szorzásjel már a változóra vonatkozik.

>> i=10, z = 4 + 3i, w = 4 + 3*i i = 10

z = 4.0000 + 3.0000i w = 34

Az exponenciális függvény segítségével exponenciális alakban is megadhatjuk a komplex számot, amit a Matlab normál alakra hoz, és ezzel az alakkal számol tovább. Az átalakítás szabálya:

R*exp(i*ϕ) = R*cos(ϕ) + i*(R*sin(ϕ))

ahol R a komplex szám abszolút értéke ésϕa radiánban mért szöge.

Az exponenciális alakot az argumentumbeli i-vel szorzás miatt csak akkor használhatjuk, ha i-nek nincs változó szerepe. Éppen ezért nem célszer˝u az i szimbólum változókénti használata. Ha mégis használjuk, akkor a komplex használat el˝ott mentjük az értéket, majd felszabadítjuk az i változót, és a komplex használat után visszatöltjük.

>> i_save = i, clear i; z=2*exp(i*pi/4), i=i_save, w=2*exp(i*pi/4) i_save = 10

z = 1.4142 + 1.4142i i = 10

w = 5.1519e+003

Aclearparanccsal a munkaterületi változóinkat egyesével, csoportosan, vagy mindet törölhetjük:

clear i, % csak az i változót törli

clear z*, % csak a z-vel kezdödö azonosítójú változókat törli clear % az összes munkaterületi változót törli

Természetesen a Workspace ablakbeli kiválasztott változókat az ablakbeli delete m˝uvelettel is törölhetjük.

(Próbáljuk meg a clear = pi; értékadás után a clear változót másképp törölni!)

A komplex számokkal való munkát további függvények is támogatják. Ilyenek például azexp(),isreal(),real(), imag(),conj(),angle().

>> fi=60, r=10, z=r*exp(i*fi*pi/180), valos_e=isreal(z), a=real(z), b=imag(z), z_konjug=conj(z), abs_z=abs(z) alfa_rad=angle(z), alfa_fok=alfa_rad/pi*180

fi = 60 r = 10

z = 5.0000 + 8.6603i valos_e = 0

a = 5.0000 b = 8.6603

z_konjug = 5.0000 - 8.6603i abs_z = 10

alfa_rad = 1.0472 alfa_fok = 60

Logikai értékek

A logikaiigazéshamisértékek tárolására a szokásos 1 és 0 numerikus értékeket használja a Matlab.

>> 'Matlab' == 'Matek ' % karakterkódok páronkénti hasonlítása ans =

1 1 1 0 0 0

Itt a == hasonlítási m˝uveleti jellel két azonos méret˝u sorvektort karakterenként hasonlítottunk össze, az eredmény egy ugyanilyen méret˝u sorvektorba került. Az 1 és 0 logikai ill. numerikus értékek a true ésfalse alapszavakkal is megadhatók és hivatkozhatók:

>> x=true, 3+x x = 1

ans = 4

Szövegek azonosságát viszont egyetlen válaszként azstrcmp() függvénnyel kaphatjuk meg:

>> strcmp('Matlab','Matek') ans = 0

Numerikus értékek, s˝ot mátrixok is kiértékelhet˝ok logikailag. Skalár esetében minden nem 0 érték igaznak számít, és csak a 0 számít hamisnak.