Runge–Kutta-módszer

Ez a szócikk vagy szakasz lektorálásra, tartalmi javításokra szorul. A felmerült kifogásokat a szócikk vitalapja részletezi (vagy extrém esetben a szócikk szövegében elhelyezett, kikommentelt szövegrészek). Ha nincs indoklás a vitalapon (vagy szerkesztési módban a szövegközben), bátran távolítsd el a sablont!
Csak akkor tedd a lap tetejére ezt a sablont, ha az egész cikk megszövegezése hibás. Ha nem, az adott szakaszba tedd, így segítve a lektorok munkáját!

A Runge–Kutta-módszerek családja a differenciálegyenletek numerikus analízisének széles körben ismert és alkalmazott közelítő eljárása, amelyet Carl Runge és Martin Kutta német matematikusok dolgoztak ki 1900 körül.

A közönséges negyedrendű Runge–Kutta-módszer

A Runge–Kutta-módszercsalád közönséges negyedrendű tagja annyira elterjedten használatos, hogy egyszerűen csak „a Runge–Kutta-módszer”-ként hivatkoznak rá. E módszer az alábbi kezdetiérték-probléma egy negyedrendű közelítő megoldását adja.

y ( t ) = f ( t , y ( t ) ) y ( t 0 ) = y 0 {\displaystyle y'(t)=f(\;t\;,\;y(t)\;)\qquad y(t_{0})=y_{0}}

Azaz tetszőlegesen rögzített pozitív valós, tipikus esetben kicsiny h {\displaystyle h} lépésköz esetén az n {\displaystyle n} -edik lépésben a kezdetiérték-probléma y ( t ) {\displaystyle y(t)} megoldásának egy olyan

y ( t n ) y n {\displaystyle y(t_{n})\;\approx \;y_{n}}

közelítését adja a

t n = t 0 + n h {\displaystyle t_{n}=t_{0}+n\cdot h}

helyen, amely közelítés hibája negyedrendű. E negyedrendűség azt jelenti, hogy a választott lépésköz zsugorításakor annak negyedik hatványával zsugorodik a hibára adott felső becslés. Például a lépésköz harmadolása árán, azaz nagyjából háromszor annyi számolás árán a hibakorlát ( 1 / 3 ) 4 = 1 / 81 {\displaystyle (1/3)^{4}=1/81} -szeresre zsugorodik.

A h {\displaystyle h} lépésköz rögzítése után az alábbi, n {\displaystyle n} -szerinti rekurziós lépésekkel kapjuk az y ( t ) {\displaystyle y(t)} megoldásfüggvény közelítését.

y n + 1 = y n + h a n + 2 b n + 2 c n + d n 6 ahol a n = f ( t n , y n ) b n = f ( t n + 1 2 h , y n + 1 2 h a n ) c n = f ( t n + 1 2 h , y n + 1 2 h b n ) d n = f ( t n + h , y n + h c n ) {\displaystyle {\begin{aligned}y_{n+1}&=y_{n}+h\cdot {a_{n}+2\cdot b_{n}+2\cdot c_{n}+d_{n} \over 6}\\{\text{ahol}}\\a_{n}&=f(\;t_{n}\;,\;y_{n}\;)\\b_{n}&=f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y_{n}+{\tfrac {1}{2}}h\cdot a_{n}\;)\\c_{n}&=f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y_{n}+{\tfrac {1}{2}}h\cdot b_{n}\;)\\d_{n}&=f(\;t_{n}+h\;,\;y_{n}+h\cdot c_{n}\;)\end{aligned}}}

Így, a t n + 1 {\displaystyle t_{n+1}} helyhez tartozó y n + 1 {\displaystyle y_{n+1}} közelítőérték egyenlő a t n {\displaystyle t_{n}} helyhez tartozó y n {\displaystyle y_{n}} közelítőérték, plusz a becsült meredekség szorozva az intervallum h {\displaystyle h} hosszával. A meredekség becslése egy, most nem részletezett matematikai megfontolás alapján súlyozott középértéke az alábbi négy meredekségi becslésnek:

