En mi respuesta a una pregunta sobre MSE con respecto a una simulación de física hamiltoniana en 2D, he sugerido usar un integrador simpléctico de orden superior .
Entonces pensé que podría ser una buena idea demostrar los efectos de diferentes pasos de tiempo en la precisión global de los métodos con diferentes órdenes, y escribí y ejecuté un script Python / Pylab para ese efecto. Para comparar, elegí:
- ( leap2 ) El ejemplo de segundo orden de Wikipedia con el que estoy familiarizado, aunque lo conozco bajo el nombre de leapfrog ,
- ( ruth3 ) Integrador simpléctico de tercer orden de Ruth ,
- ( ruth4 ) Integrador simpléctico de cuarto orden de Ruth .
Lo extraño es que, cualquiera que sea el paso de tiempo que elija, el método de tercer orden de Ruth parece ser más preciso en mi prueba que el método de cuarto orden de Ruth, incluso por un orden de magnitud.
Mi pregunta es por lo tanto: ¿qué estoy haciendo mal aquí? Detalles abajo.
Los métodos despliegan su fuerza en sistemas con Hamiltonianos separables , es decir, aquellos que pueden escribirse como
En nuestra configuración, podemos normalizar fuerzas y momentos por las masas a las que se aplican. Así, las fuerzas se convierten en aceleraciones, y los momentos se convierten en velocidades.
Los integradores simplécticos vienen con coeficientes especiales (dados, constantes) que denominaré y . Con esos coeficientes, un paso para evolucionar el sistema de tiempo a tiempo toma la forma
Para :
- Calcule el vector de todas las aceleraciones, dado el vector de todas las posiciones
- Cambiar el vector de todas las velocidades por
- Cambiar el vector de todas las posiciones por
La sabiduría ahora reside en los coeficientes. Estos son
He integrado el IVP con los métodos anteriores sobre con un tamaño de paso de con un entero elegido en algún lugar entre y . Teniendo en cuenta la velocidad de leap2 , tripliqué para ese método. Luego tracé las curvas resultantes en el espacio de fase y amplié la imagen en donde las curvas deberían llegar idealmente de nuevo a .
Aquí hay gráficos y zooms para y :
Para , leap2 con tamaño de paso llega más cerca de casa que ruth4 con tamaño de paso . Para , ruth4 gana sobre leap2 . Sin embargo, ruth3 , con el mismo tamaño de paso que ruth4 , llega mucho más cerca de casa que los otros, en todos los entornos que he probado hasta ahora.
Aquí está el script Python / Pylab:
import numpy as np
import matplotlib.pyplot as plt
def symplectic_integrate_step(qvt0, accel, dt, coeffs):
q,v,t = qvt0
for ai,bi in coeffs.T:
v += bi * accel(q,v,t) * dt
q += ai * v * dt
t += ai * dt
return q,v,t
def symplectic_integrate(qvt0, accel, t, coeffs):
q = np.empty_like(t)
v = np.empty_like(t)
qvt = qvt0
q[0] = qvt[0]
v[0] = qvt[1]
for i in xrange(1, len(t)):
qvt = symplectic_integrate_step(qvt, accel, t[i]-t[i-1], coeffs)
q[i] = qvt[0]
v[i] = qvt[1]
return q,v
c = np.math.pow(2.0, 1.0/3.0)
ruth4 = np.array([[0.5, 0.5*(1.0-c), 0.5*(1.0-c), 0.5],
[0.0, 1.0, -c, 1.0]]) / (2.0 - c)
ruth3 = np.array([[2.0/3.0, -2.0/3.0, 1.0], [7.0/24.0, 0.75, -1.0/24.0]])
leap2 = np.array([[0.5, 0.5], [0.0, 1.0]])
accel = lambda q,v,t: -q
qvt0 = (1.0, 0.0, 0.0)
tmax = 2.0 * np.math.pi
N = 36
fig, ax = plt.subplots(1, figsize=(6, 6))
ax.axis([-1.3, 1.3, -1.3, 1.3])
ax.set_aspect('equal')
ax.set_title(r"Phase plot $(y(t),y'(t))$")
ax.grid(True)
t = np.linspace(0.0, tmax, 3*N+1)
q,v = symplectic_integrate(qvt0, accel, t, leap2)
ax.plot(q, v, label='leap2 (%d steps)' % (3*N), color='black')
t = np.linspace(0.0, tmax, N+1)
q,v = symplectic_integrate(qvt0, accel, t, ruth3)
ax.plot(q, v, label='ruth3 (%d steps)' % N, color='red')
q,v = symplectic_integrate(qvt0, accel, t, ruth4)
ax.plot(q, v, label='ruth4 (%d steps)' % N, color='blue')
ax.legend(loc='center')
fig.show()
Ya he verificado si hay errores simples:
- No hay error tipográfico en Wikipedia. He comprobado las referencias, en particular ( 1 , 2 , 3 ).
- Tengo la secuencia de coeficientes correcta. Si compara con los pedidos de Wikipedia, tenga en cuenta que la secuencia de la aplicación del operador funciona de derecha a izquierda. Mi numeración está de acuerdo con Candy / Rozmus . Y si intento otro pedido, los resultados empeoran.
Mis sospechas:
- Orden de tamaño incorrecto: tal vez el esquema de tercer orden de Ruth tiene constantes implícitas mucho más pequeñas, y si el tamaño del paso se hiciera realmente pequeño, ¿ganaría el método de cuarto orden? Pero incluso he intentado , y el método de tercer orden sigue siendo superior.
- Prueba incorrecta: ¿Algo especial sobre mi prueba permite que el método de tercer orden de Ruth se comporte como un método de orden superior?