Runge-Kutta metoden er en familie av numeriske algoritmer som gir tilnærmete løsning på differensiallikninger. Metoden ble utviklet omkring år 1900 av C. Runge og M. W. Kutta.
Introduksjon
Følgende initialverdiproblem betraktes:
Der er derivert med hensyn på . Det antas at
er en komplisert funksjon, og at vi ikke har en eksplisitt løsning. For å generere en løsning er det ønskelig å bevege
seg fra til , og videre til . Da må den deriverte approksimeres. Runke-Kutta metoden gjør dette ved å gjentatte ganger sette inn forskjellige verdier i funksjonen , og velge lineære kombinasjoner
lik at flest mulig ledd i Taylor-utviklingen til stemmer overens med .
En andre ordens metode
I denne seksjonen utledes en andre-ordens metoden for initialverdiproblemet:
Der kun er en funksjon av . En Runge-Kutta metode er
der er skrittlengde, , og er konstanter.
For å få en andre ordens metode må konstantene stemme overens med Taylor-utviklingen av .
Taylor-utviklingen til er gitt av:
Dersom vi bruker taylor på likningen ovenfor, kan den skrives som:
Kravene for en andre ordens metoden blir at og . En andre ordens metode er derfor gitt ved:
Metoden ovenfor samsvarer med valget , og .
En fjerde ordens metode
For å utlede en fjerde ordens metode må man sette opp konstanter, utvide Taylorrekken og velge konstater
slik at kun ledd med grad og høyere gjenstår. Den vanligste fjerde ordens metoden er:
for n = 0, 1, 2, 3, . . . , der
Dett er er metoden som oftest blir forbundet med Runge-Kutta. Legg merke til at metoden ovenfor
krever 4 funksjonsevalueringer. Grunnen til at man som oftest ikke går høyere enn fjerde orden,
er fordi høyere orden krevere flere funksjonsevalueringer enn ordenen man får.
Implementasjon av RK4
Fjerde ordens Runge-Kutta er rimelig enkelt å implementere, og gir gode resultater.
Nedenfor er en implementasjon i Python, av RK4 slik den er gitt av[1]
defrunge_kutta4(y_n,t_n,h,f):''' Gir y_n+1 ved hjelp av Runge Kutta 4. '''# Konstanterk1=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 verdireturny_n+(h/6)*(k1+2*k2+2*k3+k4)deff(t,y):''' Funksjon til den deriverte. '''return0.5*y# Startverdi, skrittlengde, starttid og sluttidy_0,h,t_0,t_end=1,2,0,10tider=[iforiinrange(t_0,t_end+h,h)]# Liste for tideny_verdier=[y_0]# Liste for y-verdierforiinrange(0,len(tider)-1):y_n,t_n=y_verdier[i],tider[i]# Hent y og ty_verdier.append(runge_kutta4(y_n,t_n,h,f))# Regn ut neste verdi
Generelle metoder
Generelt er en stegs Runge-Kutta metode gitt av likningene[2]:
Der , og er konstanter. For å få ønsket orden må disse konstatene stemme overens med Taylor-utviklingen. Konstantene kan organiseres i et RK-tablå: