(Voy a apreciate incluso un enlace a un ejemplo, hasta ahora no he encontrado ninguna.)
Estoy tratando de utilizar Radau de scipy.integrate para resolver ecuaciones diferenciales de segundo orden. Por ahora estoy tratando sólo un ejemplo sencillo, de modo que pueda uderstand cómo funciona (sin éxito hasta el momento).
Vamos a decir que tengo siguiente ecuación:
d ^ 2y / dt ^ 2 = C,
lo que significa que y = (C t ^ 2) / 2 + B t.
Digamos, por ejemplo, y (1) = 1 y C = digamos 2. Vamos que yo quiero encontrar valor de y para t = 10.
Este es mi código:
from scipy.integrate import Radau
import numpy as np
C = 2.0
y = np.zeros(2)
def fun(t, y):
#y[0] = C*t
y[1] = C
return y
t0 = 1.0
y0 = np.array([1., 1.])
t_bound = 10.0
eq = Radau(fun, t0, y0, t_bound)
print(eq.n)
while(True):
print(eq.t)
print(eq.y)
print(eq.status)
if eq.status == 'finished':
break
eq.step()
Salidas está mal. (Si yo elimine el comentario de que una línea comentada en la fun
definición, sino que también da una respuesta equivocada. Pero creo que no debería siquiera tener que decirle solucionador de eso, ¿verdad? No sé este valor por lo general).
Creo que mi mayor problema es que no estoy muy seguro de lo que debe ser aprobada como fun
. Documentación dice que debe ser lado derecho del sistema, así que pensé que primero derivación debe estar en y [0], segunda derivación en Y [1] etc.
¿Qué estoy haciendo mal? ¿Cómo debe ser implementado?
Atm está resolviendo
y0' = y0, y0(1)=1
y1' = 2, y1(1)=1
el cual tiene la solución y0(t)=exp(t-1)
y y1(t)=2*t-1
que no es ciertamente lo que quiere. Desea que el sistema de primer orden
y0' = y1
y1' = C
por lo que es necesario
def fun(t,y): return [y[1], C]
A continuación, la solución es y1(t)=C*t+B=2*t-1
y y0(t)=0.5*C*t^2+B*t+A=t^2-t+1
así como la integración termina correctamente con eq.y = [91. 19.]
.