matlab alapismeretek - debreceni egyetem matematikai...
TRANSCRIPT
-
Matlab alapismeretek
Fazekas Borbála
Debreceni Egyetem
2019
December
1
-
Tartalomjegyzék
1 Vektorok 8
1.1 Vektorok létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.1.1 Vektorok létrehozása az elemek megadásával . . . . . . . . . . . . . . . . 8
1.1.2 Vektorok létrehozása már meglévő vektorokból . . . . . . . . . . . . . . . 8
1.2 Hivatkozás vektorok elemeire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 Vektorokra vonatkozó egyszerűbb függvények . . . . . . . . . . . . . . . . . . . 9
1.3.1 Manipulációs függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.2 Matematikai függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4 Műveletek vektorokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Mátrixok 11
2.1 Mátrixok létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 Mátrixok létrehozása az elemek megadásával . . . . . . . . . . . . . . . . 11
2.1.2 Mátrixok létrehozása már meglévő vektorokból és mátrixokból . . . . . . 11
2.1.3 Mátrixok létrehozása beéṕıtett függvényekkel . . . . . . . . . . . . . . . 12
2.2 Hivatkozás mátrixok elemeire, értékadás . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Mátrixokra vonatkozó egyszerűbb függvények . . . . . . . . . . . . . . . . . . . 14
2.3.1 Manipulációs függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.2 Matematikai függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Műveletek mátrixokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 Mindenféle 16
3.1 A find parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Naplófájl késźıtése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 A close parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2
-
3.4 A disp, az fprintf, az sprintf, az strcat és a num2str parancs . . . . . . . . . . . 18
4 Ábrák késźıtése 19
4.1 Kétdimenziós ábrák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.1.1 A plot alapparancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.1.2 Egyváltozós függvények ábrázolása a plot parancs seǵıtségével . . . . . . 20
4.1.3 A plot opciói . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.4 Az plot további opciói . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1.5 Több függvény egy ábrában . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1.6 Az ábrák további beálĺıtási lehetőségei . . . . . . . . . . . . . . . . . . . 26
4.1.7 Több al-ábra megjeleńıtése egyszerre - a subplot parancs . . . . . . . . . 27
4.1.8 Egyváltozós szimbolikus függvények ábrázolása az fplot parancs seǵıtségével 28
4.2 Háromdimenziós ábrák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.1 A surf alapparancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.2 Kétváltozós szimbolikus függvények ábrázolása az fsurf parancs seǵıtségével 32
4.3 Parametrizált görbék ábrázolása . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.3.1 Kétdimenziós parametrizált görbék . . . . . . . . . . . . . . . . . . . . . 34
4.3.2 Háromdimenziós parametrizált görbék . . . . . . . . . . . . . . . . . . . 36
4.4 Vektormezők ábrázolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.5 Kontúrvonalak ábrázolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5 A Matlab programozása 40
5.1 Ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.1.1 A for -ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.1.2 A while-ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.3 A break és az error parancs . . . . . . . . . . . . . . . . . . . . . . . . . 42
3
-
5.2 Elágazások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2.1 Az if -szerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2.2 A switch-szerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6 Függvényillesztés 45
6.1 Interpoláció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.1.1 Spline interpoláció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.2 Legkisebb négyezetes közeĺıtések . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.2.1 A polyfit parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.2.2 A fit parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7 Numerikus differenciálás 49
7.1 Numerikus differenciálás a diff paranccsal . . . . . . . . . . . . . . . . . . . . . 49
7.2 Numerikus gradiens a gradient paranccsal . . . . . . . . . . . . . . . . . . . . . 50
7.3 Polinomok numerikus deriváltja a polyder paranccsal . . . . . . . . . . . . . . . 52
8 Numerikus integralas 52
8.1 Numerikus integrálás a trapz paranccsal . . . . . . . . . . . . . . . . . . . . . . 52
8.2 Numerikus integrálás a cumtrapz paranccsal . . . . . . . . . . . . . . . . . . . . 54
8.3 Numerikus integrálás az integral paranccsal . . . . . . . . . . . . . . . . . . . . 55
8.4 Többváltozós függvények numerikus integrálása az integral2 és integral3 paran-
csokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8.5 Polinomok integrálása a polyint paranccsal . . . . . . . . . . . . . . . . . . . . . 56
9 A Matlab adatszerkezetei 56
9.1 Vektorok, mátrixok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9.2 Szöveges adatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
9.2.1 Karaktervektorok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4
-
9.2.2 Sztringtömbök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
9.3 Többdimenziós tömbök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
9.3.1 Hivatkozás többdimenziós tömbök elemeire, értékadás . . . . . . . . . . . 60
9.3.2 Többdimenziós tömbök létrehozása . . . . . . . . . . . . . . . . . . . . . 61
9.3.3 Többdimenziós tömbökre vonatkozó függvények . . . . . . . . . . . . . . 62
9.3.4 Műveletek többdimenziós tömbökkel . . . . . . . . . . . . . . . . . . . . 63
9.4 Cellatömbök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
9.4.1 Cellatömbök létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.4.2 Cellatömbök elemeire való hivatkozás, értékadás elemeknek . . . . . . . . 64
9.4.3 Cellatömbökre vonatkozó függvények . . . . . . . . . . . . . . . . . . . . 65
9.5 Struktúrák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
9.5.1 Struktúrák létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
9.5.2 Struktúrák mezőire való hivatkozás, értékadás mezőknek . . . . . . . . . 65
9.5.3 Struktúrákra vonatkozó további függvények . . . . . . . . . . . . . . . . 67
9.6 Táblázatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.6.1 Táblázatok létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.6.2 Táblázatok elemeinek az elérése: . . . . . . . . . . . . . . . . . . . . . . . 68
9.6.3 Táblázat tulajdonságainek lekérdezése és beálĺıtása . . . . . . . . . . . . 69
9.6.4 Táblázat bőv́ıtése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
9.7 Objektumok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
10 Adatok be- és kivitele 72
10.1 Fájlok megnyitása és bezárása . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
10.1.1 Az fopen parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
10.1.2 Az fclose parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.2 Bináris fájlok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5
-
10.2.1 Az fwrite parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.2.2 Az fread parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
10.3 Formázott szöveges fájlok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
10.3.1 Az fprintf parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
10.3.2 Az fscanf parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
10.3.3 Az fgetl és fgets parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . 78
10.3.4 A textscan parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
10.4 További parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
10.5 Mátrixok, táblázatok beolvasása, kíıratása . . . . . . . . . . . . . . . . . . . . . 81
10.5.1 A readtable parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
10.5.2 A writetable parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
10.5.3 A readmatrix parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
10.5.4 A writematrix parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
10.6 Még további parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
11 Differenciálegyenletek megoldása 85
11.1 Differenciálegyenletek analitikus megoldása a dsolve parancs
seǵıtségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11.1.1 Elsőrendű egyenletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11.1.2 Kezdetiértékproblémák . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11.1.3 Magasabb rendű egyenletek . . . . . . . . . . . . . . . . . . . . . . . . . 86
11.1.4 Egyenletrendszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
11.2 Differenciálegyenletek numerikus megoldása . . . . . . . . . . . . . . . . . . . . 86
11.2.1 Elsőrendű egyenletek numerikus megoldása . . . . . . . . . . . . . . . . . 86
11.2.2 Egyenletrendszerek numerikus megoldása . . . . . . . . . . . . . . . . . . 88
11.2.3 Magasabb rendű egyenletek megoldása . . . . . . . . . . . . . . . . . . . 90
6
-
12 Lineáris egyenletrendszerek megoldása 91
12.1 Direkt módszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
12.1.1 Az mldivide, avagy a \ parancs . . . . . . . . . . . . . . . . . . . . . . . 92
12.1.2 Az lsqminnorm parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
12.1.3 A pinv parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
12.1.4 A linsolve parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
12.1.5 Megoldások mátrixfelbontások seǵıtségével . . . . . . . . . . . . . . . . . 94
12.2 Iterat́ıv módszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
13 A szimbolikus számolás alapjai 97
13.1 Szimbolikus számok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
13.2 Szimbolikus változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
13.3 Szimbolikus kifejezések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
13.4 Szimbolikus függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
13.5 Szimbolikus számolások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
13.5.1 Differenciálás és integrálás . . . . . . . . . . . . . . . . . . . . . . . . . . 99
13.5.2 Egyenletmegoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
13.5.3 Differenciálegyenletek megoldása . . . . . . . . . . . . . . . . . . . . . . 100
13.5.4 Ábrázolás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7
-
1 Vektorok
1.1 Vektorok létrehozása
1.1.1 Vektorok létrehozása az elemek megadásával
• sorvektor: v = [1 2 3]; vagy v = [1, 2, 3]; → v = (1, 2, 3)
• oszlopvektor: v = [1; 2; 3]; → v =
1
2
3
• v = linspace(3, 200) → v = (3, 5, 7, . . . , 199, 201) - létrehoz egy 100 elemű vektort, melybenaz egymást követő elemek egyforma távolságra vannak egymástól, első eleme 3, utolsó 201
• v = linspace(1, 2, 11) → v = (1, 1.1, 1.2, . . . 1.9, 2) - 11 elemű vektor, egyenközű elemekkel,első eleme 1, utolsó 2
• v = [1 : 4]; (vagy v=1:4) → v = (1, 2, 3, 4), az 1 : 4 kifejezés létrehozza az 1, 2, 3, 4 sorozatot,vagyis az 1 kezdőelemtől egyesével lépked az utolsóig, 4-ig
• v = [0 : 3 : 12]; → v = (0, 3, 6, 9, 12), az 0 : 3 : 12 kifejezés létrehozza az 0, 3, 6, 9, 12 sorozatot,vagyis a 0 kezdőelemtől 3-asával lépked, mı́g el nem éri az utolsó elemet, a 12-t.
1.1.2 Vektorok létrehozása már meglévő vektorokból
Legyen v = [1 2 3];. Ekkor
• Bőv́ıtés új elemmel: w = [v 4 5 6];→ w = (1, 2, 3, 4, 5, 6)
• Sorvektorok összefűzése: u = [w v]→ u = (1, 2, 3, 4, 5, 6, 1, 2, 3)
• Oszlopvektorok összefűzése: ha w =
57
, akkor u = [w; v′]→ u =
5
7
1
2
3
• Részvektor létrehozása: a vektor neve után kerek zárójelben megadjuk a szükséges indexeket(vektorként)
? u1 = u(2 : 4), az u vektor 2., 3., 4. eleméből álló vektor: → u1 = (7, 1, 2)
8
-
? u1 = u([1 3 5]), az u vektor 1., 3. és 5. eleméből álló vektor: → u1 = (5, 1, 3)
• Vektorok összefűzése a repmat paranccsal:
w=repmat(v,1,3)
egymás után ı́rja a v vektort 3-szor (pontosabban megismétli v-t 1 sorban és 3 oszlopban)
w = [1 2 3 1 2 3 1 2 3]
• Vektor elemeinek a megismétlése a repelem paranccsal:
? w=repelem(v,3)
a v sorvektor minden elemét megismétli 3-szor 1 sorban, azaz
w = [1 1 1 2 2 2 3 3 3],
? w=repelem(v’,3)
a v’ oszlopvektor minden elemét megismétli 3-szor 1 oszlopban, azaz w = [1 1 1 2 2 2 3 3 3]′,
? w=repelem(v,[2,3,4])
a v sorvektor első elemét megismétli 2-szer, a másodikat 3-szor, a harmadikat 4-szer, azaz
w = [1 1 2 2 2 3 3 3 3],
itt a második argumentumnak v-el azonos hosszúságúnak kell lennie.
1.2 Hivatkozás vektorok elemeire
• Hivatkozás az egyes elemekre: v(2) - a v vektor 2. eleme
• Értékadás valemely koordinátának: v(3) = 7, pl. v = [1 2 3], v(2) = 6→ v = (1, 6, 3)
1.3 Vektorokra vonatkozó egyszerűbb függvények
1.3.1 Manipulációs függvények
• length(v) - a vektor hossza, pl v = linspace(1, 3, 11);→ length(v) = 11
• size(v) - a vektor mérete, azaz sorok és oszlopok száma, pl size(v) = (1, 11), illetve w = [1; 2; 3]esetén size(w) = (3, 1)
9
-
• min(v) - a v legkisebb eleme
• max(v) - a v legnagyobb eleme
• sum(v) - a vektor elemeinek az összege
• sort(v) - növekvő sorrendbe rendezi a vektor elemeit
• v’ - transzponálás, v = [1 2 3]→ v′ =
1
2
3
1.3.2 Matematikai függvények
A legáltalánosabban használt matematikai függvények megtalálhatóak a Matlab-ban is. Ezek
a függvények alkalmazhatóak vektorokra is, elemenkénti kiértékeléssel. Például
• w=sin([1 2 3]) - w = [sin(1), sin(2), sin(3)] = [0.8415 0.9093 0.1411]
További függvények például: abs, exp, cos, tan, log.
1.4 Műveletek vektorokkal
Legyen v = [1 2 3], w = [4 5 6] (egyforma méretűek!)
• u = v + w - két vektor elemenkénti összeadása: → u = (5, 7, 9)
• u = v − w - két vektor elemenkénti kivonása: → u = (−3,−3,−3)
• u = v + 1 - egy vektor minden eleméhez ugyanazon szám hozzáadása: → u = (2, 3, 4)
• u = v.∧2 - elemenkénti négyzetre emelés: → u = (1, 4, 9)
• u = v. ∗ w - két vektor elemenkénti szorzása: → u = (4, 10, 18)
• u = v./w - két vektor elemenkénti osztása: → u = (0.25, 0.4, 0.5)
• u = 1./v - egy vektor elemenkénti reciproka: → u = (1, 0.5, 0.33)
• u = v ∗w - vektorok szokásos szorzása, megfelelő méret esetén. A fenti v-re és w-re ez hibás,
helyes lehet: u = v′ ∗ w =
4 5 6
8 10 12
12 15 18
, és u = v ∗ w′ = 32.
10
-
2 Mátrixok
2.1 Mátrixok létrehozása
2.1.1 Mátrixok létrehozása az elemek megadásával
M = [1 2 3; 4 5 6]; → M =
1 2 34 5 6
2.1.2 Mátrixok létrehozása már meglévő vektorokból és mátrixokból
• Vektorok összefűzésével: v = [1 2 3 4];w = [2 3 7 8]; esetén
M = [v;w]→M =
1 2 3 42 3 7 8
és M = [v′, w′]→M =
1 2
2 3
3 7
4 8
• Bőv́ıtés új sorral: w = [9 4 5 6] és M =
1 2 3 42 3 7 8
esetén N = [M ;w] → N =1 2 3 4
2 3 7 8
9 4 5 6
• Bőv́ıtés új oszloppal: w = [9 4]′ és M =
1 2 3 42 3 7 8
esetén N = [M,w] → N =1 2 3 4 92 3 7 8 4
• Mátrixok összefűzése: M =
1 22 3
és N =4 8
7 1
esetén
L = [M,N ]→ L =
1 2 4 82 3 7 1
és L = [M ;N ]→ L =
1 2
2 3
4 8
7 1
11
-
• Mátrixok összefűzése a repmat paranccsal: M =
1 25 3
eseténL=repmat(M,2,3)
elkésźıti az M mátrix 2 · 3 = 6 másolatát, melyet 2 sorban és 3 oszlopban rendez el, azaz
L =
1 2 1 2 1 2
5 3 5 3 5 3
1 2 1 2 1 2
5 3 5 3 5 3
• Vektor elemeinek a megismétlése a repelem paranccsal: v = [1 2 3]; esetén
L=repelem(v,2,3)
a v vektor minden eleme helyett egy olyan 2×3-as konstans mátrixot ı́r, melynek minden elemeaz adott elem, azaz
L =
1 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 3
• Mátrix elemeinek a megismétlése a repelem paranccsal: M =
1 25 3
eseténL=repelem(M,2,3)
az M mátrix minden eleme helyett egy olyan 2 × 3-as konstans mátrixot ı́r, melynek mindeneleme az adott elem, azaz
L =
1 1 1 2 2 2
1 1 1 2 2 2
5 5 5 3 3 3
5 5 5 3 3 3
2.1.3 Mátrixok létrehozása beéṕıtett függvényekkel
• eye(n) - n× n-es egységmátrix: eye(2) =
1 00 1
12
-
• ones(n,m) - n×m-es csupa 1-esből álló mátrix: ones(2, 3) =
1 1 11 1 1
• ones(n) = ones(n, n)
• zeros(n,m) - n×m-es csupa 0-ból álló mátrix: zeros(2, 3) =
0 0 00 0 0
• M = diag(v) - olyan diagonális mátrix, melynek főátlójában a v vektor elemei állnak, például
v = (1, 2, 5) esetén: M =
1 0 0
0 2 0
0 0 5
• zeros(n) = zeros(n, n)
• rand(n,m) - n×m-es véletlen mátrix
• rand(n) = rand(n, n)
2.2 Hivatkozás mátrixok elemeire, értékadás
Legyen M =
1 2 4 12 3 9 6
• x = M(1, 3) - hivatkozás a mátrix egy elemére, az M mátrix 1. sorának 3. eleme, → x = 4
• u = M(1, :) - az M mátrix első sora → u = (1, 2, 4, 1)
• u = M(:, 2) - az M mátrix 2. oszlopa →
23
• N = M(:, 1 : 3) - az M mátrix első, második és harmadik oszlopa → N =
1 2 42 3 9
• N = M(:, [2, 4]) - az M mátrix második és negyedik oszlopa → N =
2 13 6
• Értékadás a mátrix valemely elemének: M(2, 1) = 7→M =
1 2 4 17 3 9 6
• Értékadás a mátrix valemely sorának: M(1, :) = 4 : 7→M =
4 5 6 72 3 9 6
13
-
• Értékadás a mátrix valemely oszlopának: M(:, 3) = 1 : 2→M =
1 2 1 12 3 2 6
2.3 Mátrixokra vonatkozó egyszerűbb függvények
2.3.1 Manipulációs függvények
Legyen M =
1 4 −1 22 9 3 −4
.• v = size(M) - a mátrix mérete, azaz a sorok és az oszlopok száma: → v = (2, 4)
• v = min(M) - az M oszloponkénti legkisebb eleme: → v = (1, 4,−1,−4)
• v = min(M ,[],2) - az M soronkénti legkisebb eleme: → v = (−1,−4)′
• d = min(M ,’all’) - az M legkisebb eleme: → d = −4 (Matlab 2018b-től)
• v = max(M) - az M oszloponkénti legnagyobb eleme: → v = (2, 9, 3, 2)
• v = min(M ,[],2) - az M soronkénti legnagyobb eleme: → v = (4, 9)′
• d = min(M ,’all’) - az M legnagyobb eleme: → d = 9 (Matlab 2018b-től)
• N = abs(M) - az M mátrix elemeinek abszolút értékéből áll mátrix: → N =
1 4 1 22 9 3 4
• v = sum(M) - az M mátrix oszloponkénti elemeinek az összege: → v = (3, 13, 2,−2)
• N = sort(M, 1), vagy sort(M) - növekvőleg sorba rendezi a mátrix elemeit oszloponként:
→ N =
1 4 −1 −42 9 3 2
•N = sort(M, 2) - növekvőleg sorba rendezi a mátrix elemeit soronként: → N =
−1 1 2 4−4 2 3 9
2.3.2 Matematikai függvények
Ahogy a vektoroknál is a matematikai függvények elemenként alkalmazhatóak mátrixokra is,
például abs, exp, sin, cos, tan, log.
Továbbá
14
-
• N = M ’ vagy N = transpose(M) - transzponálás: → N =
1 2
4 9
−1 32 −4
• N = inv(L) - az L mátrix inverze, például L =
1 24 9
→ N = 9 −2−4 1
• x = det(L) - az L mátrix determinánsa: → x = 1
• v = diag(L) - az L mátrix diagonálisában lévő elemekből álló vektor: → v = (1, 9).
2.4 Műveletek mátrixokkal
Legyen M =
1 −2−4 9
és N =2 −1
3 5
(egyforma méretűek)• L = M +N - két mátrix elemenkénti összege → L =
3 −3−1 14
• L = M −N - két mátrix elemenkénti különbsége → L =
−1 −1−7 4
• L = M + 1 - egy mátrix minden eleméhez ugyanazt a számot adja hozzá → L =
2 −1−3 10
• L = c∗M - valós számmal való szorzás (elemenként), például c = 2 esetén: → L =
2 −4−8 18
• L = M.∧2 - elemenkénti négyzetre emelés: → L =
1 416 81
• L = M ∗N - mátrixok szorzása, megfelelő méret esetén: → L =
−4 −1119 49
• L = M. ∗N - elemenkénti szorzás: → L =
2 2−12 45
• L = M./N - elemenkénti osztás: → L =
0.5 2−1.33 1.8
15
-
• L = 1./M - elemenkénti reciprok: → L =
1 −0.5−0.25 0.11
• x = M\N - az Mx = N lineáris egyenletrendszer megoldása az x ismeretlenre nézve, azaz
x = M−1 ∗N : → x =
24 111 1
• x = M/N - az xM = N lineáris egyenletrendszer megoldása az x ismeretlenre nézve, azaz
x = N ∗M−1: → x =
0.8462 −0.2308−3.6154 1.0769
• v = M ∗ w - mátrix-vektor szorzás megfelelő méret esetén, például w =
12
esetén: → v =−314
• v = w ∗M - vektor-mátrix szorzás megfelelő méret esetén, pédául w = (1, 2) esetén: → v =(−7, 16).
3 Mindenféle
3.1 A find parancs
A find paranccsal vektorokban, mátrixokban tudunk keresni.
A legegyszerűbb esetben egy mátrixot kap argumentumként, és visszatér azon indexek oszlop-
vektorával, ahol a mátrix nem nulla elemeket tartalmaz. (A mátrix elemeit oszlopfolytonos
számozással indexeli.) Például:
M=[1 2 3; 0 3 4; 0 0 5];
find(M);
esetén az eredmény
1 4 5 7 8 9.
Ha a nemnulla elemek sor- és oszlopindexeit szeretnénk megkapni, akkor azokat vissztérési
argumentumként tudjuk egy-egy változóba lekérni:
[row,col]=find(M);
16
-
Továbbá magukat a nemnulla elemeket is visszkérhetjük egy harmadik argumentumként:
[row,col,v]=find(M);
Az első n darab nemnulla elem lekérdezése:
find(M,n);
Az utolsó n darab nemnulla elem lekérdezése:
find(M,n,’last’);
A fentinél általánosabb kereséseket is végezhetünk a find paranccsal. Egy adott feltételt
kieléǵıtő elemek indexeinek a lekérdezése:
find(M
-
fájl tartalma!) Ha csak egy időre szeretnénk kikapcsolni a naplózást, akkor a diary off parancs
kiadása után a diary on paranccsal tudjunk a korábban megkezdett naplófájlt folytatni.
3.3 A close parancs
A close paranccsal tudunk bezárni Matlab ábrákat. A
close
parancs az aktuális ábrát zárja be, a
close név
parancs az ’név’ nevű ábrát zárja be, a
close all
parancs minden ábrát bezár.
3.4 A disp, az fprintf, az sprintf, az strcat és a num2str parancs
A disp és az fprintf parancs kíıratásra való. A disp paranccsal szinte bármit kíırathatunk,
de nincs ráhatásunk a kíıratás módjára. Használhatjuk például vektorok, mátrixok, szövegek
kíıratására.
disp(X);
Az fprintf parancs formázott szövegek kíıratására alkalmas a command windowba (vagy fájlba).
A legegyszerűbb esetben kíırathatunk vele egy adott szöveget:
fprintf(’Ezt ı́ratom ki’);
Ha a szövegbe bizonyos változók értékeit szeretnék beleszőni, akkor a szöveg megfelelő helyére
egy %-jelet teszünk, ezután egy konverziós karakter következik, amely megmondja, milyen
t́ıpusú adatot szeretnénk szöveggé formázni. A szöveg-argumentum után következnek a kon-
vertálandó(kíıratandó) változók további argumentumokként. Például ha az x és a d változók
értékeit szeretnénk kíıratni:
x=2.5;
y=3;
fprintf(’Az x válozó értéke: %f, az y változóé: %d.’,x,y);
18
-
Itt az ’f’ karakter egy lebegőpontos számot jelöl (fix pontos alakban), a ’d’ egészet. További
fontosabb konverziós karakterek: ’e’ - lebegőpontos szám exponenciális alakban, ’c’ - karakter,
’s’ - sztring.
A lebegőpontos számoknál meghatározhatjuk, hogy hány tizedesjegyet szeretnénk kíıratni:
fprintf(’Az x válozó értéke: %.5f, az y változóé: %d.’,x,y);
Egyéb speciális karaketerek:
\ n - sortörés,\ t - tabulálás,\ v - vertikális tabulálás.
Az sprintf parancs szintaktikája lényegében megegyezik az fprintf-ével, csak ő sztringbe vagy
karaktervektorba ı́rja a kapott szöveget.
A strcat paranccsal tudunk sztringeket összefűzni, a num2str paranccsal numerikus értékeket
számmá konvertálni. Például
num=28;
s=strcat(’logfájl a (’,num2str(num),’.) számoláshoz’);
diary(s)
x=32.34;
fprintf(’Az x változó értéke: %f\n’,x);diary off
4 Ábrák késźıtése
4.1 Kétdimenziós ábrák
4.1.1 A plot alapparancs
A Matlab plot parancsa a két dimenziós térben ábrázol véges sok pontot, majd az egymást
követő pontokat összeköti szakaszokkal. Így egy töröttvonalat kapunk. Ha az ábrázolandó
pontok koordinátái (x1, y1), . . . , (xn, yn), akkor a plot parancsnak az x = [x1, . . . , xn] és az
y = [y1, . . . , yn] vektorokat kell átadni.
Például:
19
-
x=[1 2 3 4];
y=[2 4 2 0];
plot(x,y);
.
Ha nem adjuk meg az x vektort, akkor a Matlab az x = [1, 2, . . . , n] értékekkel dolgozik.
4.1.2 Egyváltozós függvények ábrázolása a plot parancs seǵıtségével
Ha az f függvényt szeretnénk ábrázolni az [a, b] intervallumon, akkor valójában valamely
(x1, f(x1)), . . . , (xn, f(xn)) pontok által meghatározott töröttvonalat tudjuk megjeleńıteni, ahol
xi ∈ [a, b], ha i = 1, . . . , n. Ehhez meg kell adnunk az [a, b] intervallum egy felosztását, valamintaz ezen pontokhoz tartozó függvényértékeket.
Például ha f(x) = sin(x) és [a, b] = [0, 2 · π]:
x=linspace(0,2· pi);y=sin(x);
plot(x,y);
Ha f(x) = x2 + 2 · x+ 3 és [a, b] = [−2, 2]:
x=-2:1:2;
y=x.∧2+2*x+3;
20
-
plot(x,y);
Szebb ábrát kapunk természetesen, ha sűrűbben vesszük fel a pontokat az [a, b] intervallumban:
x=-2:0.1:2;
y=x.∧2+2*x+3;
plot(x,y);
4.1.3 A plot opciói
Az ábráinkon van lehetőség sok mindent beálĺıtani: a vonalak sźınét, vastagságát, a tenge-
lyeket...stb. Ezek közül a legfontosabbak a következők:
• a sźın beálĺıtási lehetőségei:
b - blue(default)
g - green
c - cyan
y - yellow
r - red
m - magenta
k - black
21
-
Parancsa, ha például zöld vonallal szeretnénk ábrázolni a függvény görbéjét: plot(x,y,’g’);
• a vonalfajta beálĺıtási lehetőségei:
- - folytonos(default)
: - pontozott
- - - szaggatott
-. - pont-vonás
Parancsa, ha például pontozott vonallal szeretnénk ábrázolni a függvény görbéjét: plot(x,y,’:’);
• az ábrázolt pontok szimbólumának beálĺıtási lehetőségei:
22
-
. - pont
d - gyémánt (diamond)
o - kör
h - hexagram
p - pentagram
+ - plusz-jel
s - négyzet (square)
* - csillag
v - lefelé álló háromszög
∧ - felfelé álló háromszög
< - balra álló háromszög
> - jobbra álló háromszög
x - x-jel
Parancsa, ha például hexagrammal jelölt pontsorozattal szeretnénk ábrázolni a függvény görbéjét:
plot(x,y,’h’);
? a fentiek kombinációja:
A fenti három opciót tetszőlegesen kombinálhatjuk, mindhárom opcióból egyet-egyet (vagy
egyet sem) választva. Például körrel jelölt pontsorozattal, összekötve fekete szaggatott vonallal:
plot(x,y,’ok- -’);
23
-
4.1.4 Az plot további opciói
A fenti három plot-opció mellé a plot parancson belül van lehetőség további beálĺıtásokra is.
Ezeket az opciókat értékpáronként kell megadni: a pár első eleme a beálĺıtandó opció neve
karatersorozatként, a második eleme a ḱıvánt érték. Ilyen párokat sorolhatunk fel tetszőleges
sorrendben a plot függvény argumentumaiként. Ezen lehetőségek közül megemĺıtjük a követ-
kezőket:
• ’Color’, [r,g,b] - az RGB sźınkód szerinti megadása a sźıneknek, 0 ≤ r, g, b ≤ 1
• ’LineWidth’, x - a vonal vastagságát x-re álĺıtja
• ’MarkerSize’, x - a pontokat ábrázoló jelek mérete
• ’MarkerEgdeColor’, [r,g,b] - a pontokat ábrázoló jelek külső vonalának sźıne
• ’MarkerFaceColor’, [r,g,b] - a pontokat ábrázoló jelek belsejének a sźıne
• ’LineStyle’, x - vonalfajta, x lehetséges értékei mint fent
• ’Marker’, x - pontok szimbóluma, x lehetséges értékei mint fent
4.1.5 Több függvény egy ábrában
Ha egy ábrában több függvényt szeretnénk megadni, vagyis ha egyszerre szeretnénk ábrázolni
az (X1, X1), (X2, Y2), . . . , (Xn, Yn) vektorpárok által meghatározott n darab görbét, akkor ezen
vektorpárokat egymás után kell megadni a plotparancsnak. Például:
x=linspace(0,4);
y1=sin(x);
y2=cos(x);
plot(x,y1,x,y2)
A fenti opciók most is megadhatók, görbénként:
plot(x,y1,’:go’,x,y2,’–k’);
24
-
.
Az opció-érték párként megadott beálĺıtások minden görbére vonatkoznak, például
plot(x,y1,’g’,x,y2,’–k’,’LineWidth’,8);
Ha külön-külön szeretnénk álĺıtani ezeket az opciókat, akkor arra például a következő módokon
van lehetőségünk:
? hold on - ezzel a beálĺıtással az egymás után kiadott plot parancsok egy ábrába kerülnek.
Kikapcsolása: hold off
Például
x=linspace(0,4);
y1=sin(x);
y2=cos(x);
plot(x,y1,’:k’,’LineWidth’,2);
hold on
plot(x,y2,’–r’,’LineWidth’,8);
hold off
25
-
? az elkészült ábra paraméterei utólag is álĺıthatók: például
x=linspace(0,4);
y1=sin(x);
y2=cos(x);
p=plot(x,y1,’:k’,x,y2,’–r’);
p(1).LineWidth=8;
p(1).Color=[0.1,0.7,0.1];
p(2).LineWidth=2;
p(2).Color=[0.1,0.2,0.7];
4.1.6 Az ábrák további beálĺıtási lehetőségei
A fenti három plot-opció mellé a plot parancs után van lehetőség további beálĺıtásokra is. Ezek
közül megemĺıtjük a követlezőket:
• grid on - berácsozza az ábrát
• title(’Az ábra ćıme’) - az ábra tetejére a megadott ćımet ı́rja
• xlabel(’x-tengely neve’) - az x-tengely mellé ı́rja a ḱıvánt nevet
• ylabel(’y-tengely neve’) - az y-tengely mellé ı́rja a ḱıvánt nevet
26
-
• legend(’elnevezés1’,’elnevezés2’,...) - jelmagyarázat, az egyes ábrázolt görbékhez tartozó el-nevezéseket kell átadni a legend függvénynek
? legend(’elnevezés1’,’elnevezés2’,..., ’Location’, ’northwest’) - a jelmagyarázat helye meghatározható
a ’Location’ érték beálĺıtásával, lehetséges értékei például: north, south, east, west, northeast,...,
northoutside,..., northeastoutside, best, bestoutside
Például:
x=linspace(0,4);
y1=sin(x);
y2=cos(x);
plot(x,y1,x,y2);
legend(’sin’,’cos’,’Location’, ’northeastoutside’)
.
? legend off, legend on - a jelmagyarázat eltüntetése, illetve megjeleńıtése egy elkészült ábrán
4.1.7 Több al-ábra megjeleńıtése egyszerre - a subplot parancs
Egy képen a subplot parancs seǵıtségével tudunk több ábrát megjeleńıteni. A subplot parancs
(a legegyszerűbb esetben) három paramétert kap: subplot(m,n, d), ahol m azt jelöli, hogy
hány sornyi, az n azt, hogy hány oszlopnyi ábrát szeretnénk, a d pedig azt, hogy hanyadik
ábrát késźıtjük el éppen, sorfolytonosan számozva.
Pédául:
subplot(2,2,1)
x1 = linspace(0,10);
y1 = sin(x1);
plot(x1,y1,’r’)
27
-
title(’A sin(x) függvény’)
subplot(2,2,2)
x2 = linspace(0,10);
y2 = sin(2*x2);
plot(x2,y2,’k’)
title(’A sin(2x) függvény’)
subplot(2,2,3)
x3 = linspace(0,10);
y3 = sin(3*x3);
plot(x3,y3,’g’)
title(’A sin(3x) függvény’)
subplot(2,2,4)
x4 = linspace(0,10);
y4 = sin(4*x4);
plot(x4,y4,’y’)
title(’A sin(4x) függvény’)
.
A korábbi opciók itt is beálĺıthatók az egyes részábrákra külön-külön.
4.1.8 Egyváltozós szimbolikus függvények ábrázolása az fplot parancs seǵıtségével
Szimbolikus függvények ábrázolására szolgál az fplot parancs. Egy egyváltozós függvény szin-
taktikája Matlab-ban a következő lehet:
28
-
f=@(x) sin(x)+cos(x); (anońım függvény)
syms x
f=sin(x)+cos(x); (szimbolikus kifejezés)
syms f(x)
f(x)=sin(x)+cos(x); (szimbolikus függvény)
Mindhárom esetben az fplot parancsnak meg kell adni az ábrázolandó függvényt és azt az
intervallumot, ahol ábrázolni szeretnénk a függvényt, azaz
fplot(f,[-10,10]);
.
(Ha nem adunk meg intervallumot, akkor a default értéke [−5, 5].)
Itt is használhatók a fent léırt paraméterek és az egyéb beálĺıtások, például
p=fplot(@(x) x2 + sin(x), [−3, 3],’–ko’);p.MarkerEdgeColor=’b’;
p.MarkerFaceColor=’r’;
hold on
fplot(@(x) cos(x),[-3,3],’y’,’LineWidth’,4)
hold off
grid on
.
29
-
4.2 Háromdimenziós ábrák
4.2.1 A surf alapparancs
A Matlab surf parancsa három dimenziós térbeli ábrát késźıt. Hasonlóan a plot parancshoz
véges sok térbeli pontot ábrázol, majd ezekre illeszt egy felületet.
Ábrázoljuk egy f : R2 → R függvény gráfját a térben. A fent emĺıtett térbeli pontok megha-tározásához megadunk először egy rácsot az xy śıkban. Ezután meghatározzuk az f értékét
a rácspontokban, ezek lesznek az egyes śıkbeli pontok z-koordinátái. Így egy szabályos pont-
halmazt kapunk a térben. A Matlab ezen pontokra illeszt egy felületet. (Az illesztett felület
kisebb felületdarabokból áll. Ezek a kisebb felületek a rácsot alkotó legkisebb négyzetekhez
tartozó térbeli pontnégyesekre illesztett térbeli négyszögek lesznek.)
Példa: ábrázoljuk az f(x, y) = x · y függvényt a [0, 2]× [0, 4] téglalap felett. Először elkésźıtjüka meshgrid parancs seǵıtségével a [0, 2]× [0, 4] téglalap egy (durva beosztású!) rácsát:
[X,Y]=meshgrid(0:1:2,0:2:4);
Így az X változó a pontok x-koordinátáit tartalmazza, Y az y-koordinátákat:
X =
0 1 2
0 1 2
0 1 2
Y =
0 0 0
2 2 2
4 4 4
A függvény kiértékelése az egyes rácspontokban:
Z=X.*Y;
A felület elkésźıtése:
surf(X,Y,Z);
30
-
.
Ezen az ábrán jól látszik, hogy az elkészült felület hogyan épül fel kisebb felületdarabokból.
Természetesen a rács durvasága miatt (azaz túl kevés pontot vettünk fel a [0, 2]×[0, 4] értelmezésitartományban) az ábra nem is szép és a függvény gráfját is nagyon rosszul közeĺıti. Ha finomabb
beosztást választunk, akkor a következő, szebb ábrát kapjuk:
[X,Y]=meshgrid(0:0.02:2,0:0.04:4);
Z=X.*Y;
surf(X,Y,Z);
A finomabb beosztású rács:
A függvény képe:
A legtöbb korábbi opció itt is használható, de például a sźın beálĺıtására más módon van
31
-
lehetőség, mint a plot parancs esetében. Továbbá vannak olyan opciók is, amelyek az egyváltozós
függvények esetében nem lennének értelmesek, ı́gy azok csak a három dimenziós ábrák esetében
adhatók meg. Ezek közül megemĺıtjük:
? FaceColor - az egész felületet alkotó kis felületdarabok sźıne.
? zlabel - a z-tengely neve
? colorbar - az egyes z-értékekhez rendelt sźınek megjeleńıtése folytonosan, oszlop formában
Példa:
[X,Y]=meshgrid(0:0.2:2,0:0.2:4);
Z=X.*Y;
surf(X,Y,Z,’FaceColor’,’b’,’EdgeColor’,’r’,’Marker’,’v’,’MarkerSize’,4,’MarkerFaceColor’,’y’);
xlabel(’x-tengely’)
ylabel(’y-tengely’)
zlabel(’x*y-tengely’)
title(’Az f(x,y)=x*y függvény’)
.
4.2.2 Kétváltozós szimbolikus függvények ábrázolása az fsurf parancs seǵıtségével
Ahogy az egyváltozós esetben is, most is van lehetőség szimbolikus függvények ábrázolására.
Ennek parancsa az fsurf. Szintaktikája hasonló az fplot parancs szintaktikájához. Első paraméterként
meg kell adnunk egy kétváltozós függvényt, melyet szintén három módon tehetünk meg. Például:
f = @(x,y) sin(x)+cos(y); (anońım függvény)
syms f(x,y)
f(x,y)= sin(x)+cos(y); (szimbolikus függvény)
32
-
syms x y
f = sin(x)+cos(y); (szimbolikus kifejezés)
Második paraméterként pedig azt az intervallumot, ahol ábrázolni szeretnénk a függvényt,
[xmin xmax ymin ymax] alakban.
fsurf(f,[-2 2 -5 5])
.
Most is van lehetőség a korábban emĺıtett opciók beálĺıtására, illetve vannak olyan opciók,
amelyek a korábbi esetekben nem használhatóak, mint például
? ShowContours - a függvény gráfja alá berajzol bizonyos kontúrvonalakat, vagyis olyan görbéket
az xy śıkban, amelyek mentén az ábrázolt függvény konstans értéket vesz fel
?MeshDensity - azon pontok száma irányonként, melyekben a Matlab az ábrázoláshoz szükséges
függvénykiértékeléseket elvégzi.
Példa:
fsurf(f,[-2 2 -5 5],’r:o’,’EdgeColor’,’b’,’ShowContours’,’on’,’MeshDensity’,30,’MarkerSize’,7,’MarkerFaceColor’,’g’)
Hasonlóan a korábbiakhoz most is van lehetőség több függvény gráfját egy ábrában megje-
leńıteni. Pédául:
f1 = @(x,y) x.*cos(y);
33
-
fsurf(f1,[-2 2 -5 5],’y’)
hold on
f2 = @(x,y) sin(x)+cos(y);
fsurf(f2,[-2 2 -5 5],’b’)
hold off
.
4.3 Parametrizált görbék ábrázolása
4.3.1 Kétdimenziós parametrizált görbék
Parametrizált görbe alatt a śıkban egy r : [a, b] → R2, r(t) = (x(t), y(t)) leképezést értünk.Ezen görbéket ténylegesen úgy érdemes elképzelni, mint egy śıkban futó görbe vonalat. (Bár
a ”görbeség” nem feltétlenül kell, hogy teljesüljön, egy egyenest is fel tudunk ı́rni paraméteres
alakban.) A görbe egyes (x(t), y(t)) pontjai megfeleltethetők például egy test helyzetének a
t-edik időpillanatban (feltéve, hogy a görbénk folytonos). A görbe képén nem látszik, hogy
a test melyik időpillanatban hol jár, ugyanazon görbe vonal több parametrizált görbe képe is
lehet, melyen a test különböző sebességgel halad végig.
Példák:
(i) egy egyenes parametrizált alakja: r(t) = (t, 2t),
(ii) egy parabola: r(t) = (t, t2),
(iii) az origó középpontú egység sugarú kör: r(t) = (cos(t), sin(t)), t ∈ [0, 2 · π]. (iii) a (2, 3)középpontú 5 sugarú kör: r(t) = (2 + 5 · cos(t), 3 + 5 · sin(t)), t ∈ [0, 2 · π].
A Matlab-ban a már ismert plot paranccsal is tudunk parametrizált görbét ábrázolni. Például
a (2, 3) középpontú 5 sugarú kör ábrázolása:
t=linspace(0,2*pi);
x=2+5*cos(t);
y=3+5*sin(t);
34
-
plot(x,y);
.
Ebben a formában az ábra képe inkább ellipszisre hasonĺıt. Ha ”valódi” kört szeretnénk látni,
akkor álĺıtsuk be a tengelyeket egyenlő beosztásúra az
axis equal
paranccsal:
.
Az fplot paranccsal is tudunk parametrizált görbét ábrázolni. Ekkor az x(t) és y(t) függvényeket
a Matlab-ban is függvényként kell definiálnunk. A t értékek default értelmezési tartománya
[−5, 5]. Ha ettől eltérő értelmezési tartományt szeretnénk, akkor harmadik paraméterként átkell adnunk azt is. Például ha csak egy félkört szeretnénk ábrázolni:
xt=@(t) 2+5*cos(t);
yt=@(t) 3+5*sin(t);
fplot(xt,yt,[pi/2,3*pi/2]);
axis equal
35
-
.
4.3.2 Háromdimenziós parametrizált görbék
Háromdimenziós parametrizált görbét a kétdimenziós görbékhez hasonlóan definiálhatunk és
ábrázolhatunk. A háromdimenziós térben egy r : [a, b]→ R3, r(t) = (x(t), y(t), z(t)) leképezéstnevezünk parametrizált görbének. Ábrázolásához a plot3 és az fplot3 parancsokat használhatjuk,
melyek működése a kétdimenziós esetben használt plot, illetve fplot parancsok működésével
analóg.
Például ábrázoljuk az r(t) = (t, 5 · cos(t), 5 · sin(t)) csavarvonalat mindkét paranccsal:
t=linspace(0,12*pi);
x=5*cos(t);
y=5*sin(t);
plot3(t,x,y);
.
Ezen az ábrán látszik, hogy a t értékek túl ritkán helyezkednek el a [0, 12 · π] intervallumban,a görbe képe töredezett. Szebb ábrát kapunk, ha sűŕıtjük őket:
t=linspace(0,12*pi,500);
36
-
x=5*cos(t);
y=5*sin(t);
plot3(t,x,y);
.
Az fplot3 paranccsal a fenti görbe ábrázolása:
xt = @(t) t;
yt = @(t) cos(t);
zt = @(t) sin(t);
fplot3(xt,yt,zt);
.
Ha nem adjuk meg az fplot3 parancsnak az értelmezési tartományt, akkor most is a default
[−5, 5] intervallummal számol. Ha ettől eltérőt szeretnénk, akkor adjuk át azt egy harmadikparaméterként:
xt = @(t) t;
yt = @(t) cos(t);
zt = @(t) sin(t);
fplot3(xt,yt,zt,[0,12*pi]);
37
-
.
4.4 Vektormezők ábrázolása
Śıkbeli vektormezők ábrázolásához a quiver, térbeli vektormezőkéhez a quiver3 parancsot használhatjuk.
Ehhez meg kell adnunk a vektorok kezdőpontjait tartalmazó (x, y), illetve (x, y, z) pontsoroza-
tokat (Matlab-vektorokat), valamint az egyes pontokból kiinduló vektorok sorozatát, azaz egy
(u, v), illetve három dimenzióban egy (u, v, w) sorozatot (Matlab-vektorokat).
Példaként ábrázoljuk az (n,m) egész rácspontokból induló (n2,m2) hosszúságú vektorokból álló
vektormezőt a [−3, 3]× [−4, 4] téglalapon.
[x,y] = meshgrid(-3:3,-4:4);
u = x.∧2;
v = y.∧2;
quiver(x,y,u,v);
.
4.5 Kontúrvonalak ábrázolása
Egy f : R2 → R függvény szintvonalainak vagy kontúrvonalainak a
γc ={
(x, y) ∈ R2 : f(x, y) = c}
38
-
alakú halmazokat értjük. Vagyis olyan pontokat gyűjtünk össze, ahol a függvény egy előre
megadott c konstans értéket vesz fel.
Példa: ábrázoljuk az f(x, y) = 5 · sin(x) + 6 · cos(x) függvény c = [−3,−2,−1, 0, 1, 2, 3, 4, 5, 6]értékekhez tartozó szintvonalait a [−2 · π, 2 · π]× [−3 · π, 3 · π] .
Először adjuk meg a függvényt numerikusan:
x = linspace(-2*pi,2*pi);
y = linspace(-3*pi,3*pi);
[X,Y] = meshgrid(x,y);
Z = 5*sin(X)+6*cos(Y);
Ábrázoljuk a szintvonalait a contour parancs seǵıtségével:
contour(X,Y,Z)
.
Ekkor a Matlab automatikusan választja ki, hogy mely értékekhez tartozó kontúrvonalakat
jeleńıt meg. Ha a fenti problémát szeretnénk megoldani, akkor át kell adnunk egy negyedik
paraméterben a ḱıvánt c értékeket is, azaz
c=[-3,-2,-1,0,1,2,3,4,5,6];
contour(X,Y,Z,c)
.
39
-
5 A Matlab programozása
5.1 Ciklusok
5.1.1 A for-ciklus
Ha ugyanazt a folyamatot sokszor egymás után végre szeretnénk hajtani csak különböző pa-
raméterekkel, akkor ezeket a lépéseket nem kell egyesével béırnunk, hanem úgynevezett for-
ciklusba is szervezhetjük. A for-ciklus előre megadott lépésszámra végrehajt előre megadott
utaśıtásokat.
Például ha minden számot szeretnénk négyzetre emelni és kíıratni 1-től 100-ig, akkor azt a
következőképpen tehetjük meg Matlab-ban:
for i=1:100
disp(i∧2);
end
Itt a for a ciklus kezdetét jelző kulcsszó, az i a ciklusváltozó, mely sorban egymás után felveszi
a megadott halmazbeli értékeket, jelen esetben minden értéket 1-től 100-ig, és az i változó
minden értékére végrehajtja azokat az utaśıtásokat, amelyek a for-t tartalmazó sor és az end-
sor között szerepelnek (vagyis a ciklustörzset). Jelen esetben ez az i2 érték kíıratása. (A disp
parancs kíırja a képernyőre a neki átadott értéket.) Az end kulcsszó jelzi a ciklus végét.
A ciklusváltozó értékét legtöbbször 1:n alakú halmazokban futtatjuk. Azonban más, akár
szerkezet nélküli halmazokkal is dolgozhatunk. Nézzük erre két példát.
(i)
H=[1, 5, 19, -4, 71];
for i=H
disp(i);
end
Ekkor a Matlab kíırja az 1, 5, 19, -4, 71 számokat.
(ii)
for i=1:4:30
disp(i);
40
-
end
Ekkor a Matlab kíırja az 1, 5, 9, 13, 17, 21, 25, 29 számokat.
For-ciklusokat egymásba is tudunk ágyazni. Például hozzuk létre az M = (Mij) 5 dimenziós
négyzetes mátrixot, melynek elemeire fennáll Mij = i+ j:
M=zeros(5);
for i=1:5
for j=1:5
M(i,j)=i+j;
end
end
disp(M);
Az eredmény:
M =
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
6 7 8 9 10
5.1.2 A while-ciklus
A while-ciklus hasonlóan a for-ciklushoz ugyanazon utaśıtás sorozatot hajtja végre valamely
paraméter különböző értékeire, de a lépésszám nem előre kötött, hanam a ciklus befejezése
valamely feltétel teljesülése esetén következik.
Példa: Legyen adott egy vektor. Kezdjük el összeadni az elemeinek az abszolútértékét addig,
amı́g el nem érünk egy előre megadott értéket. Ekkor térjünk vissza az utolsó összeadott szám
indexével.
v=[13 2 4 -16 3 -1 25 -7 9 21 -11 4 34];
limit=100;
szum=0;
i=0;
while szum
-
fprintf(’A keresett index:%d\ n’,i-1);
5.1.3 A break és az error parancs
Ha bizonyos feltétel teljesülése esetén ki szeretnénk szállni a ciklusunkból azelőtt, hogy az a
végére érne, akkor erre a break parancs nyújt lehetőséget. (Óvatosan érdemes használni!)
Példa: Írassuk ki a számok negyedik hatványait 1-től 100-ig. De ha véletlenül túl nagyra
nőnének a számok, akkor szálljunk ki a ciklusból.
for i=1:100
d=i∧4;
if d>1000
break;
end
disp(d);
end
Az error parancsot akkor használjuk, ha bizonyos hibás esemény bekövetkeztekor az egész pro-
gramból szeretnénk kiszállni, és magát a hibát is jelezni szeretnénk. A fenti példát módośıtsuk
úgy, hogy a program futását is megálĺıtjuk, ha túl nagy számok keletkeznek, és egy hibaüzenettel
térünk vissza:
for i=1:100
d=i∧4;
if d>1000
error(’Túl nagy számok keletkeztek’);
end
disp(d);
end
5.2 Elágazások
5.2.1 Az if -szerkezet
Ha egy utaśıtást csak bizonyos feltétel teljesülése esetén szeretnénk végrehajtani, akkor az if
kulcsszóval tudjuk ezt megoldani. A legegyszerűbb esetben a szerkezete
if feltétel
42
-
utaśıtások
end
Például, ha a 10-nél nem nagyobb természetes számok közül azokat szeretnénk kíıratni, melyek
3-mal osztva 2 maradékot adnak, akkor azt (többek között) a következő módon programozhatjuk
le:
for i=1:10
if mod(i,3)==2
disp(i);
end
end
Ekkor a Matlab kíırja a 2, 5, 8 számokat.
Ebben a szerkezetben az == operátor a matematikai értelemben vett egyenlőségi relációt jelöli.
A for ciklus fejében használt = jel az értékadás operátora. A mod(n,m) függvény visszaadja az
n természetes szám m-mel való osztási maradékát.
Ha abban az esetben, mikor a feltétel nem teljesül, valami mást szeretnénk csinálni, akkor ezt
egy else-ágba tehetjük bele. A fenti példát egésźıtsük ki azzal, hogy ha az osztási maradék nem
2, akkor ı́rassuk ki a szám négyzetét:
for i=1:10
if mod(i,3)==2
disp(i);
else
disp(i∧2);
end
end
Ekkor a Matlab kíırja a 1, 2, 9, 16, 5, 36, 49, 8, 81, 100 számokat.
Ha további feltételeket is szeretnénk vizsgálni abban az esetben, ha az első feltétel nem tejesül,
akkor egy elseif-ág bevezetésével van erre lehetőségünk. Például, ha az osztási maradék 1 értéke
esetén a szám négyzetét, 3 értéke esetén a szám köbét szeretnénk kíıratni, akkor
for i=1:10
if mod(i,3)==2
disp(i);
elseif mod(i,3)==1
43
-
disp(i∧2);
else
disp(i∧3);
end
end
Ekkor a Matlab kíırja a 1, 2, 27, 16, 5, 216, 49, 8, 729, 100 számokat.
(Ennek az utolsó feladatnak elegánsabb megoldását kapjuk a switch alkalmazásával.)
5.2.2 A switch-szerkezet
Ha egy változó több különböző értéke esetén különböző utaśıtásokat szeretnénk végrehajtani,
akkor az úgynevezett switch-szerkezet nyújt erre elegáns lehetőséget. Általános szerkezete:
switch változó
case érték1
utaśıtások
case érték2
utaśıtások...
case értékn
utaśıtások
otherwise
utaśıtások
end
A szerkezet a switch kulcszóval kezdődik. Ezt követi annak a változónak a neve, amelynek
különböző értékei esetén szereténk különböző utaśıtásokat végrehajtani. Az egyes vizsgált es-
eteket egy-egy case-ágba ı́rjuk, vagyis egy case kulcsszó után léırjuk az adott értéket, melyet a
végrehajtani ḱıvánt utaśıtások követnek. Ha a case-ágakkal le nem fedett esetek mindegyikében
egyazon dolgot szeretnénk csinálni, akkor ezt egy otherwise-ágba ı́rhatjuk bele.
Példaként az előző feladat megoldása switch-szerkezettel:
m=mod(i,3);
switch m
case 1
disp(i∧2);
44
-
case 2
disp(i)
case 3
disp(i∧3)
end
6 Függvényillesztés
Legyenek adva az egész fejezetben az (x1, y1), . . . , (xn, yn) alappontok. Olyan függvényeket
keresünk, amelyek különböző szempontok szerint jól közeĺıtok meg ezen pontokat. Másképpen
jól ı́rják le közeĺıtőleg azt a folyamatot, amelyből ezek a (mérési) értékek származnak. Matlab
parancsként legyenek
X = [x1, . . . , xn]
Y = [y1, . . . , yn].
6.1 Interpoláció
Interpolációról akkor beszélünk, ha olyan közeĺıtő függvényt keresünk, amely áthalad az adott
pontok mindegyikén.
6.1.1 Spline interpoláció
Legfontosabb beéṕıtett Matlab függvénye a spline függvény, mely harmadfokú interpoláló
spline-t késźıt.
Ez a függvény kétféleképpen használható. A
pp=spline(X,Y)
parancs visszaadja a spline-t szakaszosan definiált polinomként a Matlab beéṕıtett spline struk-
túrájában. Például x=4:14 és valamely y esetén a következőket kapjuk:
form: ’pp’
breaks: [4 5 6 7 8 9 10 11 12 13 14]
coefs: [10×4 double]pieces: 10
order: 4
45
-
dim: 1
Ekkor a beéṕıtett spline-kezelő függvényekkel tudjuk manipulálni pp-t: fnplt, fnder, fnint,
fncmb, fnval..stb. Másik (jelenlegi céljaink számára hasznosabb) lehetőség: az
y=spline(X,Y,x)
parancs visszaadja egy előre definiált x vektor esetén a spline értékeit az x pontokban. Ezt
lehet a továbbiakban például a függvény ábrázolására használni:
x=linspace(X(1),X(end));
y=spline(X,Y,x);
plot(X,Y,’*’,x,y);
.
Késźıthetünk lineáris spline-t az interp1 paranccsal. Használata megegyezik a spline-parancs
2. fajta használatával, azaz
y=interp1(X,Y,x);
plot(X,Y,’*’,x,y);
.
A spline parancshoz hasonló szerkezetű parancsok még a pchip és a makima, melyekkel harmad-
fokú szakaszosan definiált Hermite-interpolációs polinomot, illetve annak módośıtott változatát
késźıthetjük el. A spline parancshoz hasonlóan kétféleképpen használhatóak.
46
-
p=pchip(X,Y);
y=pchip(X,Y,x);
p=makima(X,Y);
y=makima(X,Y,x);
Az interp1 parancs seǵıtségével is meg tudjuk valóśıtani a fenti 3 interpolációs feladatot (spline,
pchip, makima) oly módon, hogy ezeket a neveket, mint módszernevek átadjuk az interp1
függvénynek:
interp1(X,Y,x,’linear’); (ez a default módszer)
interp1(X,Y,x,’spline’);
interp1(X,Y,x,’pchip’);
interp1(X,Y,x,’makima’);
Továbbá van lehetőségünk egyszerre több adatsor interpolálására is. Ekkor az Y változóban
nem egy vektort, hanem egy mátrixot kell tárolnunk, melynek oszlopai a különböző mérésekből
származó adatokat tartalmazzák. Pédául:
X=[1:5];
Y=[1 0 -1 0 1; 3 1 0 1 3; 4 2 1 2 4];
x=linspace(X(1),X(end),500);
y=interp1(X,Y’,x,’spline’);
plot(X,Y,’*’,x,y);
.
47
-
6.2 Legkisebb négyezetes közeĺıtések
6.2.1 A polyfit parancs
A polyfit paranccsal a legkisebb négyzetek elve alapján polinomot tudunk illeszteni. Az alap-
pontokon ḱıvül meg kell adnunk az illesztendő polinom n fokszámát is:
polyfit(x,y,n)
Példa: illesszünk egyenest, illetve másodfokú polinomot, mely a legjobban közeĺıti a következő
mérési eredményeket:
idő 1 18 57 130 240 337 398
A 1.39 1.26 1.03 0.706 0.398 0.251 0.18
Megoldás: T=[1 18 57 130 240 337 398];
A=[1.39 1.26 1.03 0.706 0.398 0.251 0.18];
p1=polyfit(T,A,1);
p2=polyfit(T,A,2);
X=linspace(T(1),T(end));
Y1=polyval(p1,X);
Y2=polyval(p2,X);
plot(X,Y1,’b’,X,Y2,’r’,T,A,’g*’)
.
6.2.2 A fit parancs
Egyik legfontosabb Matlab parancsa a fit parancs, mely a Curve Fitting Toolbox eleme. Használata:
F=fit(X,Y,fittype),
48
-
ahol a fittype paraméterben azt tudjuk kiválasztani, hogy milyen függvénycsaládból szeretnénk
megkeresni a legjobban közeĺıtőt. Legfontosabb értékei:
poly1: elsőfokú polinomok osztálya
poly2: másodfokú polinom osztálya
... egészen 9-ig
exp1: a · exp(b · x) alakú függvényekexp2 : a · exp(b · x) + c · exp(d · x) alakú függvényekfourier1: a+ b · sin(p · x) + c · cos(p · x) alakú függvényekfourier2: a+ b · sin(p · x) + c · cos(p · x) + e · sin(2p · x) + f · cos(2p · x) alakú függvények... egészen 8-ig
power1: a · xb alakú függvényekpower2: a · xb + c alakú függvények.
Továbbá lehet még ’cubicspline’, ’smoothingspline’, ’linearinterp’, ’pchipinterp’...stb.
A visszatérési értéke egy úgynevezett cfit struktúra. Ezzel a következő műveleteket tudjuk
például végrehajtani:
plot(F) - a görbe ábrázolása
plot(F,X,Y) - a kiindulási pontokkal együtt ábrázolja a görbét
feval(F,x) - a függvény kiértékelése az x pontban
integrate(F,xdata,x0) - integrálja a függvényt az xdata pontjaiban az x0 kezdőponttól kezdve
differentiate(F,x) - a függvény deriváltja az x pontban.
7 Numerikus differenciálás
7.1 Numerikus differenciálás a diff paranccsal
A diff paranccsal egy adott függvényértékekből álló vektor véges differeniáit tudjuk meghatározni.
Vagyis ha adott azX = [X(1), X(2), . . . X(n)] vektor, akkor a diff(X) parancs visszatérési értéke
Y = [X(2)−X(1), X(3)−X(2), . . . , X(n)−X(n− 1)]
elsőrendű véges differencia vektor.
Magasabb rendű differenciák számı́tására is van lehetőség a diff paranccsal. Egy második
paraméterben átadhatjuk neki, hogy hanyadrendű differenciát szeretnénk számolni: diff(X,m).
49
-
A derivált közeĺıtő meghatározására a következőképpen tudjuk használni a diff parancsot. Ah-
hoz, hogy a véges differenciából közeĺıtő első derivált legyen, a differenciát osztanunk kell a
lépésközzel:
f ′(x0) ≈f(x1)− f(x0)
x1 − x0.
Ennek megvalóśıtása a Matlab-ban a következő lehet
h = 0.001;
X = -pi:h:pi;
f = sin(X);
d1 = diff(f)/h;
d2 = diff(Y)/h;
ahol d1 és d2 az első-, illetve másodrendű differencia.
7.2 Numerikus gradiens a gradient paranccsal
Gradiensnek nevezzük egy f : Rn → R többváltozós függvény deriváltját, vagyis a parciálisderiváltakból álló vektort, azaz
grad f(x) = f ′(x) =
(∂f
∂x1, . . . ,
∂f
∂xn
).
A gradiens közeĺıtő értékét is meghatározhatjuk véges differenciák seǵıtségével. Tekintsünk egy
kétváltozós példát. Legyen f : [a, b] × [c, d] → R és legyenek x1, . . . , xn és y1, . . . , ym az [a, b],illetve a [c, d] intervallumok egy-egy felosztása. Ekkor a belső pontokban a gradiens értéke
közeĺıthető centrális differenciák seǵıtségével, vagyis
∂f
∂x(xi, yj) ≈
f(xi+1, yj)− f(xi−1, yj)xi+1 − xi−1
,
∂f
∂y(xi, yj) ≈
f(xi, yj+1)− f(xi, yj−1)yj+1 − yj−1
.
A rács peremén lévő pontokban egyoldali differenciák seǵıtségével közeĺıthetjük a deriváltakat,
például az (x1, yj) alakú pontokban, ahol j = 1, . . . ,m
∂f
∂x(x1, yj) ≈
f(x2, yj)− f(x1, yj)x2 − x1
.
A gradiens Matlab-megvalóśıtása a gradient parancs seǵıtségével történik. A
50
-
[d1F,d2F]=gradient(F)
parancs visszaadja az F mátrix (függvény) közeĺıtő gradiensének értékét minden pontban 1
lépésközű rácsbeosztást feltételezve. A
[d1F,d2F]=gradient(F,h)
parancs visszaadja az F mátrix (függvény) közeĺıtő gradiensének értékét minden pontban h
lépésközű rácsbeosztással számolva mindkét irányban, mı́g a
[d1F,d2F]=gradient(F,hx,hy)
parancs visszaadja az F mátrix (függvény) közeĺıtő gradiensének értékét minden pontban hx
lépésközű rácsbeosztással számolva az x irányban és hy lépésközűvel az y irányban.
Többváltozós függvények közeĺıtő gradiensének numerikus közeĺıtése és ennek Matlab-megvalóśıtása
a fentiekkel analóg.
Példa: legyen f : [0, 1]× [3, 4]→ R, f(x, y) = x2 + y2 + xy.
h=0.01;
x=0:h:1;
y=3:h:4;
[X,Y]=meshgrid(x,y);
F=X.∧2+Y.∧2+X.*Y;
[dx,dy]=gradient(F,h);
Ha szeretnénk megjeleńıteni a függvényünket és a gradiensvektorokat minden pontban, akkor
azt a következőképpen tehetjük meg:
figure
contour(X,Y,F)
hold on
quiver(X,Y,dx,dy)
hold off
Itt a quiver parancs két dimenziós vektormező ábrázolására szolgál:
quiver(x,y,u,v)
megjeleńıti az (x,y) koordinátájú pontokban az (u,v) koordinátákkal rendelkező vektort. Itt
x,y,u,v azonos hosszúságú vektorok.
A contour paranccsal úgynevezett kontúrplotot tudunk késźıteni, vagyis egy kétváltozós valós
51
-
értékű függgvény bizonyos kontúrvonalait tudjunk ábrázolni. Kontúrvonalnak olyan halma-
zokat értünk az értelmezési tartományban, ahol a függvény konstans értéket vesz fel. Például az
f(x, y) = x2+y2 függvénynek a c = 4 értékhez tartozó kontúrvonala az {(x, y) ∈ R2 : x2 + y2 = 4}halmaz, vagyis az origó középpontú, 2 sugarú kör. (Ennek a függvénynek minden kontúrvonala
origó középpontú kör lesz.) A contour parancs a különböző értékekhez tartozó kontúrvonalakat
kiszinezi annak megfelelően, hogy ott nagy vagy kicsi a függvéynértékét, ı́gy képet kaphatunk
a függvény alakjáról.
7.3 Polinomok numerikus deriváltja a polyder paranccsal
A polinomokat Matlab-ban az együtthatóik vektorával ábrázolunk, vagyis a p(x) = 2x2+3x+5
polinom a p = [2, 3, 5] vektorként van megadva. A polyder parancs visszaadja ezen polinom
deriváltját polinomként, azaz vektorként, vagyis visszaadja a p′(x) = 4x + 3 polinomot dp =
[4, 3] vektorként.
p=[2,3,5];
dp=polyder(p);
A polyder parancs seǵıtségével lehetőségünk van polinomok szorzatának és hányadosának a
deriváltját kiszámolni. A
d=polyder(p1,p2)
parancs visszaadja p1 · p2 szorzatpolinom deriváltját, mı́g a
[d1,d2]=polyder(p1,p2)
parancs visszaadja a p1p2
hányados d1d2
alakú deriváltját. (Azaz d1 = p1′ ·p2−p1 ·p2′ és d2 = p22.)
8 Numerikus integralas
8.1 Numerikus integrálás a trapz paranccsal
A trapz parancs az úgynevezett trapéz-szabály alkalmazásával számolja ki egy adott függvény
közeĺıtő integrálját. Egy adott f függvény görbéje alatti területet több trapéz terültének
összegével közeĺıtjük. A trapéz-szabály képlete egyenközűbeosztás esetén:
∫ ba
f(x) dx ≈ b− a2n
(f(x0) + 2 · f(x1) + · · ·+ f(xn−1) + f(xn)) ,
52
-
ahol x0 = 0, xn = b és xk = a +b−an· k az [a, b] intervallum egyenközű beosztása, ahol
k = 1, . . . , n.
.
Megvalóśıtása: az f függvényt szeretnénk integrálni az [a, b] intervallum felett. Ekkor el kell
késźıtenünk az [a, b] egy X beosztását, majd ezen pontokhoz elkésźıtjük azt az Y vektort, mely
az f függvénynek az X vektor elemein felvett értékeit tartalmazza. Az X és Y vektorokat kell
átadnunk a trapz függvénynek.
Példa: az f(x) = x2 + sin(x) függvény integrálja a [0, 10] intervallum felett:
X=linspace(0,10);
Y=X.∧2 + sin(X);
t=trapz(X,Y)
vagy
f=@(x)x.∧2 + sin(x);
Y=f(X);
Ha ugyanazon intervallum felett több kifejezést is szeretnénk integrálni egyszerre, akkor a
megfelelő függvényértékekből álló mátrixot is átadhatjuk a trapz parancsnak:
Példa: az f1(x) = x, f1(x) = x2, f1(x) = x
3 függvények integrálja a [0, 10] intervallum felett:
X=linspace(0,10);
Y1=X;
Y2=X.∧2;
Y3=X.∧3;
Y=[Y1’,Y2’,Y3’];
t=trapz(X,Y)
53
-
A trapz paranccsal többváltozós függvéynek integrálját is ki tudjuk számı́tani. Ekkor egymásba
ágyazott trapz parancsokat kell használnunk.
Példa: határozzuk meg az f(x, y) = x · y függvény integrálját az [1, 2]× [3, 4] téglalap felett.
x=linspace(1,2);
y=linspace(3,4);
[X,Y]=meshgrid(x,y);
Z=X.*Y;
t=trapz(y,trapz(x,Z,2));
A meshgrid parancs lényegében elkésźıti a [1, 2]×[3, 4] téglalap egy rácsbeosztását (külön tárolvaaz x, és külön az y koordinátákat az X és Y mátrixokban). A függvényt a Z=X.*Y parancs
értékeli ki a rács pontjaiban. A trapz(x,Z,2) parancs meghatározza minden [3, 4]-beli osztópont
esetén az x szerinti integrált a [1, 2] intervallum felett, és visszaad egy vektor. Majd ezen értékek
seǵıtségével meghatározzuk az y szerinti integrált.
8.2 Numerikus integrálás a cumtrapz paranccsal
A cumtrapz parancs szintén a trapéz-szabály alkalmazásával számol integrálközeĺıtőt, de nem
csak a végeredményt ı́rja ki, hanem kumulat́ıvan az egyes kis trapézok területét is. Azaz pl.
az alábbi ábrán látható beosztás és jelölések esetén az alábbi vektort adná vissza a cumtrapz
parancs:
[T1, T1 + T2, T1 + T2 + T3, T1 + T2 + T3 + T4, T1 + T2 + T3 + T4 + T5].
.
Szintaktikája megegyezik a trapz parancs szintaktikájával, azaz
X=linspace(0,10,5);
54
-
Y=X.∧2 + sin(X);
t=cumtrapz(X,Y).
Ennél a parancsnál is van lehetőség vektorértékű függvények és többdimenziós függvények in-
tegrálására.
8.3 Numerikus integrálás az integral paranccsal
Az integral parancs bonyolultabb numerikus módszerek seǵıtségével számolja ki egy adott
függvény közeĺıtő integrálját. Át kell adni ennek a parancsnak az integrandust és azon in-
tervallum végpontjait, ahol integrálni szeretnénk.
Például a fenti f függvényre:
f=@(x)x.∧2 + sin(x);
integral(f,0,10);
Itt van lehetőségünk bizonyos paraméterek beálĺıtására is, melyekkel a közeĺıtés pontosságát
szabályozhatjuk. Beálĺıthatjuk az úgy nevezett abszolút, illetve relat́ıv hiba felső korlátját. (Ha
I =∫ baf(x) dx az integrál pontos értéke, q a közeĺıtő érték, akkor abszolút hibának nevezzük
az |I − q| eltérést, mı́g ennek normált változatát, azaz az |I−q||q| értéket relat́ıv hibának.)
integral(f,0,10,’RelTol’,0,’AbsTol’,1e-12)
A integral parancs seǵıtségével számolhatunk végtelen intervallum feletti integrálokat is, ennek
megvalóśıtása:
f = @(x) exp(-x.∧2).*log(x).∧2;
q = integral(f,0,Inf)
8.4 Többváltozós függvények numerikus integrálása az integral2 és
integral3 parancsokkal
Kétváltozós függvények integrálját az integral2, háromváltozós függvényekét az integral3 parancs
seǵıtségével tudjuk meghatározni közeĺıtőleg. A szintaktika hasonló az integral parancs szin-
taktikájához.
Példa: határozzuk meg közeĺıtőleg az∫ 10
∫ 2−1 sin(x+y) dy dx és
∫ 10
∫ 2−1
∫ 43
sin(x+y+z) dz dy dx
55
-
értékeket.
f=@(x,y) sin(x+y);
g=@(x,y,z) sin(x+y+z);
t1=integral2(f,0,1,-1,2);
t2=integral3(g,0,1,-1,2,3,4);
8.5 Polinomok integrálása a polyint paranccsal
A polinomokat Matlab-ban az együtthatóik vektorával ábrázolunk, vagyis a p(x) = 3x2+2x+5
polinom a p = [3, 2, 5] vektorként van megadva. A polyint parancs visszaadja ezen polinom
határozatlan integrálját poinomként, azaz vektorként, vagyis visszaadja a p′(x) = x4 + x2 + 5x
polinomot dp = [1, 1, 5, 0] vektorként.
p=[3,2,5];
ip=polyint(p);
A határozott integrál kiszámı́táshoz használnunk kell ”manuálisan” a Newton-Leibniz formulát,
azaz az ∫ ba
p(x) dx = q(b)− q(a), ha q(x) =∫p(x) dx
képletet. Vagyis
I=diff(polyval(ip,[a,b])).
Itt a polyval parancs kiértékeli az ip polinomot az a és b pontokban, és visszaadja az [ip(a),ip(b)]
vektort, majd a diff parancs kiszámolja ezen vektor elsőrendű differenciáját, azaz az ip(b)-ip(a)
értéket.
9 A Matlab adatszerkezetei
9.1 Vektorok, mátrixok
Másik fejezetben.
56
-
9.2 Szöveges adatok
Szövegek ábrázolására két lehetőségünk van: használhatunk karaktervektorokat, illetve sztringeket
(sztring tömböket). Az előbbi használata akkor javasolt, ha egyszerű szövegekkel szeretnénk
dolgozni, az utóbbi akkor, ha szöveges adatokat szeretnénk feldolgozni.
9.2.1 Karaktervektorok
A karaktervektorok (character arrays) karakterekből (char) álló tömbök.
Karaktervektorok létrehozása
• Létrehozásának legegyszerűbb módja, ha aposztrófok, azaz ’-jelek közé ı́rjuk a ḱıvánt szöveget:
s=’Első feladat’;
Ha a szövegünk maga ’-jelet tartalmaz, akkor azt dupla-aposztrófként (’ ’-ként) tudjuk meg-
valóśıtani.
• Már meglévő karaktervektorok összefűzésével az strcat parancs seǵıtségével:
s1=’Első’;
s2=’ feladat’;
s=strcat(s1,s2);
Az strcat függvény lényegében tetszőleges számú argumentumot fogad. Az argumentumai végén
álló üres karaktereket (szóközöket) elhagyja. (Vagyis a fenti példában
s1=’Első ’;
s2=’feladat’;
s=strcat(s1,s2);
végeredménye ’Elsőfeladat’ lett volna.)
• Konverzióval más adatt́ıpusokból:
? a char függvény numerikus adatokból késźıt karaktervektort úgy, hogy minden számot az
adott karakter ASCII kódjának tekint.
char([74 55]); → ’J7’
? a num2str, int2str, mat2str parancsok számadatokat konvertálnak számokat ábrázoló karak-
terekké.
A num2str és mat2str 5 számjegyre kereḱıtve adják vissza a számot (a mantisszára vonatkozóan),
57
-
num2str(pi); → 3.1416,nmat2str(pi); → 3.1416,
illetve második argumentumként meg lehet adni a jegyek számát:
num2str(pi,8); → 3.1415927mat2str(pi,8); → 3.1415927.
Ha mátrixokra alkalmazzuk őket, akkor némi eltéréssel jeleńıtik meg a végeredményt:
mat2str([ eps, pi; pi eps]);
→ ’[2.22044604925031e-16 3.14159265358979;3.14159265358979 2.22044604925031e-16]’
mat2str([ eps, pi; pi eps],3); → ’[2.22e-16 3.14;3.14 2.22e-16]’
num2str([ eps, pi; pi eps]);→’2.2204e-16 3.1416’
’ 3.1416 2.2204e-16’
num2str([ eps, pi; pi eps],3);→’2.22e-16 3.14’
’ 3.14 2.22e-16’
Az int2str parancs egészre kereḱıtett értékkel tér vissza:
int2str(pi); → 3.
A konverziók ”megford́ıtása” is létezik: double(s), str2num..stb.
Műveletek karaktervektorokkal
• karaktervektorok összehasonĺıtása: az strcmp parancsal, mely egy logikai értékkel tér vissza:
strcmp(’alma’,’alabárd’); → 0 (hamis)
Az strncmp az első n karaktert hasonĺıtja össze:
strncmp(’alma’,’alabárd’,2); → 1 (igaz)
• keresés karaktervektorban: findstr paranccsal, két két karaktervektor közül a hosszabbankeresi a rövidebbet, és visszatér a megtalált kezdőpoźıciókkal:
findstr(’rododendron’,’od’) vagy findstr(’od’,’rododendron’) → 2 4.
• konverzió a kisbetűk és nagybetűk között:
upper(’Kiss József Tamás’) → KISS JÓZSEF TAMÁS
58
-
lower(’Kiss József Tamás’) → kiss józsef tamás
• Szavakra darabolás a split paranccsal:
s=’Első feladat’;
split(s) → ’Első’ ’feladat’ (cell array)
• Megjeleńıtés a képernyőn:
A disp parancs kíırja az összes karaktert, ahogy átadtuk.
Ha formázott szövegként az fprintf paranccsal szeretnénk kíıratni, akkor figyelembe kell venni,
hogy van néhány olyan karakter, aminek itt speciális szerepe van, ezért ha szövegként szeretnénk
megjeleńıteni őket, akkor azt más formában kell megtennünk.
’ helyett ’ ’
% helyett %%
\helyett \\
s=’Út\idő’;disp(s); → ’Út\idő’fprintf(s); → hibaüzenet (\i -t nem tudja értelmezni)
s=’Az út 10%-a’;
disp(s); → Az út 10%-afprintf(s); → Az út 10 (a végén nincs sortörés)
s=’Az út 10%%-a’;
disp(s); → Az út 10%%-afprintf(s); → Az út 10%-a (a végén nincs sortörés)
9.2.2 Sztringtömbök
Sztringtömbök használata akkor ajánlott, ha több szöveges adatot szeretnénk feldolgozni. Lét-
rehozása a legegyszerűbb esetben:
s=”Első feladat”;
59
-
s=[”Első feladat” ”Második feladat”; ”Harmadik feladat”,”Negyedik feladat”];
A karaktervektoroknál léırt függvényeknek lényegében mindegyike ugyanúgy használható sztringek
esetén is. Még az összehasonĺıtás is ’jól’ múködik a két adatt́ıpus között:
strcmp(’alma’,”alma”) → 1 (igaz)
Lényeges különbség abban van, hogy a sztringtömb alapegysége egy egész szöveg (azaz egy
sztring), mı́g a karaktervektoroké a karakter:
s=”Első feladat”;
z=’Első feladat’;
disp(size(s)); → 1×1disp(size(z)); → 1×12
s=[”Első feladat” ”Második feladat”; ”Harmadik feladat”,”Negyedik feladat”];
disp(size(s)); → 2×2
z=[’Első feladat’ ’Második feladat’; ’Harmadik feladat’,’Negyedik feladat’];
→ Dimensions of matrices being concatenated are not consistent.
Karaktervektort tudunk sztringgé konvertálni a string parancs seǵıtségével:
z=’Első feladat’;
s=string(z) → ”Első feladat”.
9.3 Többdimenziós tömbök
A többdimenziós tömbök neve array. (A mátrixok és vektorok is persze speciális tömbök.)
Létrehozásuk és használatuk nagymértékben megegyezik a vektorok és mátrixok létrehozásával
és használatával, csak a dimenziók száma több.
9.3.1 Hivatkozás többdimenziós tömbök elemeire, értékadás
Hasonlóan a mátrixokhoz az elemek indexelhetők, de most annyi indexet kell felsorolnunk,
ahány dimenziós a tömb:
A(2,1,3);
Értékadás:
A(2,1,3)=3;
60
-
A(:,1,2)=[1 2];
9.3.2 Többdimenziós tömbök létrehozása
• Beéṕıtett függvényekkel:
A=zeros(2,3,4,5); → négydimenziós csupa 0-kból álló tömb
A=ones(2,3,4,5); → négydimenziós csupa 1-ekből álló tömb
A=rand(2,3,4,5); → négydimenziós véletlenszámokból álló tömb
• Elemeinek a megadásával:
Ehhez először érdemes megalkotni egy üres tömböt a zeros paranccsal, ezután feltölteni a
szükséges helyeket értékekkel.
A=zeros(2,3,4); A(1,2,3)=6;
A(:,:,1)=[1 2 3; 4 5 6];
A(2,1:2,[2 4])=[ 1 6; 7 8];
→ A(:,:,1) =1 2 3
4 5 6A(:,:,2) =
0 0 0
1 7 0A(:,:,3) =
0 6 0
0 0 0A(:,:,4) =
0 0 0
6 8 0
Másik lehetőség, ha legelőször a minden dimenzió szerinti legnagyobb indexű elemnek adunk
értéket. Ilyenkor a Matlab létrehozza azt a legkisebb méretű tömböt, aminek léteznek a
megfelelő dimenziói. Például:
B(2,3,2)=7; → B(:,:,1) =0 0 0
0 0 0B(:,:,2) =
0 0 0
0 0 7
Ezekután ha olyan elemének adunk értéket, ami már létezik, akkor azt sima értékadásként
felüĺırja, ha pedig olyannak, ami nem létezik még, akkor a mátrixokhoz hasonlóan bőv́ıti a
tömböt a lehető legszűkebben úgy, hogy létezzen a hivatkozott elem. Például:
B(3,3,2)=8;→ B(:,:,1) =0 0 0
0 0 0
0 0 0
B(:,:,2) =
0 0 0
0 0 7
0 0 8
• Már meglévő vektorok, mátrixok, tömbök összefűzésével
? A korábban megismert összefűzési módok most is működnek:
A=zeros(2,2,2);
B=zeros(2,2,2);
A(:,:,1)=[1 2; 3 4]; A(:,:,2)=[5 6; 7 8]; B(:,:,1)=[-1 -2; -3 -4]; B(:,:,2)=[-5 -6;-7 -8];
61
-
C=[A B];
→ C(:,:,1) =1 2 −1 −23 4 −3 −4
C(:,:,2) =5 6 −5 −67 8 −7 −8
C=[A; B];
→ C(:,:,1) =
1 2
3 4
−1 −2−3 −4
C(:,:,2) =
5 6
7 8
−5 −6−7 −8
? Ezen felül itt használhatjuk a cat parancsot is (mátrixoknál is, csak ott azonos eredményt ad
a már megismert összefűzésekkel). Két tömböt fűz össze a megadott dimenzió mentén.
A(:,:,1)=[1 2; 3 4]; A(:,:,2)=[5 6; 7 8]; B(:,:,1)=[-1 -2; -3 -4]; B(:,:,2)=[-5 -6;-7 -8];
C=cat(1,A,B) azonos C=[A; B]-vel
C=cat(2,A,B) azonos C=[A B]-vel
C=cat(3,A,B) a harmadik dimenzió mentén fűz össze:
→ C(:,:,1) =1 2
3 4C(:,:,2) =
5 6
7 8C(:,:,3) =
−1 −2−4 −3
C(:,:,4) =−5 −6−7 −8
? A repelem paranccsal vektorokból késźıthetünk többdimenziós tömböket is: legyen v = [1 2 3],
ekkor
repelem(v,2,3,4);
létrehoz egy 3 dimenziós tömböt, mely minden vektorelem helyére egy 2 × 3 × 4-es konstanstömböt tesz, ahol a konstans az adott vektorelem. Ugyanez használható mátrixok és tömbök
elemeinek a megismétlésére is.
A repmat parancs nem elemenként ismétel, hanem az egész blokkot (vektort, mátrixot, tömböt)
ismétli meg, például
repmat(v,2,3,4).
9.3.3 Többdimenziós tömbökre vonatkozó függvények
• size(A) - a tömb mérete az egyes dimenziókban, olyan hosszú vektor, ahány dimenziós a tömb
• d=length(A) - a legnagyobb dimenzió hossza (d=max(size(A))
• ndims(A) - a dimenziók száma
• numel(A) - a tömbelemek száma
62
-
• reshape(A,v) - átméretezi a tömböt v-dimenziójú tömbbé (az elemszámnak meg kell egyeznie!)
• squeeze(A) - eltávoĺıtja az 1 hosszúságú dimenziókat
• min(A), (ill. max(A)) - a tömb legnagyobb (ill. legkisebb) eleme az első nem 1 hosszúságúdimenzió szerint. Egy olyan tömb lesz az eredmény, melynek ez a dimenziója 1.
• min(A,n), (ill. max(A,n))) - a tömb legnagyobb (ill. legkisebb) eleme az n. dimenzió szerint.Egy olyan tömb lesz az eredmény, melynek ez a dimenziója 1.
• min(A,’all’), (ill. max(A,’all’) - a tömb legnagyobb (ill. legkisebb) eleme (Matlab 2018b-től)
• min(A,B), (ill. max(A,B)) - két azonos méretű tömb összehasonĺıtása. Egy ugyanolyanméretű tömb lesz az eredmény, mint A és B.
• sum(A) - a tömb elemeinek az összege az első nem 1 hosszúságú dimenzió szerint. Egy olyantömb lesz az eredmény, melynek ez a dimenziója 1.
• sum(A,n) - a tömb elemeinek az összege az n. dimenzió szerint. Egy olyan tömb lesz azeredmény, melynek ez a dimenziója 1.
• sum(A,’all’), (ill. max(A,’all’) - a tömb elemeinek az összege (Matlab 2018b-től)
• sort(A,n) - a tömb elemeit rendezi sorba növekvőleg az n. dimenzió szerint. sort(A,1)=sort(A);
• sort(A,n,’descend’) - a tömb elemeit rendezi sorba csökkenőleg az n. dimenzió szerint.sort(A,1, ’descend’)=sort(A, ’descend’);
• Ahogy a vektoroknál és mátrixoknál is a matematikai függvények elemenként alkalmazhatóaktömbökre is, például abs, exp, sin, cos, tan, log.
9.3.4 Műveletek többdimenziós tömbökkel
A mátrixokra megismert elemenkénti műveletek itt is ugyanúgy használhatók, a nem ele-
menkénti műveletek, mint például a mátrix-mátrix szorzás, invertálás...stb nincsenek értelmezve.
9.4 Cellatömbök
A cellatömbök (cell array) struktúrájukat tekintve olyanok, mint a tömbök, de itt az egyes
elemek bármilyen Matlab-objektumok lehetnek. Az értékadás, hivatkozás, létrehozás logikáját
tekintve azonos a tömbökével. Szintaktikája természetesen eltérő.
63
-
9.4.1 Cellatömbök létrehozása
• Kapcsos zárójelek között az elemek felsorolásával:
c={1,[1 2; 3 4],’alma’; [1 2], 5 ’körte’}
• üres cellatömb létrehozása:
c=cell(2,3)
létrehoz egy 2× 3 dimenziós üres cellatömböt.
• konverzióval más adatt́ıpusokból:
? mátrixok feldarabolásával: például ha M =
−1 1 2 4 51 7 2 −4 6−3 3 −2 4 2−4 2 3 9 4
,
akkor C=mat2cell(A,[1, 3],[2,3]) egy 2× 2-es cellatömb lesz, elemeiC{1,1} = [-1, 1]C{1,2} = [2, 4,5]C{2,1} = [1, 7; -3,3;-4,2]C{2,2} = [2,-4,6;-2,4,2;3,9,4].
? egyéb struktúrákból: num2cell, struct2cell, table2cell.
9.4.2 Cellatömbök elemeire való hivatkozás, értékadás elemeknek
• Ha C={1,[1 2; 3 4],’alma’; [1 2], 5 ’körte’} egy meglévő cellatömb, akkor
d=C{1,2} → d=[1, 2; 3, 4];
• Részcellatömbök kiválasztása a mátrixokhoz hasonlóan (,)-zárójellel!
d=C(1:2,2) → d= 2× 1 cellarray.
Így a d=C(1,2) is cellatömb, és nem a benne tartalmazott mátrix!
• Ha olyan elemének adunk értéket egy cellának, ami nem létezik, akkor kibőv́ıti a cellát. Hanem létezett a cella, akkor létrehozza azt a legkisebb méretűt, aminek létezik a megfelelő indexű
eleme.
64
-
9.4.3 Cellatömbökre vonatkozó függvények
• celldisp - egy cella elemeinek a kíıratása
9.5 Struktúrák
A struktúrák (struct) a cellatömbökhöz hasonlóan különböző t́ıpusú adatok együtt-kezelésére
alkalmas. Egy struktúrának van neve és vannak névvel ellátott mezői. Például az egyetemi hall-
gatók nevét, neptunkódja