a n = f ( t n , y n ) f ( t n , y ( t n ) ) = y ( t n ) b n = f ( t n + 1 2 h , y n + 1 2 h a n ) f ( t n + 1 2 h , y ( t n ) + 1 2 h y ( t n ) ) f ( t n + 1 2 h , y ( t n + 1 2 h ) ) = y ( t n + 1 2 h ) c n = f ( t n + 1 2 h , y n + 1 2 h b n ) f ( t n + 1 2 h , y ( t n ) + 1 2 h y ( t n + 1 2 h ) ) f ( t n + 1 2 h , y ( t n + 1 2 h ) ) = y ( t n + 1 2 h ) d n = f ( t n + h , y n + h c n ) f ( t n + h , y ( t n ) + h y ( t n + 1 2 h ) ) f ( t n + h , y ( t n + h ) ) = y ( t n + h ) {\displaystyle {\begin{aligned}a_{n}&=f(\;t_{n}\;,\;y_{n}\;)\\&\approx f(\;t_{n}\;,\;y(t_{n})\;)\\&=y'(t_{n})\\b_{n}&=f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y_{n}+{\tfrac {1}{2}}h\cdot a_{n}\;)\\&\approx f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y(t_{n})+{\tfrac {1}{2}}h\cdot y'(t_{n})\;)\\&\approx f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y(t_{n}+{\tfrac {1}{2}}h)\;)\\&=y'(t_{n}+{\tfrac {1}{2}}h)\\c_{n}&=f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y_{n}+{\tfrac {1}{2}}h\cdot b_{n}\;)\\&\approx f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y(t_{n})+{\tfrac {1}{2}}h\cdot y'(t_{n}+{\tfrac {1}{2}}h)\;)\\&\approx f(\;t_{n}+{\tfrac {1}{2}}h\;,\;y(t_{n}+{\tfrac {1}{2}}h)\;)\\&=y'(t_{n}+{\tfrac {1}{2}}h)\\d_{n}&=f(\;t_{n}+h\;,\;y_{n}+h\cdot c_{n}\;)\\&\approx f(\;t_{n}+h\;,\;y(t_{n})+h\cdot y'(t_{n}+{\tfrac {1}{2}}h)\;)\\&\approx f(\;t_{n}+h\;,\;y(t_{n}+h)\;)\\&=y'(t_{n}+h)\end{aligned}}}

E négy közelítés átlagolásánál a t n {\displaystyle t_{n}} és t n + 1 {\displaystyle t_{n+1}} szélekhez képest a t n + 0.5 {\displaystyle t_{n+0.5}} felezőnél dupla súlyt alkalmazunk.

átlagos meredekség y ( t n ) + 2 y ( t n + 1 2 h ) + 2 y ( t n + 1 2 h ) + y ( t n + h ) 6 1 a n + 2 b n + 2 c n + 1 d n 6 {\displaystyle {\begin{aligned}{\mbox{átlagos meredekség}}&\;\approx \;{y'(t_{n})+2\cdot y'(t_{n}+{\tfrac {1}{2}}h)+2\cdot y'(t_{n}+{\tfrac {1}{2}}h)+y'(t_{n}+h) \over 6}\\&\;\approx \;{1\cdot a_{n}+2\cdot b_{n}+2\cdot c_{n}+1\cdot d_{n} \over 6}\end{aligned}}}

Mivel a megoldásfüggvény felvett értékeire csak additív műveleteket és a skalárral való szorzás műveletét alkalmazzuk, lényegében ezért a módszer nem csak skalár értékű megoldásfüggvények, hanem vektor értékűek esetén is alkalmazható. Ilyen például a Schrödinger-differenciálegyenlet, amelynek Hamilton-operátorát használjuk a fenti szerepében.

Explicit Runge–Kutta-módszer

A fent említett Runge–Kutta-módszercsalád általánosítása az explicit Runge–Kutta-módszer, amit a

y n + 1 = y n + h i = 1 s b i k i , {\displaystyle y_{n+1}=y_{n}+h\sum _{i=1}^{s}b_{i}k_{i},}

ad meg, ahol

k 1 = f ( t n , y n ) , {\displaystyle k_{1}=f(t_{n},y_{n}),\,}
k 2 = f ( t n + c 2 h , y n + a 21 h k 1 ) , {\displaystyle k_{2}=f(t_{n}+c_{2}h,y_{n}+a_{21}hk_{1}),\,}
k 3 = f ( t n + c 3 h , y n + a 31 h k 1 + a 32 h k 2 ) , {\displaystyle k_{3}=f(t_{n}+c_{3}h,y_{n}+a_{31}hk_{1}+a_{32}hk_{2}),\,}
{\displaystyle \vdots }
k s = f ( t n + c s h , y n + a s 1 h k 1 + a s 2 h k 2 + + a s , s 1 h k s 1 ) . {\displaystyle k_{s}=f(t_{n}+c_{s}h,y_{n}+a_{s1}hk_{1}+a_{s2}hk_{2}+\cdots +a_{s,s-1}hk_{s-1}).}
(Megjegyzés: a fenti egyenletek különböző formákban is megjelenhetnek egyéb forrásokból, de jelentésük azonos).

