matlab alapismeretek - debreceni egyetem matematikai...

67
Matlab alapismeretek FazekasBorb´ala Debreceni Egyetem 2019 December 1

Upload: others

Post on 19-Oct-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

  • Matlab alapismeretek

    Fazekas Borbála

    Debreceni Egyetem

    2019

    December

    1

  • Tartalomjegyzék

    1 Vektorok 6

    1.1 Vektorok létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    1.1.1 Vektorok létrehozása az elemek megadásával . . . . . . . . . . . . . . . . 6

    1.1.2 Vektorok létrehozása már meglévő vektorokból . . . . . . . . . . . . . . . 6

    1.2 Hivatkozás vektorok elemeire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    1.3 Vektorokra vonatkozó egyszerűbb függvények . . . . . . . . . . . . . . . . . . . 7

    1.3.1 Manipulációs függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    1.3.2 Matematikai függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    1.4 Műveletek vektorokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2 Mátrixok 9

    2.1 Mátrixok létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.1.1 Mátrixok létrehozása az elemek megadásával . . . . . . . . . . . . . . . . 9

    2.1.2 Mátrixok létrehozása már meglévő vektorokból és mátrixokból . . . . . . 9

    2.1.3 Mátrixok létrehozása beéṕıtett függvényekkel . . . . . . . . . . . . . . . 10

    2.2 Hivatkozás mátrixok elemeire, értékadás . . . . . . . . . . . . . . . . . . . . . . 11

    2.3 Mátrixokra vonatkozó egyszerűbb függvények . . . . . . . . . . . . . . . . . . . 12

    2.3.1 Manipulációs függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    2.3.2 Matematikai függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    2.4 Műveletek mátrixokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    3 Ábrák késźıtése 14

    3.1 Kétdimenziós ábrák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    3.1.1 A plot alapparancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    3.1.2 Egyváltozós függvények ábrázolása a plot parancs seǵıtségével . . . . . . 15

    2

  • 3.1.3 A plot opciói . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    3.1.4 Az plot további opciói . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    3.2 Több függvény egy ábrában . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    3.3 Az ábrák további beálĺıtási lehetőségei . . . . . . . . . . . . . . . . . . . . . . . 21

    3.4 Több ábra megjeleńıtése egyszerre - a subplot parancs . . . . . . . . . . . . . . . 22

    3.5 Egyváltozós függvények ábrázolása az fplot parancs seǵıtségével . . . . . . . . . 24

    3.6 Háromdimenziós ábrák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    3.6.1 A surf alapparancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    3.6.2 Kétváltozós függvények ábrázolása az fsurf parancs seǵıtségével . . . . . 27

    3.7 Parametrizált görbék ábrázolása . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    3.7.1 Kétdimenziós parametrizált görbék . . . . . . . . . . . . . . . . . . . . . 29

    3.7.2 Háromdimenziós parametrizált görbék . . . . . . . . . . . . . . . . . . . 31

    3.8 Vektormezők ábrázolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    3.9 Kontúrvonalak ábrázolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    4 Függvényillesztés 35

    4.1 Interpoláció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    4.1.1 Spline interpoláció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    4.1.2 Lagrange-interpoláció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    4.2 Legkisebb négyezetes közeĺıtések . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    4.2.1 A fit parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    4.2.2 A polyfit parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    5 Numerikus differenciálás 39

    5.1 Numerikus differenciálás a diff paranccsal . . . . . . . . . . . . . . . . . . . . . 39

    5.2 Numerikus gradiens a gradient paranccsal . . . . . . . . . . . . . . . . . . . . . 40

    3

  • 5.3 Polinomok numerikus deriváltja a polyder paranccsal . . . . . . . . . . . . . . . 42

    6 Numerikus integralas 42

    6.1 Numerikus integrálás a trapz paranccsal . . . . . . . . . . . . . . . . . . . . . . 42

    6.2 Numerikus integrálás a cumtrapz paranccsal . . . . . . . . . . . . . . . . . . . . 44

    6.3 Numerikus integrálás az integral paranccsal . . . . . . . . . . . . . . . . . . . . 45

    6.4 Többváltozós függvények numerikus integrálása az integral2 és integral3 paran-

    csokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    6.5 Polinomok integrálása a polyint paranccsal . . . . . . . . . . . . . . . . . . . . . 46

    7 Lineáris egyenletrendszerek megoldása 46

    7.1 Direkt módszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    7.1.1 Az mldivide, avagy a \ parancs . . . . . . . . . . . . . . . . . . . . . . . 47

    7.1.2 Az lsqminnorm parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    7.1.3 A pinv parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    7.1.4 A linsolve parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    7.1.5 Megoldások mátrixfelbontások seǵıtségével . . . . . . . . . . . . . . . . . 50

    7.2 Iterat́ıv módszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    8 Differenciálegyenletek megoldása 53

    8.1 Differenciálegyenletek numerikus megoldása . . . . . . . . . . . . . . . . . . . . 53

    8.1.1 Elsőrendű egyenletek numerikus megoldása . . . . . . . . . . . . . . . . . 53

    8.1.2 Egyenletrendszerek numerikus megoldása . . . . . . . . . . . . . . . . . . 55

    8.1.3 Magasabb rendű egyenletek megoldása . . . . . . . . . . . . . . . . . . . 56

    8.1.4 További információ a megoldásról és a megoldás menetéről . . . . . . . . 57

    8.2 Peremértékproblémák megoldása . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    9 Általános egyenletek, egyenletrendszerek megoldása 59

    4

  • 9.1 Az alapcsomag parancsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    9.1.1 Az fzero parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    9.1.2 Az roots parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    9.2 A szimbolikus csomag elemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    9.2.1 A solve parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    9.2.2 A root parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    9.3 Az Optimization Toolbox elemei . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    9.3.1 Az fsolve parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    5

  • 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)

    6

  • ? 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)

    7

  • • 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.

    8

  • 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

    9

  • • 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

    10

  • • 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

    11

  • • É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á

    12

  • • 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

    13

  • • 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 Ábrák késźıtése

    3.1 Kétdimenziós ábrák

    3.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:

    x=[1 2 3 4];

    y=[2 4 2 0];

    plot(x,y);

    14

  • .

    Ha nem adjuk meg az x vektort, akkor a Matlab az x = [1, 2, . . . , n] értékekkel dolgozik.

    3.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;

    plot(x,y);

    15

  • 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);

    3.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

    Parancsa, ha például zöld vonallal szeretnénk ábrázolni a függvény görbéjét: plot(x,y,’g’);

    16

  • • 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:

    17

  • . - 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- -’);

    18

  • 3.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

    3.2 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’);

    19

  • .

    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

    20

  • ? 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];

    3.3 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

    21

  • • ylabel(’y-tengely neve’) - az y-tengely mellé ı́rja a ḱıvánt nevet

    • 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

    3.4 Több á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);

    22

  • plot(x1,y1,’r’)

    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.

    23

  • 3.5 Egyváltozós függvények ábrázolása az fplot parancs seǵıtségével

    Másik lehetőség függvények ábrázolására az fplot parancs. Ezzel Matlab-függvényeket tudunk

    ábrázolni. Egy egyváltozós függvény szintaktikája Matlab-ban a következő:

    f=@(x) sin(x)+cos(x);

    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

    .

    24

  • 3.6 Háromdimenziós ábrák

    3.6.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);

    25

  • .

    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

    26

  • 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’)

    .

    3.6.2 Kétváltozós 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, például:

    f = @(x,y) sin(x)+cos(y);

    Második paraméterként pedig azt az intervallumot, ahol ábrázolni szeretnénk a függvényt,

    [xmin xmax ymin ymax] alakban.

    27

  • 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);

    fsurf(f1,[-2 2 -5 5],’y’)

    hold on

    f2 = @(x,y) sin(x)+cos(y);

    fsurf(f2,[-2 2 -5 5],’b’)

    28

  • hold off

    .

    3.7 Parametrizált görbék ábrázolása

    3.7.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);

    plot(x,y);

    29

  • .

    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

    30

  • .

    3.7.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);

    31

  • 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]);

    32

  • .

    3.8 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);

    .

    3.9 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}

    33

  • 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)

    .

    34

  • 4 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].

    4.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.

    4.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 struktúrájában.

    Például x=4:14 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

    dim: 1

    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

    35

  • 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.

    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:

    36

  • 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);

    .

    4.1.2 Lagrange-interpoláció

    Nincsen beéṕıtett Matlab-függvény, amely megvalóśıtja, de mivel ismert és egyszerű a képlete,

    ı́gy könnyen leprogramozható.

    p(x) = y1 ·(x− x2) · · · (x− xn)

    (x1 − x2) · · · (x1 − xn)+ · · ·+ yn ·

    (x− x1) · · · (x− xn−1)(xn − x1) · · · (xn − xn−1)

    .

    37

  • 4.2 Legkisebb négyezetes közeĺıtések

    4.2.1 A fit parancs

    Egyik legfontosabb Matlab parancsa a fit parancs. Használata:

    F=fit(X,Y,fittype),

    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.

    4.2.2 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ő

    38

  • 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*’)

    .

    5 Numerikus differenciálás

    5.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).

    39

  • 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.

    5.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

    40

  • [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], 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

    41

  • é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.

    5.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.)

    6 Numerikus integralas

    6.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)) ,

    42

  • 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)

    43

  • 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.

    6.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);

    44

  • 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.

    6.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)

    6.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

    45

  • é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);

    6.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.

    7 Lineáris egyenletrendszerek megoldása

    A lineáris egyenletrendszerek általános alakja a következő: legyen adott az A ∈ Rm×n mátrixés a b ∈ Rm vektor. Keressük azt az x ∈ Rn vektort, mely teljeśıti az

    Ax = b

    egyenletet.

    Vizsgáljuk először matematikai szempontból a kérdést.

    46

  • Ha az A mátrix négyztes (n = m), akkor két eset fordulhat elő. Ha A reguláris (vagyis deter-

    minánsa nem 0), akkor a fenti egyenletnek minden b esetén létezik egyértelmű megoldása. Ha

    A nem reguláris, akkor a fenti egyenletnek vagy egyetlen megoldása sincs, vagy van megoldása,

    de az nem egyértelmű.

    Ha az A mátrix nem négyzetes, akkor a probléma vagy alul-, vagy túldeterminált attól függően,

    hogy n > m vagy n < m. Az első esetben kevesebb egyenletünk van, mint ahány ismeretlenünk,

    a másodikban több.

    Nézzük most, hogy a problémának milyen megoldási lehetőségei vannak a Matlab-ban.

    7.1 Direkt módszerek

    Direkt módszernek azon eljárásokat nevezzük, melyekkel a lineáris egyenletrendszerünk megoldását

    (a kereḱıtési hibktól eltekintve) pontosan számoljuk ki véges sok lépésben. Ilyen módszerek alka-

    lmasak kisméretű (nagyjából 500–tól kisebb sor-, illetve oszlopdimeziójú) márixokra vonatkozó

    egyenletrendszerek megoldására. A legfontosabb beéṕıtett módszerek a Matlab-ban a következők.

    7.1.1 Az mldivide, avagy a \ parancs

    A \ parancs az mldivide parancsnak a rövidebb ı́rásmódú változata.

    Az mldivide parancs szintaktikája a következő:

    A=[ 1 2 3; 4 5 6; 7 8 9];

    b=[2 4 7];

    x=A\b;vagy

    x=mldivide(A,b);

    Ekkor x az egyenlet egyértelmű megoldása, ha az létezik. Ha az A mátrix szinguláris (vagyis

    nem reguláris, determinánsa 0), vagy majdnem szinguláris (nagyon nagy a kond́ıciószáma),

    akkor a Matlab egy figyelmeztetést ad: ’Warning: Matrix is close to singular or badly scaled.

    Results may be inaccurate. RCOND = 4.625929e-18.’ (Itt az RCOND érték a kond́ıciószám

    reciproka, ami nagy kond́ıciószám esetén kicsi érték lesz.) Viszont ennek ellenére továbbszámol

    egy megoldást. Ha a megoldás nem létezik, akkor a visszakapott x vektor elemei között meg-

    jelennek az Inf és NaN értékek. (inf=infinity=végtelen, NaN=not a number=nem szám, ez

    például 0-val való osztás esetén fordulhat elő.)

    47

  • Az mldivide parancs a háttérben egy komplex elemzésnek veti alá az A mátrixot. Annak

    függvényében, hogy milyen tulajdonságait fedezi fel, dönt az egyik vagy másik lineáris egyen-

    letrendszer megoldó algoritmus mellett. Ezen algoritmus egy részlete:

    1. kérdés: A négyzetes mátrix?

    Ha nem −→ QR-felbontásHa igen −→

    2. kérdés: A háromszög alakú?

    Ha igen −→ háromszög alakú mátrixra vonatkozó algoritmusHa nem −→

    3. kérdés: A szimmetrikus?

    Ha igen −→ LU-felbontás (illetve Hessenberg alak esetén más)Ha nem −→

    4. kérdés: A minden diagonális eleme azonos előjelű?

    Ha igen −→ CholeskyHa nem (vagy ha Cholesky sikertelen) −→ LDL-felbontás.

    ?Ha nincs megoldása, akkor a lehető legjobb, legkisebb négyzetes közeĺıtését adja a problémának,

    de erről nem ad hibaüzenetet, csak egy figyelmeztetést: ”The matrix is badly scaled or nearly

    singular.”

    ?Ha több megoldása is van, akkor a lehetséges megoldások közül ad vissza egyet. Erről semmi-

    lyen üzenetet nem küld.

    7.1.2 Az lsqminnorm parancs

    Az lsqminnorm parancs (Least Squares Minimal Norm - legkisebb négyzetek módszere norma

    minimalizálással) az Ax = b egyenlet legkisebb négyzetes közeĺıtő megoldását adja, vagyis

    minimalizálja az ‖ax− b‖ értéket. Ha ennek a problémának több megoldása is van, akkor a sokmegoldás közül azt az egy x vektort adja vissza, melynél az ‖x‖ norma minimális.

    Az lsqminnorm parancs szintaktikája a következő:

    A=[ 1 2 3; 4 5 6; 7 8 9];

    b=[2 4 7];

    x=lsqminnorm(A,b);

    48

  • 7.1.3 A pinv parancs

    A pinv parancs meghatározza egy mátrix úgynevezett pszeudo-inverzét. Ez egy olyan mátrixot

    jelent, mely az inverz mátrix általánośıtása, megőrzi annak bizonyos lényeges tulajdonságait,

    azonban nem csak az invertálható mátrixok esetén létezik, hanem minden mátrix esetén, és

    mindig egyértelmű. Használatával lineáris egyenletrendszerek (közeĺıtő) megoldása határozható

    meg a következőképpen:

    A=[ 1 2 3; 4 5 6; 7 8 9];

    b=[2 4 7];

    x=pinv(A)*b;

    Ha ennek a problémának több megoldása is van, akkor a sok megoldás közül azt az egy x vektort

    adja vissza, melynél az ‖x‖ norma minimális. A megoldás kiszámı́tása a pinv paranccsal kevésbéhatékony, mint az lsqminnorm paranccsal.

    7.1.4 A linsolve parancs

    A linsolve parancs négyzetes mátrixok esetén elkésźıti az úgynevezett LU-felbontását az A

    mátrixnak, és az erre vonatkozó algoritmussal számolja ki a megoldást. Nem négyzetes mátrixok

    esetén QR-felbontást késźıt és azzal számol. Egy figyelmeztetést küld, ha az A mátrix szin-

    guláris vagy rosszul kond́ıcionált. Kiszámolja a kond́ıciószámot (numerikusan), és ennek re-

    ciprokát is kíırja a figyelmeztetésben. Második visszatérési értékként is megkapjuk a kond́ıciószámot

    (a lenti példában az r érték). Példa:

    A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];

    b=[6 8 10 12]’;

    x=linsolve(A,b);

    [x r] =linsolve(A,b);

    Van lehetőség egy harmadik paraméterben átadni a linsolve parancsnak, hogy az A mátrix

    milyen speciális tulajdonságokkal rendelkezik, ı́gy ennek megfelelően tudja kiválasztani az

    optimális algoritmust. A lehetséges tulajdonságok a következők lehetnek például: LT-alsó

    háromszög mátrix (lower triangle), UT-felső háromszög mátrix (upper triangle), SYM - szim-

    metrikus mátrix, POSDEF - pozit́ıv definit mátrix. Átadásának menete a következő:

    opts.LT=true;

    x=linsolve(A,b,opts);

    49

  • Előnye az mldivide paranccsal szemben az, hogy mivel nem elemzi a mátrixot olyan alaposan,

    nem válogat az algoritmusok között, ezért gyorsabb. Azonban ugyanez a tulajdonsága hátrányt

    is jelenthet. Ugyanis nem vizsgálja meg, hogy a mátrixunk teljeśıti-e az átadott tulajdonságot,

    ı́gy a nem megfelelő esetben is használ bizonyos algoritmusokat, ı́gy hibás eredményt adhat.

    Ezért a tulajdonságok beálĺıtását csak akkor használjuk, ha egészen biztosak vagyunk abban,

    hogy az adott tulajdonságok valóban teljesülnek.

    7.1.5 Megoldások mátrixfelbontások seǵıtségével

    (i) LU-felbontás: az lu parancs előálĺıtja egy adott A mátrix LU-felbontását, azaz azt az L

    alsóháromszög mátrixot és az U felsőháromszög mátrixot, melyekre fennáll A = L ·U . Szintak-tikája és használata lineáris egyenletrendszerek megoldására:

    [L,U]=lu(A);

    y=L\b;x=U\y;

    (ii) Cholesky-felbontás: a chol parancs előálĺıtja egy adott szimmetrikus pozit́ıv definit Amátrix

    Cholesky-felbontását, azaz azt az R felsőháromszög mátrixot, melyre fennáll A = RT · R.Szintaktikája és használata lineáris egyenletrendszerek megoldására:

    R=chol(A);

    y=R′\b;

    x=R\y;

    Használata során arra kell figyelni, hogy a mátrix szimmetrikus és pozit́ıv definit legyen. Ha

    a mátrix szimmetrikus, de nem pozit́ıv definit, akkor hibaüzenetet kapunk. A pzit́ıv definitség

    ellenőrzésére a chol parancs visszaad egy flag értéket, mely 0 a pozit́ıv definit esetben, és nem

    nulla egyébként:

    [R,flag]=chol(A);

    Ha ebben a formában adjuk ki a parancsot, akkor nem kapunk hibaüzenetet a nem pozit́ıv

    definit esetben, de nem számolja ki az R mátrixot.

    Ha nem szimmetrikus a mátrix, akkor csak a felső háromszög részével számol, és ezt nem jelzi,

    erről nem ad hibaüzenetet.

    (iii) QR-felbontás: a qr parancs előálĺıtja egy adott A mátrix QR-felbontását, azaz azt a Q

    ortogonális mátrixot és az R felsőháromszög mátrixot, melyekre fennáll A = Q·R. Szintaktikája

    50

  • és használata lineáris egyenletrendszerek megoldására:

    [Q,R]=qr(A);

    y=Q\b;x=R\y;

    (iv) a decomposition parancs előálĺıtja azt a felbontását az A mátrixnak, mely leginkább

    megfelelő, és ezt a vaisszadott értéket hazsnálhatjuk a lineáris egyenletrendszerünk megoldására.

    Visszaadott értéke nem mátrix, hanem úgynevezett decomposition t́ıpus. Használata:

    dA = decomposition(A);

    x= dA \b;

    Használatának előnye, hogy nem kell a megfelelő felbontást magunknak kitalálni, majd manuálisan,

    lépésről lépésre megoldani az egyenletrendszert. De emellett van lehetősünk a felbontás fajtáját

    magunknak megválasztani a következőképpen:

    dA=decomposition(A,’lu’);

    7.2 Iterat́ıv módszerek

    Iterat́ıv módszerek esetén a lineáris egyenletrendszerünk megoldását nem (a kereḱıtési hi-

    bktól eltekintve) pontosan számoljuk ki véges sok lépésben, mint a direkt módszerek esetén,

    hanem általában csak közeĺıtőleg. Az eljárások lényege, hogy meghatározunk egy (végtelen)

    (xm)m∈N vektorsorozatot kiindulva egy x0 kezdővektorból valamilyen iterációs szabály szerint,

    azaz definiáljuk az xm = ϕ(xm−1, b), m = 1, 2, . . . vektorsorozatot. A kedvező esetben ezen

    vektorsorozat határértéke a valódi megoldás. (Sok esetben már véges sok lépésben konstanssá

    válik a sorozat és felveszi a megoldás valódi értékét.) Azonban a határértéket általában nem

    tudjuk meghatározni. Ehelyett a sorozat elemeire vizsgálunk valamilyen megállási kritériumot,

    mely legtöbbször az ‖Axm− b‖ hiba előre megadott küszöbérték alá csökkenése. Ha elértük ezta küszöbértéket, akkor az iterációt megálĺıtjuk és visszaadjuk az aktuális xm vektort, mint az

    egyenlet közeĺıtő megoldását.

    A Matlab-ban sok iterat́ıv módszert implementáltak. Ezek közül kiemeljük a következőket:

    pcg- preconditioned conjugate gradient method,

    bicg - BiConjugate Gradients Method,

    bicgstab - BiConjugate Gradients Stabilized Method,

    cgs - Conjugate Gradients Squared Method,

    51

  • gmres - Generalized Minimum Residual Method,

    minres - Minimum Residual Method.

    Szintaktikájuk hasonló, az alapparancs: x=parancs(A,b), azaz például x=pcg(A,b).

    Ezen felül minden fenti eljárás esetén van lehetőség beálĺıtani több paramétert is, melyek közül

    kiemeljük:

    tol - toleranciaérték, mekkora hibát fogadunk el. A default értéke 10−6,

    maxit - maximum number of iterations, azaz a megtett iterációs lépések maximális száma,

    M - precond́ıcionáló mátrix,

    M1, M2 - precond́ıcionáló mátrixok, melyek a fenti M mátrixot adják M = M1 ·M2 alakban.restart- csak a gmres parancs esetén, azt adja meg, hogy hány lépésenként ind́ıtjuk újra az

    iterációt.

    Így az alábbi lehetséges formában használhatjuk még a parancsainkat, a pcg parancs példáján:

    pcg(A,b,tol)

    pcg(A,b,tol,maxit)

    pcg(A,b,tol,maxit,M)

    pcg(A,b,tol,maxit,M1,M2),

    illetve a gmres esetén

    gmres(A,b,restart)

    gmres(A,b,restart,tol)

    gmres(A,b,restart,tol,maxit)

    gmres(A,b,restart,tol,maxit,M)

    gmres(A,b,restart,tol,maxit,M1,M2).

    Van lehetőség az x vektoron ḱıvül több információt is szerezni visszatérési értékként. Ezek a

    lehetőségek az alábbiak:

    flag - jelző, mely azt jelzi, hogy az iteráció sikeres volt-e. Értéke:

    flag=0, ha sikeres volt az iteráció, vagyis konvergált a megadott ’tol’ tolerancián belül

    legfeljebb

    ’maxit’ számú lépésben,

    flag=1, ha megtettünk ’maxit’ lépést, de nem konvergált az iteráció,

    flag=2, ha az M prekond́ıcionáló mátrix rosszul kond́ıcionált,

    flag=3, ha az iteráció konstanssá vált.

    52

  • relres - relat́ıv reziduum (hiba), azaz ‖Ax−b‖‖b‖ ,

    iter - a megtett iterációs lépésszám. (gmres esetén a restartok számát is visszaadja.)

    resvec - visszadja minden lépés esetén a reziduumot(hibát), azaz az ‖Ax− b‖ értékeket.

    8 Differenciálegyenletek megoldása

    8.1 Differenciálegyenletek numerikus megoldása

    8.1.1 Elsőrendű egyenletek numerikus megoldása

    Egy differenciálegyenlet analitikus megoldása egy függvény, mely kieléǵıti az egyenletet. Nu-

    merikus megoldás esetén ennek a függvénynek egy közeĺıtését határozzuk meg. A legtöbb

    esetben (előre adott) x0, x1, . . . , értékekhez kiszámolunk olyan y0, y1, . . . értékeket, hogy ezek a

    valódi y(x0), y(x1), . . . függvényértékeket jól közeĺıtsék, ha y jelöli az egyenlet pontos megoldását.

    A numerikus módszerek egyik nagy csoportja az

    y′(t) = f(t, y(t)), y(0) = y0

    alakú kezdeti érték problémák megoldását szolgálja. Ezen módszerek közül a legegyszerűbb az

    explicit Euler eljárás. A módszer léırásához legyen x0 = 0 és az x1, x2,...stb értékek egyenlő

    távolságra kövessék egymást, azaz egy adott h > 0 lépésköz esetén legyen x1 = h, x2 = 2h,...,

    általában xj = j · h, ha j = 1, 2, . . . . Ekkor az Euler-módszer a következő szabály szerinthatározza meg a fenti y0, y1, . . . sorozatot:

    yj+1 = yj + h · f(xj, yj), j = 0, 1, 2, . . . .

    Ennél a módszernél hatékonyabbak a Runge-Kutta módszercsalád elemei. Ezek közül léırjuk a

    Runge-Kutta-3-4 eljárást, melynél a fenti x0, x1, . . . esetén az iteráció a következő:

    k1 = f(xj, yj)

    k2 = f(xj +h

    2, yj +

    h

    2k1)

    k3 = f(xj +h

    2, yj +

    h

    2k2)

    k4 = f(xj + h, yj + hk3)

    yj+1 = yj +h

    6· (k1 + 2k2 + 2k3 + k4).

    53

  • A Matlab több módszert is implementált a Runge-Kutta családból. Kiemeljük a legáltalánosabban

    használható ode45 és ode23 függvényeket, melyek egy Runge-Kutta-4-5 (Dormand-Prince-

    módszer), illetve egy Runge-Kutta-2-3 (Bogacki-Shampine-módszer) implementációi. Ezen

    függvények működését az ode45 parancs példáján mutatjuk be.

    Mivel a Runge-Kutta módszerek az y′ = f(t, y), y(0) = y0 alakú kezdeti érték problémákat

    tudják megoldani, ezért alapvetően három paramétert kell átadnunk ahhoz, hogy numerikus

    megoldást megkapjuk: az egyenlet jobb oldalát, vagyis az f függvényt, azt az intervallumot,

    ahol az egyenlet megoldását szeretnénk előálĺıtani, illetve az y0 kezdőértéket. Ezek megadási

    módja a következő:

    - az f függvényt Matlab-függvényként kell definiálnunk, mely függ az y ismeretlen függvénytől

    és annak t változójától,

    - az intervallumot a kezdő és végpontokból álló vektorként,

    - az y0-at egyszerűen valós számként,

    Egy példán keresztül nézzük meg, hogyan kell ezt konkrétan megvalóśıtani: oldjuk meg az

    y′(t) = y(t) + t egyenletet az y(0) = 1 kezdőfeltétel mellett a [0, 10] intervallumon:

    f=@(t,y) y+t;

    tart=[0,10];

    y0=1;

    ode45(f,tart,y0);

    Az ı́gy visszakapott eredmény egy ábra lesz, mely a kiszámolt diszkrét értékekből készül el.

    Ha a kiszámolt értékeket, vagyis a (ti, yi) párokat is szeretnénk megkapni, akkor ehhez visz-

    szatérési argumentumnak meg kell adnunk egy t és egy y változónevet, melyekbe a Matlab a

    t0, t1, . . . és y0, y1, . . . értékeket tárolja vektorként. Ebben az esetben azonban nem ábrázolja a

    megoldást.

    [t,y]=ode45(f,tart,y0);

    Ha emellett szeretnénk ábrázolni is a megoldást, akkor azt a már ismert módon tehetjük meg.

    Ennek a megoldásnak az az előnye is megvan, hogy ekkor a plot paramétereit közvetlenül,

    egyszerűen tudjuk beálĺıtani:

    plot(t,y,’b-o’);

    54

  • 8.1.2 Egyenletrendszerek numerikus megoldása

    Egy explicit elsőrendű differenciálegyenletrendszer általános alakja a következő:

    y′1(t) = f1(t, y1(t), y2(t), . . . , yn(t))

    y′2(t) = f2(t, y1(t), y2(t), . . . , yn(t))

    ...

    y′n(t) = fn(t, y1(t), y2(t), . . . , yn(t)).

    Azaz a keresett megoldás egy y = (y1, y2, . . . , yn) vektorértékű függvény, valamint az egyen-

    let jobboldalán szereplő f = (f1, f2, . . . , fn) függvény is vektorértékű. Ezen függvények ko-

    ordinátáira a Matlab-ban a szokásos módon, y(i), illetve f(i)-ként hivatkozhatunk. Az egyen-

    letrendszer fenti feĺırási módja is sugallja, hogy az f -et oszlopvektorként kell megadnunk.

    Ahhoz, hogy numerikus megoldást tudjunk megadni, szükségünk van kezdőfeltételekre is. En-

    nek általános alakja

    y1(0) = y1

    y2(0) = y2...

    yn(0) = yn.

    Ezen értékeket is oszlopvektorként kell átadnunk a numerikus módszert megvalóśıtó függvénynek.

    Oldjuk meg például az

    y′1(t) = 2 · y2(t) + t

    y′2(t) = y2(t)− y1(t)

    y1(0) = 2

    y2(0) = 0

    kezdeti érték problémát a [0, 20] intervallumon. Most is van lehetőségünk csak a megoldások

    görbéjét lekérdezni, azaz

    h=@(t,y) [2*y(2)+t; y(2)-y(1)];

    55

  • ode45(h,[0 20],[2; 0]);

    illetve tárolni a (ti, y1i, y2i) értékeket, azaz

    [t,y] = ode45(h,[0 20],[2; 0]);

    A második esetben most is ábrázolhatjuk a megoldásgörbéket. Itt a visszakapott y változó egy

    mátrix, y = (y1, y2), ahol y1 és y2 a megoldás két koordinátafüggvényének közeĺıtését tartalmazó

    vektor. Így az y1 és y2 függvényeket külön-külön kell ábrázolnunk. Például:

    plot(t,y(:,1),’b-o’,t,y(:,2),’r-*’);

    8.1.3 Magasabb rendű egyenletek megoldása

    Egy m-edrendű explicit differenciálegyenlet általános alakja a következő:

    y(m)(t) = f(t, y, y′, y′′, . . . , y(m−1)).

    Egy ilyen egyenletet úgy oldhatunk meg, hogy át́ırjuk egyenletrendszerré olyan módon, hogy

    minden magasabb rendű deriváltnak egy-egy új ismeretlen függvényt feleltetünk meg (kivéve

    a legmagasabb rendűnek):

    z1 = y

    z2 = y′

    z3 = y′′

    ...

    zm = y(m−1),

    majd az eredeti egyetlen egyenletünket kiegésźıtjük még annyi új egyenlettel egy egyenletend-

    szerré, ahány új ismeretlen függvényünk van:

    z′1 = z2

    z′2 = z3

    z′3 = z4...

    z′m = f(t, z1, z2, z3, . . . , zm).

    56

  • Példaként oldjuk meg az y′′′(t)+y′′(t)+y′(t)+y(t) = t egyenletet y(0) = 1, y′(0) = 2, y′′(0) = 5

    kezdőfeltételek mellett a [0,2] intervallumon. Az új ismeretlen függvények (z1, z2, z3) lesznek,

    mégpedig z1 = y, z2 = y′, z3 = y

    ′′. Az új egyenletek

    z′1 = z2

    z′2 = z3

    z′3 = −z3 − z2 − z1 + t,

    az új kezdőfeltételek pedig

    z1(0) = y(0) = 1

    z2(0) = y′(0) = 2

    z3(0) = y′′(0) = 5.

    Ennek Matlab-megvalóśıtása:

    h=@(t,y) [y(2); y(3); -y(3)-y(2)-y(1)+t];

    ode45(h,[0 20],[0;2;5]);

    A megoldás ábrázolása (a segédfüggvények nélkül):

    plot(t,y(:,1));

    8.1.4 További információ a megoldásról és a megoldás menetéről

    Ha a fenti két visszatérési érték helyett (azaz t és y helyett) csak egy értéket várunk vissza,

    akkor ez az egy érték egyszerre fog tartalmazni sok adatot a megoldásról. Ezt egy úgynevezett

    Matlab struktúra t́ıpusú változó képes megvalóśıtani. Kulcsszava a struct. Példa:

    h=@(t,y) [2*y(2)+t; y(2)-y(1)];

    sol = ode45(h,[0 20],[2; 0]);

    Most a sol nevű változónak többek között van egy solver nevű mezője, mely azt mutatja meg,

    hogy milyen ode-solvert használtunk, egy x és egy y nevű mezője, mely a generált numerikus

    megoldás x és y adatvektorait adja vissza, valamint egy stats nevű mezője, mely a megoldás

    menetének statisztikáját mutatja, maga is egy struct nsteps, nfailed és nfevals mezőkkel.

    sol:

    57

  • struct with fields:

    solver: ’ode45’

    extdata: [1× 1 struct]x: [1× 40 double]y: [2× 40 double]stats: [1× 1 struct]idata: [1× 1 struct]

    Ha ebben a formában kérjük a visszatérési értéket, akkor lehetőségünk van például arra, hogy

    olyan pontokban is meghatározzuk a közeĺıtő megoldást, amely nem szerepel a t0, t1, t2, . . .

    alappontok között. Ezt a a deval nevű parancs valóśıtja meg. Használhatjuk pélául a görbe

    sűrűbb beosztású ábrázolására:

    x = linspace(0,20,250);

    y = deval(sol,x);

    plot(x,y(1,:))

    (A struktúra egy olyan szerkezet, mely összefog összetartozó dolgokat egy egységbe. Például az

    egyetemi hallgatók nevét, neptunkódját, születési dátumát összerendezhetjük egy struktúrába a

    következő módon: legyen az összefogó szerkezet neve hallg, és a tárolandó adatok megnevezései

    nev, szdatum és neptun. Ekkor létrehozhatjuk a ḱıvánt szerkezetet:

    hallg.nev=’Kiss Józsi’;

    hallg.szdatum=’1998-06-20’;

    hallg.neptun=’ABCD12’;)

    8.1.5 Fázisportré

    Autonóm egyenletek esetén a fázisportré hasznos információval szolgál a rendszer működéséről.

    Fázisporténak nevezünk egy olyan ábrát, melyen egy adott autonóm egyenlet valamely tipikus

    trajektóriáit ábrázoljuk. Többek között következtetést lehet levonni belőle a rendszer egyensúlyi

    pontjairól.

    Tekintsük az

    x′(t) = f1(x(t), y(t))

    y′(t) = f2(x(t), y(t))

    58

  • autonóm egyenletrendszert az

    x(0) = p, y(0) = q

    kezdeti feltétel mellett. Ennek (x(t), y(t)) megoldását ábrázolhatjuk parametrizált görbeként

    a śıkon, melyet a (p, q) pont pályájának vagy trajektóriájának nevezünk. Fázisportré késźıtése

    esetén különböző kezdőfeltételek esetén kapott pályákat ábrázolunk egy ábrában.

    Példaként késźıtsük el a Lotka-Volterra modell egy fázisportréját. Az egyenlet:

    x′(t) = x(t)− x(t) · y(t)

    y′(t) = x(t) · y(t)− y(t).

    Válasszuk a (0.1, 0.1), (0.3, 0.3), (0.5, 0.5), (0.7, 0.7), (0.9, 0.9) kezdeti értékekhez tartozó pályákat.

    Ennek megvalóśıtása a Matlab-ban:

    h=@(t,y) [y(1)-y(1)*y(2);-y(2)+y(1)*y(2)];

    tart=[0,10];

    figure

    for p=[0.1,0.3,0.5,0.7,0.9]

    y0=[p;p];

    [t,y]=ode45(h,tart,y0);

    plot(y(:,1),y(:,2));

    hold on

    end

    hold off

    .

    59

  • 8.1.6 Iránymező

    Egy y′(x) = f(x, y(x)) explicit közönséges differenciálegyenlet esetén az egyenlethez tartozó

    iránymező alatt az

    (x, y)→ (1, f(x, y(x))

    śıkbeli vektormezőt értjük. Ez a vektormező minden pontban az ott áthaladó (ismeretlen)

    megoldásgörbe érintőjét adja. Így képet nyerhetünk a megoldásokról.

    Példa: ábrázoljuk az y′(x) = sin(x) · y(x) egyenlet iránymezőjét.

    h=@(x,y) sin(x)*y;

    x = linspace(-5,5,30);

    y = linspace(0,11,30);

    [X,Y] = meshgrid(x,y);

    u = zeros(size(X));

    v = zeros(size(Y));

    for i = 1:numel(X)

    u(i) = 1;

    v(i) = h(X(i), Y(i));

    end

    figure

    quiver(x,y,u,v,’r’);

    axis tight equal;

    .

    Szebb ábrát kapunk, ha az iránymezőbeli vektorokat 1 hosszúságúra normáljuk, azaz a for-

    cikluson belül az

    60

  • norma=norm([1, h(X(i),Y(i))]);

    u(i) = 1/norma;

    v(i) = h(X(i), Y(i))/norma;

    parancsokat adjuk ki.

    .

    Rajzoljunk az ábrába néhány megoldásgörbét is, pontosabban az y(0) = 1, y(0) = 2 és y(0) = 3

    kezdeti feltételeket kieléǵıtő megoldások görbéjét.

    figure

    quiver(x,y,u,v,’r’);

    axis tight equal;

    hold on

    tart=[-5, 5];

    for y0=[1 2 3]

    [x,y]=ode45(h,tart,y0);

    plot(x,y);

    hold on

    end

    hold off

    61

  • .

    Egy

    x′(t) = f1(x(t), y(t)), y′(t) = f2(x(t), y(t))

    autonóm egyenletrendszer iránymezője alatt az

    (x, y)→ (f1(x(t), y(t)), f2(x(t), y(t)))

    vektormezőt értjük.

    Ennek megvalóśıtását a Matlab-ban nézzük meg a

    x′(t) = x(t)− x(t) · y(t)

    y′(t) = x(t) · y(t)− y(t)

    Lotka-Volterra-egyenlet példáján.

    h=@(t,y) [y(1)-y(1)*y(2);-y(2)+y(1)*y(2)];

    x = linspace(0,3,30);

    y = linspace(0,3,30);

    [X,Y] = meshgrid(x,y);

    u = zeros(size(X));

    v = zeros(size(Y));

    for i = 1:numel(X)

    dy = h(0,[X(i); Y(i)]);

    dy=dy/norm(dy);

    u(i) = dy(1);

    v(i) = dy(2);

    62

  • end

    figure

    quiver(X,Y,u,v,’r’);

    axis tight equal;

    .

    Rajzoljuk rá az ábrába az (x(0) = y(0) = 0.4, (x(0) = y(0) = 0.5, (x(0) = y(0) = 0.6,

    (x(0) = y(0) = 0.7 és (x(0) = y(0) = 0.8 kezdeti feltételt kieléǵıtő megoldások pályáit is:

    figure

    quiver(X,Y,u,v,’k’);

    axis tight equal;

    hold on

    tart=[0,10];

    for p=[0.4,0.5,0.6,0.7,0.8]

    y0=[p;p];

    [ ,y]=ode45(h,tart,y0);

    plot(y(:,1),y(:,2),’LineWidth’,2);

    hold on

    end

    hold off

    63

  • .

    8.2 Peremértékproblémák megoldása

    Az általános matematikai probléma a következő:

    y′′(x) = f(x, y(x), y′(x)), y(a) = p, y(b) = q.

    Ahhoz, hogy a Matlab meg tudja oldani ezt a problémát, át kell fogalmaznunk elsőrendű

    egyenletrendszerré a z1 = y és z2 = y′ új ismeretlen fügvényekkel:

    z′1 = z2, z′2 = f(x, z1, z2).

    Ezután az egyenletrendszer jobb oldalát kell átadnunk, mint korábban a kezdeti érték problémák

    esetén. A peremfeltételeket szintén egy függvénybe kell beléırnunk, valamint szükségünk lesz

    egy kezdő ötletre, azaz egy valamiféle közeĺıtő megoldásra, ahonnan a módszer indulhat.

    Példaként oldjuk meg az y′′(x) = x3 ·sin(√

    (x)) egyenletet az y(0) = 0, y(1) = 4 peremfeltételek

    mellett.

    f=@(x,y) [y(2); x.∧3*sin(sqrt(x))];

    y0=@(ya,yb) [ya(1); yb(1)-4];

    guess=@(x)[ sin(x); cos(x)];

    x = linspace(0,1,5);

    solinit = bvpinit(x,guess);

    sol = bvp4c(f,y0,solinit);

    plot(sol.x, sol.y(1,:), ’g-o’);

    64

  • 9 Általános egyenletek, egyenletrendszerek megoldása

    9.1 Az alapcsomag parancsai

    9.1.1 Az fzero parancs

    Az fzero parancs egyváltozós valós értékű függvények (egyik) zérushelyét keresi meg numerikus

    módszerekkel. Szükséges neki megadni azt a függvényt, melynek zérushelyét keressük. Vagyis

    ha egyenletet szeretnénk megoldani, akkor a nullára rendezett egyenlet megfelelő oldalát tar-

    talmazó kifejezésből késźıtett függvényt adjuk át. Meg kell még adni egy kiinduló értéket is,

    amelynek a közelében a zérushelyet keresni fogja. Visszatérési értékként annak a gyöknek egy

    közeĺıtését kapjuk, ahova a kezdőpontból az iteráció konvergált. Ha a többi gyököt is szeretnénk

    megtalálni, akkor új kezdőpontból kell ind́ıtanunk az iterációtA fenti példában az x0=0 és az

    x0=-10 választások célravezetőek.

    f=@(x) x∧2 + 6 ∗ x+ 1;x0=0;

    s=fzero(f,x0);

    Kicsit összetettebb példa - paraméteres egyenlet megoldása: oldjuk meg az x2 = sin(p ∗ x)egyenletet a p = 0.1, 1 10 paraméterértékekre.

    a=zeros(1,3);

    f=@(x,p) x2 − sin(p ∗ x);p=0.1;

    g=@(x) f(x,p);

    a(1)=fzero(g,1);

    p=1;

    g=@(x) f(x,p);

    a(2)=fzero(g,3);

    p=10;

    g=@(x) f(x,p);

    a(3)=fzero(g,3);

    65

  • 9.1.2 Az roots parancs

    A roots paranccsal polinomok gyökeit tudjuk megtalálni. Most a polinomot Matlab-polinomként

    kell átadnunk, azaz az együtthatók vektoraként. A fenti példa esetén:

    p=[1 6 1];

    roots(f);

    9.2 A szimbolikus csomag elemei

    9.2.1 A solve parancs

    A solve paranccsal áltlános egyenleteket és egyenletrendszereket tudunk megoldani. Ezen

    parancs használatához először meg kell mondanunk a Matlab-nak, hogy mely mennyiségek az

    ismeretlenek a problémánkban, azaz mik lesznek a (szimbolikus) változók. Ezeket a syms kulc-

    sszóval vezetjük be. Ezután meg kell adnunk az egyenletet Matlab-egyenletként, azaz az ==

    egyenlőség-jel használatával. (Ha az egyenletünk 0-ra van rendezve, akkor elegendő a nemnulla

    oldalt megadni, egyenlőségjelek nélkül.)

    Példa: oldjuk meg az x2 + 2 · x+ 1 = 0 egyenletet. Most az ismeretlen az x változó.

    syms x

    eq = x∧2 + 6 ∗ x+ 1 == 0;s=solve(eq);

    A válasz egy szimbolikus vektor, ebben az esetben s = [−2 ∗ 2(1/2) − 3, 2 ∗ 2(1/2) − 3]. Eztkiértékelhetünk a vpa parancs seǵıtségével:

    vpa(s) → [-5.82, -0.17]

    9.2.2 A root parancs

    A root paranccsal polinomok gyökeit tudjuk meghatározni. Hasonlóan működik, mint a solve

    parancs, de most

    syms x