Matlab képernyője Az egyes részablakok áthelyezhetőek. Fő tudnivalók róluk, fontossági sorrendben: Command window: ide írhatunk parancsokat, ide is írja ki az eredményt. Olyan, mint bárhol máshol egy command window. Lehet ide egész programokat begépelni (nem éri meg ), vagy számológépként használni. Innen indítjuk el a megírt programjainkat. Hibakeresésnél is nagyon hasznos tud lenni. Workspace: ha vannak változóink, akkor itt kilistázza őket és a legfontosabb jellemzőiket (állítható, hogy mit szeretnénk látni, pl típusa, értéke, stb.). Kettőt rákattintva a változóra megnyílik egy ablak ami a változóban lévő adatokat tartalmazza. Editor: ha már tudunk írni programot, akkor ide írjuk be és mentjük el. Futtatni vagy gyorsgombbal (Editor -> Run) vagy a command window-ból lehet (vagy egy másik programból ). Current folder: amikor futtatunk egy programot fontos, hogy abban a mappában legyünk ahol a futtatni kívánt program is van. Olyan, mint egy windows intéző. Command History: a command windowba előzőleg beírt parancsokat jegyzi meg. A matlab bezárása és újranyitása után is megőrzi ezeket. Hasznos, mert lehet innen puskázni. Details (még nem fontos): egy programra rákattintva a Current folder ablakban kiírja ide annak részeit (később: milyen függvényeket tartalmaz, és azokat hogyan kell meghívni) Legeslegfontosabb: jobb felső sarok, search documentation vagy Help. A MATLABnak nagyon jó help-je van!!! Online Help is van, szintén nagyon hasznos. 1
Programozás alapjai A programozás egy eszköz, amivel problémákat tudunk megoldani. Ehhez a problémát értelmezni kell, és úgy megfogalmazni, hogy az a programozás eszközével megoldható legyen. Ehhez tudni kell: - Mi legyen a program bemenete, kimenete és a köztük lévő kapcsolat specifikáció: A leendő program által elvégzendő feladat (mit csináljon a program?) - Megoldás leírása lépésről-lépésre algoritmus: A program által végrehajtandó lépések leírása (hogyan csinálja a program?) Példa 1.1: Számítsuk ki n faktoriálist. Specifikáció: program bemenete: n program kimenete: n! köztük lévő kapcsolat: kimenet = n*(n-1)*.*1 Algoritmus:?? Mit is csináljon a program? 4 Faktoriális 24 1. Kérjen be egy számot, és jegyezze meg ezt a számot n-nek. 2. Jegyezzen meg egy eredményt, ez legyen 1. 3. Egészen addig szorozza be az eredményt n-el, és közben n értékét írja felül n-1-el, amíg n értéke 1 nem lesz. 4. Ekkor az eredmény értéke a tényleges eredmény lesz. Ezt írja ki. 3. Mi ez az addig...amíg? Mit csinál itt a program? 3.0 Ellenőrzi az amíg feltétel teljesülését: n értéke 1? Ha igen, akkor lép a 4. Pontra. Ha nem, akkor végrehajtja a műveletet: 3.1 eredmény értéke legyen eredmény szorozva n-el 3.2 n értéke legyen 1-el kevesebb 3.3 visszamegy 3.0 pontra A programozás lényege a megoldandó problémához megfogalmazni a specifikációt és kitalálni az algoritmust amivel meg lehet oldani. Az algoritmusírásra nincsenek általános szabályok. Egy-két alapvető problémára létezik ismert algoritmus, de alapvetően ezt kell kitalálni az adott feladathoz. A program írása az algoritmus kitalálása után már csak az algoritmus gépi nyelvre fordítása. Új fogalmak: Változók: megjegyzett dolgok Műveletek: szorzás, kivonás Sorrend: a lépések egymás utánisága, beleértve az ellenőrzést, visszamenést is. Ez egyértelműen meghatározza a programnak, hogy mikor mit kell csinálnia. Hogyan írjuk meg a példát matlab kódban? A Current folder -ben hozzunk létre egy könyvtárat és a könyvtárban egy script -et. Ennek.m kiterjesztése lesz, és ha megnyitjátok, az editorban megnyílik egy üres lap (ha eddig nem volt nyitva az editor, akkor megnyílik automatikusan). Ide lehet beírni a programot. 2
1. Kérjen be a felhasználótól egy számot, és jegyezze meg ezt a számot n-nek. A programunknak van egy bemenete (n) és lesz a végén egy kimenete (eredmeny). Ezt a programnak tudnia kell a legelején: function eredmeny = faktorialis(n) function: így adunk meg egy olyan programot, amit elnevezünk, és később futtatunk adott bemenetre. Létezik a matlabban function és script: A scriptnek nincs bemenete és nincs kimenete, egyszerűen végrehajtja a leírt műveleteket. A function-nak van bemenete és/vagy kimenete. Akkor írunk ilyet, ha egy másik programból meg szeretnénk hívni, például ha egy műveletet sokszor kell elvégezni egy programban, akkor beírjuk egy függvényben és azt hívjuk meg többször. Így áttekinthető lesz a programunk. Pl a sin(x) is egy (beépített) function eredmeny: a program kimenete (lehet több is, nem valószínű hogy most találkozni fogtok ilyennel) faktorialis: a program neve. Ezen a néven futtatjuk majd. Célszerű (eleinte kötelező!) ugyanúgy hívni a programot, mint az.m filet, amiben elmentjük. (n): a program bemenete. Lehet neki több bemenete is, ez esetben a zárójelben vesszővel kell elválasztani ezeket, pl (n, róka, béka, kiskutya). A kimenetnek olyan nevének kell lennie, amilyen változónk ténylegesen lesz is a programban, egyéb esetben nem tudja a program, hogy mit adjon vissza. A bemeneten megadott változónevekbe írja bele a bemenetet, olyan sorrendben ahogy szerepel. A programunk innentől azzal a névvel fogja használni a megadott változót. (lokális változó) Most az egyszerűség kedvéért feltételezzük, hogy a felhasználó pozitív egész számot írt be. Ha nem, akkor a programunk hibakezelés nélkül el fog szállni és végtelenségig futni. (Fontos: ha egy programunk elszáll, megállítani ctrl+c billentyűkombinációval lehet. Van az az eset, amikor az egész matlabot újra kell indítani ) 2. Jegyezzen meg egy eredményt, ez legyen 1. eredmeny = 1; Itt az eredmeny változó értékébe beírja az 1-et. Mindig először a jobb oldalt értékeli ki és a kapott értéket beírja a bal oldali változóba. Figyelem! Ha van már eredmeny nevű változónk, akkor lelkiismeret-furdalás nélkül törli ami addig benne volt, és beleírja az 1-et!! A pontosvessző pusztán azért kell, mert ha nem tesszük ki, akkor a művelet eredményét (ami jelenleg az, hogy eredmeny=1) kiírja a command window-ba. Semmi más hatása nincs. Próbáljátok ki! Programozás során célszerű nem kiíratni minden változót, mert lelassíthatja a programot. Viszont pl hibakeresésnél nagyon hasznos lehet. Változók: Olyan dolgok, amiben az adatokat tároljuk. 3
Eltérő típusa lehet: int (egész szám); double (valós szám); string (szöveg); logikai. A matlabban lehetnek speciálisan mátrixok, cellatömbök (olyan mátrix, aminek elemei nem csak számok, hanem bármilyen típusúak lehetnek még cellatömbök is ), anonymus függvények (egy tényleges matematikai függvény, pl parabola = @(x) 1*x.^2 + 2*x + 3;). Általában a változó típusát a változó használata előtt meg kell adni, viszont a matlab egy olyan környezet, ahol ezt nem kell (nem is lehet), sőt, ha egy változónak string értéke van, attól még int értéket is adhatok neki a következő sorban (ez esetben int típusú lesz). A meglévő változóink aktuális típusát a Workspace-ben láthatjuk. 3. Egészen addig szorozza be az eredményt n-el, és közben n értékét írja felül n-1-el, amíg n értéke 1 nem lesz. 3.0 Ellenőrzi az amíg feltétel teljesülését: n értéke 1? Ha igen, akkor lép a 4. Pontra. Ha nem, akkor végrehajtja a műveletet: while n~=1 A while egy ciklus. Mellette egy u.n. logikai változó van. Valójában egy művelet, aminek az eredménye egy logikai igaz vagy hamis. Ha igaz, akkor a következő sorra lép. Ha hamis, akkor az end utasítás után folytatja a programot. A feltételvizsgálatok műveleteinek listáját ld. az összefoglalásnál a táblázatban. Ez konkrétan azt jelenti, hogy nem egyenlő. 3.1 eredmény értéke legyen eredmény szorozva n-el eredmeny = eredmeny * n; Ilyet már láttunk: értékadás, ugyan olyan, mint a 2. lépésnél volt. Először kiszámolja eredmeny * n, majd beírja a kapott értéket az eredmeny változóba 3.2 n értéke legyen 1-el kevesebb n = n-1; Szintén egy értékadás. 3.3 visszamegy 3.0 pontra end A ciklus végéhez érve visszamegy az elejére (a while-hoz), és újra ellenőrzi az ottani feltételt. 4. Ekkor az eredmény értéke a tényleges eredmény lesz. Ezt írja ki. Maga a függvény (program) adja vissza meghívásakor. Ez azt jelenti, hogy ha a függvényt úgy hívjuk meg pl a parancssorból, hogy: a = faktorialis(4), akkor az a változó értéke a függvény által visszaadott érték lesz (azaz 4! = 24). Ha csak számológépet szeretnénk a matlabból, akkor azt írjuk be, hogy: faktorialis(4), ekkor az output ans = 24 lesz. Ez az ans egy változó, mert a levegőben nem lóghat az eredmény, de ezt a változót nem szokás használni változóként, mert bonyodalmakat okozhat. Tehát a programozásban egymás utáni műveleteket tudunk beírni, tudunk bele elágazásokat tenni (valamilyen feltételhez kötött művelet), és ciklusokat (ismétlődő művelet) tenni. Elágazások és ciklusok gyűjteménye a másik lapon, illetve röviden az összefoglalásban. Ciklusokról röviden: másik lap (Kódok.pdf)! Összegzés + amit itt még fontos megjegyezni: - Kommentelni fontos, úgy kell, hogy egy % jelet írunk a komment elé. - ;-t írva a sor végére nem írja ki a command windowba a sor eredményét. Egyébként kiírja. Ez lassítja a programot, szokjatok rá, hogy általában írunk ;-t. - Amit a matlab narancssárgával aláhúz, azt érdemes elolvasni, de nem feltétlenül hiba. (warning) 4
- Amit viszont pirossal húz alá, az szintaktikai hiba. (error) Amíg az ott van, a programot nem lehet futtatni. - Scriptnek hívják azt, aminek nincs bemenete-kimenete - Function-nak hívják azt, aminek van bemenete és/vagy kimenete - Nagyon sok beépített függvény van a matlabban, nagyon jó dokumentációval. - If használata: if feltétel1 Művelet ha feltétel1 igaz elseif feltétel2 Művelet ha feltétel1 hamis, de feltétel2 igaz else Művelet, ha feltétel1 és feltétel2 hamis end End után megy tovább egyenesen a programban. Tetszőleges számú elseif követheti egymást, vagy akár egy sem kell. - For használata: for ciklusváltozó = mettől:meddig Művelet end End-hez érve visszamegy újra a feltételhez, ciklusváltozó értékét növeli, amíg az a meddig-et el nem éri. - While használata while feltétel Művelet ha igaz end End-hez érve visszamegy újra a feltételhez - Logikai vizsgálatok: < kisebb > nagyobb == egyenlő (= már foglalt!) <= kisebb egyenlő >= nagyobb egyenlő ~ tagadás ~= nem egyenlő && ÉS VAGY - A feltétel nem csak egy egyszerű kifejezés lehet, mint pl a<=b, hanem pl egy összetettebb logikai művelet is: a<=b && d<a (a kisebb egyenlő b ÉS d kisebb a) - Vannak olyan műveletek, amiknek végtelen a végeredménye: 1/0 = inf - Vagy olyanok, amiknek nem szám: inf/inf = NaN - Adott változó törlése: clear változónév - Minden változó törlése: clear all - Command window tartalmának törlése: clc 5
Ezt úgy általánosságban minden programnyelv tudja, esetleg máshogy kell neki megmondani. Amiért a matlabot szeretjük, az azért van, mert könnyen tudunk vektorokkal és mátrixokkal számolni. (meg mert nagyon sok jól dokumentált beépített függvénye van, amit nem kell nekünk megírni) Vektorok/mátrixok Vektorok/mátrixok megadása: Sorvektor: sorvektor1 = [11 12 13]; Oszlopvektor: oszlopvektor1 = [21; 22; 23]; Mátrix: matrix1 = [1 2 3 4; 5 6 7 8; 9 10 11 12]; [] közé tesszük a tartalmat, és szóközt (vagy vesszőt) írunk a sor elemei közé, pontosvesszőt pedig a sorok közé. Műveletek: Transzponálás: oszlopvektor3 = sorvektor1'; matrix2 = matrix1'; Konstanssal szorzás: matrix3 = matrix1 * 2; Konstans hozzáadása minden elemhez: matrix4 = matrix1 + 3; Mátrixműveleteknél figyelni kell a szükséges (matekon is tanult) dimenzióegyezésre. A vektor egy olyan mátrix, aminek egyik dimenzióban 1 a mérete. Mátrixok összege: matrix5 = matrix3 + matrix1; Mátrixok szorzata: matrix6 = matrix1 * matrix2; Elemenkénti műveletek:.-ot kell tenni a műveleti jel elé, pl: Mátrixok elemenkénti szorzása: matrix8 = matrix3.*matrix1; Mátrix elemeinek négyzetre emelése: matrix9 = matrix1.^2; Fontos beépített függvények: Speciális mátrixok/vektorok létrehozása Sorvektor: x = linspace(min,max,elemek száma); egy számsor lesz a vektorban min értéktől max értékig, egyenletes lépésközzel. Az elemek száma az elemek száma lesz. Ez egyben a vektor hossza. Sorvektor máshogy: x = min:lépésköz:max; Ugyan azt adja, mint az előző, csak itt nem az elemek számát, hanem a lépésközt kell megadni. 0-kat tartalmazó adott méretű mátrix: y = zeros(2,3); 1-eseket tartalmazó adott méretű mátrix: z = ones(3,4); Mátrix mérete: [sorok, oszlopok] = size(matrix1); Mátrix minimum eleme: min(matrix1) Mátrix maximum eleme: max(matrix1) Mátrix elemeire való hivatkozás: matrix(hanyasdiksor, hanyadikoszlop) pl matrix(1,2) első sor 2. oszlop eleme Ha egy egész sort szeretnénk: sorvektor = matrix(1,:); Egész oszlop: oszlopvektor = matrix(:,1); Oszlop egy része: reszoszlopvektor = matrix(1:2,3); 6
! Összegzés + amit itt még fontos megjegyezni: - Mátrixot úgy adunk meg, hogy [] között felsoroljuk az elemeit Space vagy, megy a sor elmei közé ; megy a sorok közé - Mátrixot úgy is megadhatunk, hogy pl függvénnyel létrehozunk speciális mátrixot - Elemeire hivatkozni ()-el lehet az elem koordinátáival: matrix(hanyasdiksor, hanyadikoszlop) - Egész sor/oszlopra hivatkozni az oszlop/sor helyére írt :-al lehet. (Ennek egy részére: a : köré a kezdő és végértéket is beírhatjuk) - Sok hasznos beépített függvény van: size, min, max 7
Feladatok 1. Hozz létre egy 91 elemű vektort, amit for ciklussal tölts fel 1-10-ig egyenletesen növekvő számokkal (a vektor neve legyen x, és legyen sorvektor). Csináld meg a feladatot egy paranccsal is (linspace) 2. Számold ki egy y vektorba az x vektor elemeinek a négyzetét. a. Egy soros paranccsal b. Ciklussal Írd be a plot(x,y) parancsot. Nézd meg mi történik. 3. Hozz létre egy 10 sorból és 4 oszlopból álló mátrixot. Első két sora legyen: [1 2 3 4; 1 2 3 4]. A további sorai legyenek az előző két sor megfelelő oszlopában lévő két elem összege. Tipp: for vagy while ciklus ciklusváltozó=3-mal kezdve 4. Adott egy hat számot tartalmazó vektor. Írj programot, ami eldönti, hogy van e köztük páros szám. Ha nincs, akkor legyen a kimenete 0. Ha van, akkor a kimenete legyen az első páros szám sorszáma. 8