Andreordens difflikningar

Vi har sett på korleis vi kan bruka Eulers metode for å løysa førsteordens difflikningar. No skal vi sjå korleis vi kan utvida den til andreordens likningar.

Ei andreordens likning er ei likning der den andrederiverte $y''$ er med. Vi skal gå rett på et eksempel:

$ y'' = y$, og $y(0)= 2$, $y'(0) = 0$

Den eksakte (analytiske) løysinga er

$y(t) = e^t + e^{-t}$

Metoden for å løysa ei slik likning er å innføra eit anna navn for den deriverte av y. Sidan vi ofte har at y og x er posisjonane, så blir den deriverte av y det same som farten (i y-retning). Så vi set:

$v(t) = y'(t)$

Då kan vi skriva difflikninga vår som:

$v'(t) = y(t)$,

og vipps, så har vi ei førsteordens likning! Initialbetingelsane bør vi då skriva: $y(0) = 2, v(0) = 0.$

Dette betyr at vi har erstatta ei enkel andreordens likning med to førsteordens, som vi må løysa samtidig. Det vil sei at vi må ha ei løkke der vi reknar ut både y(t) og v(t) iterativt. Koden ser slik ut:

In [3]:
import numpy as np
import matplotlib.pyplot as plt

a = 0  # Fra-verdi
b = 2.0   # Til-verdi
dt = 0.05 #steglengde
t = np.arange(a,b,dt)
n = int((b-a)/dt)

def eksakt(t):
    return np.exp(t) + np.exp(-t)

def f(y):
    return y

y = np.zeros(n,float)
v = np.zeros(n,float)

# Initialbetingelsar
y[0] = 2
v[0] = 0 

for j in range(0,n-1):
    #Eulers metode:
    v[j+1] = v[j] + f(y[j])*dt
    y[j+1] = y[j] + v[j]*dt
    
plt.plot(t,eksakt(t),label="Eksakt løysing")
plt.plot(t,y,label="Eulers metode")
plt.legend()
plt.grid()
plt.show()

Oppgaver

Løys difflikningane numerisk:

  1. $y'' + 3y' -10y = 0$ med initialbetingelsane $y(0) = 1$ og $y'(0) = 0$

    Eksakt svar: $\frac{5}{7} \cdot e^{2x} + \frac{2}{7} \cdot e^{-5x}$

  2. $y'' +y' -2y = 0$ med initialbetingelsane $y(0) = 2$ og $y'(0) = 0$

    Eksakt svar: $ \frac{4}{3} \cdot e^x + \frac{2}{3}\cdot e^{-2x}$

  3. Erstatt linja

    y[j+1] = y[j] + v[j]\*dt
    med koden
    y[j+1] = y[j] + v[j+1]*dt
    Ser du nokon endring? (Dette kallast Euler-Cromer metoden)