ODE

:(

timestep

Euler

Midpoint

RK4

zoom

Ordinära differentialekvationer - ODE

Min plan var att göra en pendel men först vill jag ha en bra ode-lösare.

Det finns ett exempel i slutet som du kan hoppa till om du redan är inläst.

Vi börjar med att definiera problemet:

dydx=f(y,x)

Vi säger att funktionen f deriverar y med avseende på x

Man kan såklart sätta x=t för att få:

y'=f(y,t)

Eulers metod

Den lättaste lösningen är Eulers-metod: (aka Eulers stegmetod, Eulersteg, osv.)

y'=f(y,t), y0=y(t0)

y'=ΔyΔt=yn+1-yntn+1-tnyn+1=yn+y'Δt

yn+1=yn+f(yn,tn)Δt

Vi testar med det lättaste fallet:

y'=y, y0=1

Vilket ger oss: (tidsinvariant)

f(y,t)=y

yn+1=yn+ynΔt=yn(1+Δt)

Man ser snabbt i plotten att Eulers metod underskattar funktionsvärdet.
Man kan räkna ut felet med hjälp av en annan härledning av Eulers metod.
Vi börjar med taylor-serien för y i punkt a:

y(t)=y(a)+y(a)(ta)+y(a)2!(ta)2+...=n=0y(n)(a)n!(ta)n

Nu byter vi ut y' mot f(y,t) med a=tn och skriver det i diskret form:

yn+1=yn+f(yn,tn)(tn+1tn)+f(yn,tn)2!(tn+1tn)2+...+f(n)(yn,tn)n!(tn+1tn)n

Med (tn+1tn)=Δt blir de första två termerna:

yn+1=yn+f(yn,tn)Δt

Det ser ju i princip exakt ut som uttrycket för Eulers metod.
Därför kan vi subtrahera bort uttrycket för Eulers metod från taylor-utvecklingen och få felet:

εn=n=2f(n)(yn,tn)n!Δtn=f(yn,tn)2!Δt2+...+f(n)(yn,tn)n!Δtn

Hur ska vi då göra för att minska felet?
En bra start kan ju vara att plocka lite fler termer från taylor-serien, då tar det längre tid för felet att ackumuleras.
Problemet blir att derivera f...

Kan det finnas något annat sätt att minska felet?

Eftersom vi räknar med derivatan i punkt n kommer
den hinna ändras hos lösningen innan vi når punkt n+1.
Om man istället tar ett eulersteg från n-1 till n och sedan ett till n+1
och räknar derivatan från n-1 till n+1
borde den stämma bättre överens med den sanna funktionen.

Kolla bara på dom gröna linjerna, dom ser ju ut att stämma rätt bra,
vi måste bara komma ihåg att dela med 2.

Mittpunktsmetoden

Mittpunktsmetoden/modifierat eulersteg: (likt trapetsmetoden)
För att ta vårt extra steg kan vi ju helt enkelt mata funktionen f med sig själv.

y'=f(y,t), y0=y(t0)

yn+1=yn+f(yn+f(yn,tn)Δt2,tn+Δt2)Δt

I exemplet y=y=f(y,t),y0=y(t0)=1 blir mittpunktssteget:

yn+1=yn+ynΔt+ynΔt22

Vilket är Eulersteget med en extra term från taylor-serien. I plotten syns att mittpunktsmetoden är betydligt bättre än Eulers metod.
Men vi har fler termer i taylor-serien så vi kan hitta en bättre lösning.


Runge-Kutta 4

Alla metoderna ovan är del av Runge-Kutta familjen.
RK4 blir sista bossen idag.
Då Eulersteget inkluderar 2 termer från taylor-utvecklingen kallar vi den en första ordningens Runge-Kutta metod. (Vi räknar inte första termen)
Då följer att mittpunktsmetoden blir en andra ordningens RK metod.
Vi skiter i 3:dje ordningens metoder och går direkt på 4:de

y=f(y,t),y0=y(t0)

k1=f(yn,tn)

k2=f(yn+k12Δt,tn+Δt2)

k3=f(yn+k22Δt,tn+Δt2)

k4=f(yn+k3Δt,tn+Δt)

yn+1=yn+Δt6(k1+2k1+2k3+k4) yn+1=yn+ynΔt+ynΔt22

Här tar man 4 skattningar och räknar ut ett viktat genomsnitt av derivatan. Hemläxa blir att härleda yn+1 för:

y=y=f(y,t),y0=y(t0)=1

Fet hint: det är en fjärde ordningens metod


Formeln för RK4 ser ut som en röra så för att snygga till det finns Butcher-tabellen:

c1 a11 a12 ... a1s
c2 a21 a22 ... a2s
...
Cs as1 as2 ... ass
b1 b2 ... bs

Där:

i=1sbi=1 j=1saij=ci

RK4:s tabell:

0
½½
½0½
1001

Tabellerna ovan kan användas i formeln:

kni=f(yn+Δtj=1i1aijknj,tn+ciΔt)

yn+1=yn+Δti=1sbikni

Och här är Butcher-tabellerna för Euler:

0
1

och för midpoint:

0
αα
(112α)12α

Där α=12 Ger mittpunktsmetoden och α=1 ger Heuns metod.



Så alla dessa metoder är bara diskreta integratorer, vilket inte låter särskillt spännande,
man behöver ju inte vara Einstein reinkarnerad för att lösa exempel-ekvationen...
Men det finns system där ett försök till en analytisk lösning vore psykologiskt självmord.
Om det låter spännande har jag gjort ett exempel: Lorentz-attraktorn

Alternativt om man föredrar en extra dimension: Lorentz 3D

RÖSTERNA ÄR TILLBAKA