Den simpleste måde at løse differentialligninger på blev introduceret
af den schweiziske matematiker Leonhard Euler (1707-1783) og kaldes
derfor Euler-metoden.
Se på differentialligningen:
Kendes en værdi af den afhængige variabel, , til en
bestemt værdi af den uafhængige variabel, "tiden" ,
kan senere værdier bestemmes med Euler-metoden, der iterativt
frembringer løsningen ved at tage små tidsskridt fra det 'te til
det 'te punkt på en diskret repræsentation af kurven:
I Euler-metoden beregnes den næste funktionsværdi alene på basis
af den aktuelle differentialkvotient. Dvs. tid og funktionsværdi
fremskrives til første orden i en skridtlængde, .
Denne metode er eksakt hvis er uafhængig af og ,
men hvis varierer, akkumulerer
Euler-metoden hurtigt fejl. Disse kan reduceres ved anvendelse
af højereordensdifferentialigningsløsere.
En måde at forbedre
Euler-metoden på er vist i figuren ovenfor. Her beregnes først én hældning,
, for det aktuelle punkt, dernæst en ny hældning, , "et
halvt skridt fremme" for så endeligt at tage hele skridtet baseret
på denne, nye hældning:
En sådan fremgangsmåde kaldes en Runge-Kutta-metode efter dens opfindere,
C. Runge og M.W. Kutta. Metoden er af 2. orden da den akkumulerede fejl
vokser proportionalt med
.
Betragt differentialligningen,
for
.
a) Løs først differentialligningen efter Euler-metoden:
implementeret som en for
-løkke, noget i stil med dette
ufuldstændige program, hvor t
og y
beskriver til at starte med og så løbende opdateres:
ts = [t]
ys = [y]
for _ in np.arange(t,tmax,delta_t):
y += ...
t += ...
ts.append(t)
ys.append(y)
Plot resultatet for 3 forskellige værdier af , fx ,
og .
b) Gentag spgm. a) idet du løser differentialligningen efter en
2. ordens Runge-Kutta metode:
c) Løs nu differentialligningen under anvendelse af
solve_ivp
, hvor parameteren, der tilsvarer
hedder
max_step
.
d) Skriv til sidst din løsning til spgm. b) som en funktion,
my_ivp_solver
,
der kaldes med tre positionelle argumenter og et keyword-argument:
-
en funktionshenvisning til en
funktion, , der returnerer
-
en liste,
, der angiver start og slutværdier for tiden,
-
en liste med ét tal, , der er startværdien for ,
dvs. .
-
et keyword-argument,
max_step
, der angiver værdien af
.
Lad endvidere din funktion aflevere de to lister med tider og
funktionsværdier på samme måde som
solve_ivp
, hvilket
kan gøres ved at sætte dem på som attributter til en ellers "tom"
funktion:
...
f = lambda x: None
f.t = np.array(ts)
f.y = np.array([ys])
return f
(Dette er lidt et hack, hvor det udnyttes at man kan sætte attributter
på funktioner. f
kunne have været et andet python
objekt end lige en funktione, men fx ikke en integer eller en liste.)
Hvis du skriver koden rigtigt skal du kunne udskifte
solve_ivp
med my_ivp_solver
i din kode
til spørgsmål c og få samme plot som i delspørgsmål b.