Matlab alapismeretek - Debreceni Egyetem Matematikai...

100
Matlab alapismeretek FazekasBorb´ala Debreceni Egyetem 2019 December 1

Transcript of Matlab alapismeretek - Debreceni Egyetem Matematikai...

  • 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