Euler-Cromers metode

Vi har sett på korleis vi kan skrive om ein andreordens difflikning som eit sett av to førsteordens. Men det er noken detaljar vedrørande rekkefølgen på oppdateringa av dei to variablane som viser seg å ha stor betydning for resultatet.

Vi skal sjå på eit eksempel der forskjellen blir veldig tydelig, nemlig eit svingesystem. (Sjå også eksempelet med pygame)

Problemet vi skal løysa er:

$ x'' = -x$ med initialbetingelsar $x(0) = 1, x'(0) = 0$

Dette representerer ei forenkla svingesystem med masse 1kg og fjørkonstant k = 1, som svingar i x-retning. Så x(t) er vår søkte funksjon, og vi veit at den er $x(t) = cos(t)$.

Vi skal først løysa denne med den vanlige Euler-metoden, der oppdateringen for x ser slik ut:

x[j+1] = x[j] + x[j] * dt
Men hvis vi endrar den slik så blir resultatet meir nøyaktig:
x[j+1] = x[j] + v[j+1] * dt
Og dette er altså det som kallast Euler-Cromers metode. La oss like godt sjå på koden:

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

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

def eksakt(t):
    return np.cos(t)

def f(x):
    return -x

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

x_ec = np.zeros(n,float)
v_ec = np.zeros(n,float)

x[0] = 1
v[0] = 0

x_ec[0] = 1
v_ec[0] = 0

for j in range(0,n-1):
    #Eulers metode bruker v[j]
    v[j+1] = v[j] + f(x[j])*dt
    x[j+1] = x[j] + v[j]*dt
    
    # Euler-Cromers metode bruker v_ec[j+1]
    v_ec[j+1] = v_ec[j] + f(x_ec[j])*dt
    x_ec[j+1] = x_ec[j] + v_ec[j+1]*dt

    
plt.plot(t,eksakt(t),label="Eksakt løysing")
plt.plot(t,x,label="Eulers metode")
plt.plot(t,x_ec,label="Euler-Cromers metode")
plt.legend()
plt.grid()
plt.show()

Forklaring

  1. For å samanlikna Euler med Euler-Cromer, så lagar vi to sett med variable. Eit sett (x og v) som lagrar løysinga med Euler, og eit anna sett (x_ec og v_ec) som lagrar løysinga på Euler-Cromer. Men det viktigaste er at EC-metoden brukar farten frå samme tidspunkt, dvs. med indeksen t+1. Denne vesle forskjellen har altså store konsekvensar her.
  2. Som vi ser, skjer det to ting med Eulers metode. For det første er feilen større enn Euler-Cromer (der feilen er så liten at vi ikkje ser forskjell frå den eksakte løysinga). For det andre blir feilen større og større. Det betyr at Eulermetoden ikkje bevarer energi. Det vi modellerer her, er frie svingningar utan demping, og då skal løysinga ha konstant amplitude. Men vi ser at Eulermetoden gir aukande amplitude, som svarar til at svingesystemet får meir og meir energi. Så dette er ei ufysisk løysing.
In [ ]: