Matlab alapismeretek - Debreceni Egyetem Matematikai...
Transcript of Matlab alapismeretek - Debreceni Egyetem Matematikai...
-
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