Ahhoz hogy meghatározzunk egy bizonyos módszert,kell egy s egész változó (a szakaszok száma), illetve az aij (1 ≤ j < is), bi (i = 1, 2, ..., s) és a ci (i = 2, 3, ..., s) együtthatók. Ezek az adatok általában egy mnemonik eszközbe kerülnek be, ami a Butcher táblájaként ismert (Butcher tableau, John C. Butcher neve után):

0
c 2 {\displaystyle c_{2}} a 21 {\displaystyle a_{21}}
c 3 {\displaystyle c_{3}} a 31 {\displaystyle a_{31}} a 32 {\displaystyle a_{32}}
{\displaystyle \vdots } {\displaystyle \vdots } {\displaystyle \ddots }
c s {\displaystyle c_{s}} a s 1 {\displaystyle a_{s1}} a s 2 {\displaystyle a_{s2}} {\displaystyle \cdots } a s , s 1 {\displaystyle a_{s,s-1}}
b 1 {\displaystyle b_{1}} b 2 {\displaystyle b_{2}} {\displaystyle \cdots } b s 1 {\displaystyle b_{s-1}} b s {\displaystyle b_{s}}

A Runge–Kutta-módszer konzisztens, ha

j = 1 i 1 a i j = c i   h a   i = 2 , , s . {\displaystyle \sum _{j=1}^{i-1}a_{ij}=c_{i}\ \mathrm {ha} \ i=2,\ldots ,s.}

Ugyanakkor vannak más követelmények, ha azt szeretnénk, hogy a módszernek legyen p fokszáma, így a kerekítési hiba O(hp+1) lesz. Például egy kétlépcsős módszer másodrendű ha b1 + b2 = 1, b2c2 = 1/2, és b2a21 = 1/2.

Példák

A RK4 szerkezete a következő táblázat szerint értelmezhető:

0
1/2 1/2
1/2 0 1/2
1 0 0 1
1/6 1/3 1/3 1/6

Habár a legegyszerűbb Runga-Kutta-módszer az Euler-módszer maga, amelynek y n + 1 = y n + h f ( t n , y n ) {\displaystyle y_{n+1}=y_{n}+hf(t_{n},y_{n})} képlet ad meg. Ez az egyetlen explicit Runge–Kutta-módszer egy lépcsővel.

0
1

Egy példa a másodrendű két lépcsős módszerre a középponti módszer:

y n + 1 = y n + h f ( t n + 1 2 h , y n + 1 2 h f ( t n , y n ) ) . {\displaystyle y_{n+1}=y_{n}+hf\left(t_{n}+{\tfrac {1}{2}}h,y_{n}+{\tfrac {1}{2}}hf(t_{n},y_{n})\right).}

Az erre megfelelő táblázat:

0
1/2 1/2
0 1

Megjegyzendő, a középponti módszer nem a legmegfelelőbb RK-módszer. A Heun-módszer egy alternatív megoldást kínál, ahol a tábla 1/2-ei 1-re cserélődnek, és a b sora pedig [1/2,1/2]. Ha valaki minimalizálni akarja a kerekítés által keletkezett hibákat, akkor az alábbi módszert kell használnia (Atkinson p. 423). Más fontos módszerek: Fehlberg, Cash-Karp és Dormand-Prince.

Használat

A következő egy példa a kétlépcsős explicit Runge–Kutta-módszerre:

0
2/3 2/3
1/4 3/4

a kezdeti értéket meghatározó képlet

