Løsning til initialverdiproblemet {\displaystyle {\dot {y}}=0.5t,\quad y(0)=1}.
**Runge-Kutta-metoder** er en familie av numeriske metoder som gir tilnærmete løsninger på differensiallikninger. Metoden ble utviklet omkring år 1900 av de tyske matematikerne Carl Runge og Martin Wilhelm Kutta.

Introduksjon
------------

Følgende initialverdiproblem betraktes:

{\displaystyle {\dot {y}}=f(t,y),\quad y(t\_{0})=y\_{0}.}
Der {\displaystyle {\dot {y}}} er {\displaystyle y} derivert med hensyn på {\displaystyle t}. Det antas at {\displaystyle f(t,y)} er en komplisert funksjon, og at vi ikke har en eksplisitt løsning på problemet. For å generere en løsning er det ønskelig å bevege seg fra {\displaystyle y\_{0}} til {\displaystyle y\_{1}}, og så videre til {\displaystyle y\_{n}}. Da må den deriverte approksimeres. Runge-Kutta metoden gjør dette ved å gjentatte ganger sette inn forskjellige verdier i funksjonen {\displaystyle f(t,y)}, og velge lineære kombinasjoner slik at flest mulig ledd i Taylor-utviklingen til {\displaystyle y\_{n+1}} stemmer overens med {\displaystyle y(t)}.

En andre ordens metode
----------------------

I denne seksjonen utledes en andre-ordens metode for initialverdiproblemet:

{\displaystyle {\dot {y}}=f(y),\quad y(t\_{0})=y\_{0}.}
Der f kun er en funksjon av {\displaystyle y}. En Runge-Kutta metode er gitt ved:

{\displaystyle y\_{n+1}=y\_{n}+h\left[b\_{1}f(y\_{n})+b\_{2}f(y\_{n}+ha\_{1}f(y\_{n}))\right]}
der h er skrittlengde og {\displaystyle b\_{1}}, {\displaystyle b\_{2}} og {\displaystyle a\_{1}} er konstanter. For å få en andre ordens metode må konstantene stemme overens med Taylor-utviklingen av {\displaystyle y(t)}.Taylor-utviklingen til {\displaystyle y(t)} rundt {\displaystyle t} er gitt av: 

{\displaystyle y(t+h)\approx y(t)+h{\dot {y}}(t)+{\frac {1}{2}}h^{2}{\ddot {y}}(t)+...}
Dersom metoden ovenfor utvides, kan den skrives som:

{\displaystyle y\_{n+1}=y\_{n}+h\left[b\_{1}+b\_{2}\right]{\dot {y}}\_{n}+h^{2}\left[a\_{1}b\_{2}\right]{\ddot {y}}\_{n}+...}
Kravene for en andre ordens metode blir derfor at {\displaystyle b\_{1}+b\_{2}=1} og {\displaystyle a\_{1}b\_{2}=1/2}. En (av flere mulige) andre ordens metode er derfor gitt ved:

{\displaystyle y\_{n+1}=y\_{n}+hf(y\_{n}+h{\frac {1}{2}})}
Metoden ovenfor samsvarer med valget {\displaystyle b\_{1}=0}, {\displaystyle b\_{2}=1} og {\displaystyle a\_{1}=1/2}.

En fjerde ordens metode
-----------------------

For å utlede en fjerde ordens metode må man sette opp konstanter, utvide Taylor-rekken og velge konstater slik at kun ledd med grad {\displaystyle h^{5}} og høyere gjenstår. En av de vanligste fjerde ordens metodene er:

{\displaystyle {\begin{aligned}y\_{n+1}&=y\_{n}+{\tfrac {h}{6}}\left(k\_{1}+2k\_{2}+2k\_{3}+k\_{4}\right)\\t\_{n+1}&=t\_{n}+h\\\end{aligned}}}
for *n* = 0, 1, 2, 3, . . . , der

{\displaystyle {\begin{aligned}k\_{1}&=f(t\_{n},y\_{n}),\\k\_{2}&=f(t\_{n}+{\tfrac {h}{2}},y\_{n}+{\tfrac {h}{2}}k\_{1}),\\k\_{3}&=f(t\_{n}+{\tfrac {h}{2}},y\_{n}+{\tfrac {h}{2}}k\_{2}),\\k\_{4}&=f(t\_{n}+h,y\_{n}+hk\_{3}).\end{aligned}}}
Dette er metoden som oftest blir forbundet med Runge-Kutta. Legg merke til at metoden ovenfor krever at vi evaluerer funksjonen f 4 ganger. Grunnen til at man som oftest ikke går høyere enn fjerde orden er fordi høyere orden krever flere funksjonsevalueringer enn ordenen man får.

### Implementasjon av RK4

Fjerde ordens Runge-Kutta er rimelig enkel å implementere, og gir gode resultater sammenlignet med lavere ordens metoder. Nedenfor er en implementasjon i Python av RK4

```
def runge\_kutta4(y\_n, t\_n, h, f):
    '''
 Gir y\_n+1 ved hjelp av Runge Kutta 4.
 '''
    # Konstanter
    k1 = f(t\_n, y\_n)
    k2 = f(t\_n + h/2, y\_n + (h/2)\*k1)
    k3 = f(t\_n + h/2, y\_n + (h/2)\*k2)
    k4 = f(t\_n + h,   y\_n + h \* k3)
    
    # Regn ut og returner neste verdi
    return y\_n + (h/6)\*(k1 + 2\*k2 + 2\*k3 + k4)

def f(t, y):
    '''
 Funksjon til den deriverte.
 '''
    return 0.5 \* y
    
# Startverdi, skrittlengde, starttid og sluttid
y\_0, h, t\_0, t\_end = 1, 2, 0, 10 
tider = [i for i in range(t\_0, t\_end+h, h)] # Liste for tiden
y\_verdier = [y\_0]                           # Liste for y-verdier

for i in range(0, len(tider)-1):
    y\_n, t\_n = y\_verdier[i], tider[i]               # Hent y og t
    y\_verdier.append(runge\_kutta4(y\_n, t\_n, h, f))  # Regn ut neste verdi

```

Generelle metoder
-----------------

Generelt er en \nu stegs Runge-Kutta metode gitt av likningene:

{\displaystyle y\_{n+1}=y\_{n}+h\sum \_{j=1}^{\nu }b\_{j}f\left(t\_{n}+c\_{j}h,\xi \_{j}\right)}
{\displaystyle \xi \_{j}=y\_{n}+h\sum \_{i=1}^{\nu -1}a\_{\nu ,i}f(t\_{n}+c\_{i}h,\xi \_{i})}
Der {\displaystyle a\_{\nu ,i}}, {\displaystyle b\_{j}} og {\displaystyle c\_{i}} er konstanter. For å få ønsket orden må disse konstantene stemme overens med Taylor-utviklingen. Konstantene kan organiseres i et RK-tablå:

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

Kilder
------

* Iserles, Arieh (29. desember 2008). *A First Course in the Numerical Analysis of Differential Equations* (2nd edition utg.). Cambridge ; New York: Cambridge University Press. ISBN 978-0-521-73490-5. CS1-vedlikehold: Ekstra tekst (link)
* Kincaid, David; Ward, Cheney (25. oktober 2001). *Numerical Analysis: Mathematics of Scientific Computing* (3 edition utg.). Pacific Grove, CA: Brooks Cole. ISBN 978-0-534-38905-5. CS1-vedlikehold: Ekstra tekst (link)

|  |  |
| --- | --- |
| Oppslagsverk/autoritetsdata | MathWorld
 |