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] * dtMen hvis vi endrar den slik så blir resultatet meir nøyaktig:
x[j+1] = x[j] + v[j+1] * dtOg dette er altså det som kallast Euler-Cromers metode. La oss like godt sjå på koden:
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()