Hopp til innhold

Runge-Kutta-metoder

Fra Wikipedia, den frie encyklopedi
Løsning til initialverdiproblemet .

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]

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

Kilder

  1. ^ Numerical Analysis, David Kincaid, Ward Cheney
  2. ^ A First Course in the Numerical Analysis of Differential Equations, Arieh Iserles