Differensiallikninger (oppgaver)#

Differensiallikninger#

Vi har sett på modeller som beskriver endringer ved bestemte tidssteg, for eksempel i smittemodellen vår:

\[I_{n+1}=I_n+aI_nS_n\]

som er det samme som å skrive:

\[\Delta I = aI_nS_n\]

Dette er eksempler på differenslikninger, der vi finner en tallfølge, som for eksempel beskriver antall smittede i en populasjon. Men hva hvis vi gjør tida mellom endringene så liten som mulig? Da får vi ikke en differenslikning, men en differensiallikning.

En differensiallikning er en likning som inneholder den deriverte (altså den momentane endringen) av en funksjon, for eksempel:

\[y' = 1\]
\[y' = y\]
\[y' - 2x = -1\]

Vi har dermed uttrykk for en momentan endring. Likningene ovenfor er løsbare, men de fleste differensiallikninger er ikke det. Derfor er numeriske metoder for løsing av difflikninger svært viktige å kunne.

Eksempler#

Det viser seg at vi faktisk ofte kjenner til endringen (f’(x)) i et system framfor tilstanden (f(x)). Eksempler på dette er:

  • Newtons 2. lov: \(\Sigma F = ma \Leftrightarrow v' = \frac{\Sigma F}{m}\).

  • Populasjonsdynamikk: \(B'(t) = k\cdot B(t)\) og \(B'(t) = a\cdot B(t)\left(1-\frac{B(t)}{b} \right)\).

  • Smittemodeller: \(I'(t) = aI(t)S(t)\).

Underveisoppgave: Differensiallikninger

Forklar hva en differensiallikning er og hvorfor Newtons 2. lov og modeller for populasjonsvekst og smitte kan formuleres som differensiallikninger.

Eulers metode for å løse differensiallikninger#

Eulers metode er en enkel metode som brukes til å løse differensiallikninger. Det vil si at vi finner en funksjon dersom vi har gitt et uttrykk for den deriverte av funksjonen.

Siden vi går fra f’(x) til f(x), integrerer (antideriverer) vi differensiallikningen. Eulers metode går ut på å finne en verdi for \(f(x + \Delta x)\) gitt en startverdi \(f(x_0)\) og et uttrykk for \(f'(x)\):

\[f(x+\Delta x) \approx f(x) + f'(x)\cdot \Delta x\]

Dette er en iterativ algoritme. Vi starter derfor med \(f(x_0)\) og finner de påfølgende funksjonsverdiene slik:

\[f(x_1) \approx f(x_0) + f'(x_0)\cdot \Delta x\]
\[f(x_2) \approx f(x_1) + f'(x_1)\cdot \Delta x\]
\[f(x_3) \approx f(x_2) + f'(x_2)\cdot \Delta x\]
\[...\]

Underveisoppgave: Eulers metode

Utled Eulers metode fra den numeriske tilnærmingen til den deriverte (Newtons kvotient/framoverdifferansen).

Et program som løser differensiallikninger#

Siden vi skal løse differensiallikningene på en datamaskin, må vi jobbe med funksjonsverdier, ikke funksjonsuttrykk. Vi setter derfor opp noen startbetingelser som definerer intervallet vi skal integrere over.

x_start = 0                   # Startverdi
x_slutt = 5                   # Sluttverdi
dx = 1E-5                     # Steglengde mellom x-verdiene
N = int((x_slutt-x_start)/dx) # Antall intervaller
y0 = 1                        # Initialbetingelse

Underveisoppgave: Startverdier

Forklar hva de ulike størrelsene i programmet ovenfor betyr. Skriv ned de størrelsene du ikke forstår.

Så trenger vi å definere funksjonen. La oss ta en enkel funksjon: \(f'(x) = 1\). Definer funksjonen i vinduet nedenfor som en Python-funksjon. For å sjekke at du har gjort riktig, skriv ut et funksjonskall. Dette bør skrive ut 1 uansett argumentverdier i funksjonen. Teknisk sett trenger ikke funksjonen noen parametere, men vi pleier å definere både x og y som parametre i en funksjon som representerer en difflikning.

Nå kan vi legge til noen tomme arrayer som vi skal fylle med verdier:

from pylab import *

x = zeros(N+1)
y = zeros(N+1)

Underveisoppgave: Arrayer

Legg inn arrayene i programmet. Prøv å forklare hvorfor vi lager N+1 verdier, og ikke N, ved å tegne opp et intervall fra 0 til 5 med steglengde (dx) 1. Hvor mange intervaller har vi, og hvor mange verdier har vi?

Nå kan vi løse differensiallikningen med Eulers metode. En pseudokode for dette kan se slik ut:

gjenta N ganger:
    y_{n+1} = y_n + yderivert(y_n, x_n)*dx
    x_{n+1} = x_n + dx

Bruk Eulers metode til å løse differensiallikningen og plot y som funksjon av x:

Oppgaver#

Bruk funksjonen \(y' = y + x\) når du løser oppgavene nedenfor.

a) Lag programmet ovenfor uten funksjoner. Hvor må differensiallikningen være i programmet nå?

b) Lag programmet ovenfor med lister istedenfor arrayer. Hva syns du er enklest?

c) Plott løsninger for fem ulike initialbetingelser i samme plott. Hva sier dette oss om løsningen til en differensiallikning?