Eulers metode#

Eulers metode er en algoritme for å finne numeriske løsninger til ordinære differensialligninger. I naturvitenskapen beskriver slike likninger som oftest en størrelse og endringen av denne størrelsen over tid. Eksempler på dette kan være populasjonsvekst i en bakteriekultur eller fartsendring til et objekt som faller i et gravitsjonsfelt. Eulers metode brukes for å finne numeriske løsninger på slike problemer når du kjenner en initialverdi.

Som et generelt utgangspunkt for Eulers metode antar vi at vi har en ordinær differensiallikning på formen:

\[ y' = f(x,y) \]

I dette eksemplet tenker vi oss at vi har en funksjon \(y\) (som vi ikke vet hvordan ser ut) og differensiallikningen \( y' = y \) (som beskriver hvordan systemet endrer seg). Vi har i tillegg initialbetingelsen \( y(0) = 1 \). Dette kan for eksempel være en beskrivelse av eksponentiell vekst i en bakteriekultur, hvor vi vet antall bakterier vi starter med ved tidspunktet \( t = 0 \).

Vi ønsker nå å bruke Eulers metode for å finne denne verdien numerisk. For å få til dette må vi starte et sted som vi vet noe om. I dette tilfellet bruker vi initialbetingelsen \( y(0) = 1 \), og starter derifra. Vi må også bestemme oss for en \( \Delta t \) som er hvor store “skritt” vi skal ta mellom hver beregning.

Med Eulers metode kan vi simulere hvordan et system oppfører seg over tid, selv om vi ikke har en matematisk funksjon som beskriver systemet. Grunnprinsippet er at hver nye verdi beregnes med utgangspunkt i den forrige.

Vi tar utgangspunkt i \( y' = y \), og skriver \(y'\) som \(\Delta y / \Delta t\):

\[ \frac{\Delta y}{\Delta t} = y_n \]

Her er \(\Delta y\) forskjellen mellom nåværende og neste y-verdi, når vi har beveget oss med tidsskrittet \(\Delta t\). Vi kan skrive det som:

\[ \frac{y_{n+1} - y_n}{\Delta t} = y_n \]

Vi gjør om slik at vi får et uttrykk for neste y-verdi:

\[ y_{n+1} = y_n + \Delta t \cdot y_n \]

Vi skal nå regne ut \(y'(0)\) med utgangspunkt i initialbetingelsen. Vi vet at \(y'= y\) og \(y(0) = 1\). Dette betyr at \(y'(0)=1\).

Neste skritt er å øke \(t\) med \(\Delta t\) og regne ut en gang til. Vi lar \(\Delta t = 1\)

\[y(1) = y(0) + \Delta t \cdot y(0) = 1 + 1 \cdot 1 = 2\]

Vi kan nå bruke dette resultatet til å regne ut neste verdi: $\(y(2) = y(1) + \Delta t \cdot y(1) = 2 + 1 \cdot 2 = 4\)$

Slik kan vi fortsette helt til vi har regnet ut \(y(5)\) som i tabellen under.

\(t\)

\(y\)

\(y'\)

0

1

1

1

2

2

2

4

4

3

8

8

4

16

16

5

32

32

Euler

I dette eksemplet har vi ikke sagt noe om hvordan funksjonen \(y\) ser ut, og normalt kjenner vi heller ikke denne. I dette tilfellet vet vi det, og vi har at \(y\) er eksponentialfunksjon \(e^x\). Siden vi her kjenner den virkelige funksjonen, kan vi sammenlikne våre numeriske tilnærminger med de virkelige verdiene. Vi kjenner også startverdien \(y_0\).

# Importerer nødvendige biblioteker
import matplotlib.pyplot as plt
import numpy as np

# Initialbetingelser
y0 = 1
delta_t = 1

# For hvilken t skal beregningene stoppe?
max_t = 5

# Eksakt løsning
def A(x, k):
    return k * np.exp(x)

# Eulers metode for denne spesifikke problemstillingen
def next_y(t, yn):
    return yn + t * yn

# x-verdier for plotting av eksakt løsning
x = np.arange(0, max_t, 0.1)
y = []

# Regner ut eksakt løsning
for i in x:
    y.append(A(i, y0))

# x-verdier for plotting av Euler
xe = np.arange(0, max_t, delta_t).tolist()

# Initialiserer med startverdien for ye
ye = [y0] 

# Bruker Eulers metode for å regne ut neste y-verdi
for verdi in xe:
    ye.append(next_y(delta_t, ye[-1]))

# Legger til den siste x-verdien
xe.append(xe[-1] + delta_t)

# Utskrift av data
plt.grid() # Lager rutenett
plt.xlabel('$t$') # Merker x-aksen
plt.ylabel('$A(t)$') # Merker y-aksen
plt.plot(x, y, label='$f(x)=e^x$')
plt.plot(xe, ye, label='Euler med $\Delta t={}$'.format(delta_t))
plt.legend()
plt.show()
../../_images/euler_2_0.png

Oppsummering#

Gitt at vi har en førsteordens lineær differensiallikning:

\[ \frac{dy}{dx} = f(x,y) \]

Vi har også gitt initialbetingelsene:

\[ y(x_0) = y_0 \]

Vi bestemmer oss for en “skrittlengde” \(\Delta x\) som er avstanden mellom hvert nye estimat vi beregner med Eulers metode. En liten \(\Delta x\) gir mer presise estimater, men “koster mer” i form av mange beregninger som må utføres. Med Eulers metode kan vi nå finne estimater for neste x og y:

\[ x_{n+1} = x_n + \Delta x \]
\[ y_{n+1} = y_n + \Delta x \cdot f(x_n,y_n) \]

Oppgaver#

  1. Ta utgangspunkt i eksempelet over. Endre på step-verdien \(\Delta x\), gjør den gradvis mindre og mindre (la den nærme seg 0). Hva observerer du?

  2. Kan du løse differensiallikningen \(\frac{dy}{dx}=x+2y\) numerisk når \(y(0)=0\)? Bruk \(\Delta x = 0.1\). Finn eksakt løsning med f.eks Wolfram Alpha, og sammenlign med funksjonen du kommer frem til.

  3. En realistisk modell for luftmotstand kan være \(L = k \cdot v^2\). Lag et program som beregner \(v(t)\) ved hjelp av Eulers metode når du vet at \( \sum F = G - L \). (Hint: Husk at \(F = m \cdot a = m \cdot v'\))

  4. Lag et program som viser hvordan en bakteriekultur vokser når vi starter med \(20 \) bakterier ved tiden \(t=0\) s. Populasjonen dobles hver time. Hva er populasjonen etter 7 timer, og når vil populasjonen nå \(1 \cdot 10^6\) bakterier.

  5. Lag et program som bruker Eulers metode på en annen modell som du velger selv.