y = tan ( y ) + 1 , y ( 1 ) = 1 ,   t [ 1 , 1.1 ] {\displaystyle y'=\tan(y)+1,\quad y(1)=1,\ t\in [1,1.1]}

a h=0,025 lépésköz

A fenti táblát meghatározó egyenrangú számítások:

k 1 = y n {\displaystyle k_{1}=y_{n}}
k 2 = y n + 2 3 h f ( t n , k 1 ) {\displaystyle k_{2}=y_{n}+{\tfrac {2}{3}}hf(t_{n},k_{1})}
y n + 1 = y n + h ( 1 4 f ( t n , k 1 ) + 3 4 f ( t n + 2 3 h , k 2 ) ) {\displaystyle y_{n+1}=y_{n}+h\left({\tfrac {1}{4}}f(t_{n},k_{1})+{\tfrac {3}{4}}f(t_{n}+{\tfrac {2}{3}}h,k_{2})\right)}
t 0 = 1 {\displaystyle t_{0}=1}
y 0 = 1 {\displaystyle y_{0}=1}
t 1 = 1.025 {\displaystyle t_{1}=1.025}
k 1 = y 0 = 1 {\displaystyle k_{1}=y_{0}=1} f ( t 0 , k 1 ) = 2.557407725 {\displaystyle f(t_{0},k_{1})=2.557407725} k 2 = y 0 + 2 / 3 h f ( t 0 , k 1 ) = 1.042623462 {\displaystyle k_{2}=y_{0}+2/3hf(t_{0},k_{1})=1.042623462}
y 1 = y 0 + h ( 1 / 4 f ( t 0 , k 1 ) + 3 / 4 f ( t 0 + 2 / 3 h , k 2 ) ) = 1.066869388 {\displaystyle y_{1}=y_{0}+h(1/4*f(t_{0},k_{1})+3/4*f(t_{0}+2/3h,k_{2}))=1.066869388}
t 2 = 1.05 {\displaystyle t_{2}=1.05}
k 1 = y 1 = 1.066869388 {\displaystyle k_{1}=y_{1}=1.066869388} f ( t 1 , k 1 ) = 2.813524695 {\displaystyle f(t_{1},k_{1})=2.813524695} k 2 = y 1 + 2 / 3 h f ( t 1 , k 1 ) = 1.113761467 {\displaystyle k_{2}=y_{1}+2/3hf(t_{1},k_{1})=1.113761467}
y 2 = y 1 + h ( 1 / 4 f ( t 1 , k 1 ) + 3 / 4 f ( t 1 + 2 / 3 h , k 2 ) ) = 1.141332181 {\displaystyle y_{2}=y_{1}+h(1/4*f(t_{1},k_{1})+3/4*f(t_{1}+2/3h,k_{2}))=1.141332181}
t 3 = 1.075 {\displaystyle t_{3}=1.075}
k 1 = y 2 = 1.141332181 {\displaystyle k_{1}=y_{2}=1.141332181} f ( t 2 , k 1 ) = 3.183536647 {\displaystyle f(t_{2},k_{1})=3.183536647} k 2 = y 2 + 2 / 3 h f ( t 2 , k 1 ) = 1.194391125 {\displaystyle k_{2}=y_{2}+2/3hf(t_{2},k_{1})=1.194391125}
y 3 = y 2 + h ( 1 / 4 f ( t 2 , k 1 ) + 3 / 4 f ( t 2 + 2 / 3 h , k 2 ) ) = 1.227417567 {\displaystyle y_{3}=y_{2}+h(1/4*f(t_{2},k_{1})+3/4*f(t_{2}+2/3h,k_{2}))=1.227417567}
t 4 = 1.1 {\displaystyle t_{4}=1.1}
k 1 = y 3 = 1.227417567 {\displaystyle k_{1}=y_{3}=1.227417567} f ( t 3 , k 1 ) = 3.796866512 {\displaystyle f(t_{3},k_{1})=3.796866512} k 2 = y 3 + 2 / 3 h f ( t 3 , k 1 ) = 1.290698676 {\displaystyle k_{2}=y_{3}+2/3hf(t_{3},k_{1})=1.290698676}
y 4 = y 3 + h ( 1 / 4 f ( t 3 , k 1 ) + 3 / 4 f ( t 3 + 2 / 3 h , k 2 ) ) = 1.335079087 {\displaystyle y_{4}=y_{3}+h(1/4*f(t_{3},k_{1})+3/4*f(t_{3}+2/3h,k_{2}))=1.335079087}

Az aláhúzott kifejezések jelzik a számszerû megoldásokat.Megjegyzendõ, az y i {\displaystyle y_{i}} s újraszámolása érdekében f ( t i , k 1 ) {\displaystyle f(t_{i},k_{1})} -et használtunk.

Adaptív Runge–Kutta-módszer

Az adaptív módszer arra volt tervezve, hogy megadja a becsült helyi kerekítési hibát minden egyes RK lépésben. Ezt úgy valósította meg, hogy két módszert tartalmaz a táblázat, egyet p-ed rendűvel és egyet p-1-ed rendűvel.

A kisebb rendű lépés adott:

y n + 1 = y n + h i = 1 s b i k i , {\displaystyle y_{n+1}^{*}=y_{n}+h\sum _{i=1}^{s}b_{i}^{*}k_{i},}

ahol, a k i {\displaystyle k_{i}} megegyezik a magasabb rendű módszerrel. Ekkor a hiba:

e n + 1 = y n + 1 y n + 1 = h i = 1 s ( b i b i ) k i , {\displaystyle e_{n+1}=y_{n+1}-y_{n+1}^{*}=h\sum _{i=1}^{s}(b_{i}-b_{i}^{*})k_{i},}

ami O ( h p ) {\displaystyle O(h^{p})} . A Butcher-táblázat erre a módszerre ki van bővítve, így megadja a b i {\displaystyle b_{i}^{*}} értékeit:

0
c 2 {\displaystyle c_{2}} a 21 {\displaystyle a_{21}}
c 3 {\displaystyle c_{3}} a 31 {\displaystyle a_{31}} a 32 {\displaystyle a_{32}}
{\displaystyle \vdots } {\displaystyle \vdots } {\displaystyle \ddots }
c s {\displaystyle c_{s}} a s 1 {\displaystyle a_{s1}} a s 2 {\displaystyle a_{s2}} {\displaystyle \cdots } a s , s 1 {\displaystyle a_{s,s-1}}
b 1 {\displaystyle b_{1}} b 2 {\displaystyle b_{2}} {\displaystyle \cdots } b s 1 {\displaystyle b_{s-1}} b s {\displaystyle b_{s}}
b 1 {\displaystyle b_{1}^{*}} b 2 {\displaystyle b_{2}^{*}} {\displaystyle \cdots } b s 1 {\displaystyle b_{s-1}^{*}} b s {\displaystyle b_{s}^{*}}

A RK Fehlberg módszernek a két rendszere az ötöd- és negyedrendű. Ennek a kibővített Butcher-táblázata a következő:

0
1/4 1/4
3/8 3/32 9/32
12/13 1932/2197 −7200/2197 7296/2197
1 439/216 −8 3680/513 -845/4104
1/2 −8/27 2 −3544/2565 1859/4104 −11/40
16/135 0 6656/12825 28561/56430 −9/50 2/55
25/216 0 1408/2565 2197/4104 −1/5 0

Habár a legegyszerűbb adaptív Runge–Kutta-módszer a másodrendű Heun-módszert és az elsőrendű Euler-módszert foglalja magába. Ennek a kibővített Butcher-táblázata:

0
1 1
1/2 1/2
1 0

A hiba eredményét a lépték határozza meg.

Más adaptiv Runge–Kutta-módszerek a Bogacki-Shampine-módszer (harmad-és másodrendű), a Cash-Karp-módszer és a Dormand-Prince-módszer (mindkettő ötöd- és negyedrendű).

Implicit Runge-Kutta-módszer

Az implicit módszerek jóval általánosabbak az expliciteknél. Az eltérés a Butcher-táblázatnál merül fel: az implicit módszernél, a mátrix aij együtthatója nem feltétlenül alacsony háromszög:

c 1 a 11 a 12 a 1 s c 2 a 21 a 22 a 2 s c s a s 1 a s 2 a s s b 1 b 2 b s = c A b T {\displaystyle {\begin{array}{c|cccc}c_{1}&a_{11}&a_{12}&\dots &a_{1s}\\c_{2}&a_{21}&a_{22}&\dots &a_{2s}\\\vdots &\vdots &\vdots &\ddots &\vdots \\c_{s}&a_{s1}&a_{s2}&\dots &a_{ss}\\\hline &b_{1}&b_{2}&\dots &b_{s}\\\end{array}}={\begin{array}{c|c}\mathbf {c} &A\\\hline &\mathbf {b^{T}} \\\end{array}}}

A megközelítő megoldás a kezdeti érték problémára utal az együtthatók nagyobb számára.

y n + 1 = y n + h i = 1 s b i k i {\displaystyle y_{n+1}=y_{n}+h\sum _{i=1}^{s}b_{i}k_{i}\,}
k i = f ( t n + c i h , y n + h j = 1 s a i j k j ) . {\displaystyle k_{i}=f\left(t_{n}+c_{i}h,y_{n}+h\sum _{j=1}^{s}a_{ij}k_{j}\right).}

Az a i j {\displaystyle a_{ij}} mátrix telítettsége miatt, az egyes k i {\displaystyle k_{i}} becslése jelentékeny mértékben fog függeni az f ( t , y ) {\displaystyle f(t,y)} függvénytől. A nehézségek ellenére, az implicit módszerek nagy jelentőséggel birnak az erősen stabil állapotuk miatt, ami különösen fontos a parciális differenciál egyenletek megoldásában. A legegyszerűbb példa egy implicit Runge–Kutta-módszerre fordított Euler-módszer:

y n + 1 = y n + h f ( t n + h , y n + 1 ) {\displaystyle y_{n+1}=y_{n}+hf(t_{n}+h,y_{n+1})\,}

Ennek táblázata egyszerű:

1 1 1 {\displaystyle {\begin{array}{c|c}1&1\\\hline &1\\\end{array}}}

Még az egyszerűbb implicit módszer alkalmazása is bonyolulttá válhat, ami a ki kifejezésből látszik is:

k 1 = f ( t n + c 1 h , y n + h a 11 k 1 ) k 1 = f ( t n + h , y n + h k 1 ) . {\displaystyle k_{1}=f(t_{n}+c_{1}h,y_{n}+ha_{11}k_{1})\rightarrow k_{1}=f(t_{n}+h,y_{n}+hk_{1}).}

Ebben az esetben, a fenti bonyolult kifejezés leegyszerűsíthető a következőképpen:

y n + 1 = y n + h k 1 h k 1 = y n + 1 y n {\displaystyle y_{n+1}=y_{n}+hk_{1}\rightarrow hk_{1}=y_{n+1}-y_{n}\,}

így hát

k 1 = f ( t n + h , y n + y n + 1 y n ) = f ( t n + h , y n + 1 ) . {\displaystyle k_{1}=f(t_{n}+h,y_{n}+y_{n+1}-y_{n})=f(t_{n}+h,y_{n+1}).\,}

amiből következik, hogy:

y n + 1 = y n + h f ( t n + h , y n + 1 ) {\displaystyle y_{n+1}=y_{n}+hf(t_{n}+h,y_{n+1})\,}

Noha egyszerűbb, mint a módosítások előtti „nyers” kifejezés, ez egy implicit összefüggés, tehát a konkrét megoldás problémafüggő. A többlépéses implicit módszert sikeresen használják a kutatók. Az egyensúly összeállítása (kombinációja), a magasabb rendpontosság kevesebb lépésben és a léphetőség (stepping) egyedül az előző értékben válik érdekessé, ugyanakkor a bonyolult példa jellegzetes kivitelezése, és a tény, hogy ki ismételt megközelítései mutatják hogy ezek hasonlóak (ugyanazok).

Algoritmus

Legyen mondjuk a y ( x ) = 2 y ( x ) ; y ( 0 ) = 3 {\displaystyle y^{'}(x)=-2*y(x);y(0)=3} differenciálegyenlet, aminek a megoldása: y ( x ) = 3 e 2 x {\displaystyle y(x)=3*e^{-2*x}}

import math
import numpy as np
import matplotlib.pyplot as plt

x0=0
y0=3
h=0.8
def ypontos():
	x=np.linspace(0,10,100)
	y=3*np.exp(-2*x)
	plt.plot(x,y,"-b")
def f(x, y):
	return(-2*y)
def RungeKutta2nd(f, h, x0, y0):
	x=np.arange(0, 10, h)
	y=x*0
	y[0]=y0
	for i in range(10):
		k1=h*f(x[i],y[i])
		k2=h*f(x[i]+h/2,y[i]+k1/2)
		y[i+1]=y[i]+k2
	plt.plot(x,y, "--r")
	plt.text(-0.5, 3,'Masodrendu Runge-Kutta (h=0.8)',color='red', fontsize=10)
def RungeKutta4th(f, h, x0, y0):
	x=np.arange(0, 10, h)
	y=x*0
	y[0]=y0
	for i in range(10):
		k1=h*f(x[i],y[i])
		k2=h*f(x[i]+h/2,y[i]+k1/2)
		k3=h*f(x[i]+h/2,y[i]+k2/2)
		k4=h*f(x[i]+h,y[i]+k3)
		y[i+1]=y[i]+(k1+2*k2+2*k3+k4)/6
	plt.plot(x,y, "--g")
	plt.text(5, 3,'Negyedrendu Runge-Kutta (h=0.8)',color='green', fontsize=10)
ypontos()
RungeKutta2nd(f, h, x0, y0)
RungeKutta4th(f, h, x0, y0)
plt.show()

A program lefuttatása után egy grafikonon összehasonlíthatjuk a másodrendű illetve 4.-edrendű Runge-Kutta módszereket illetve a tényleges megoldást.