user371816:
Estoy escribiendo un script en Python para resolver una cierta ecuación diferencial con odeint de SciPy. He copiado el ejemplo en la página de documento:
def pend(y,t,b,c):
theta, omega = y
dydt = [omega, -b*omega -c*np.sin(theta)]
return dydt
b = 0.25
c = 5.0
y0 = [np.pi-0.1,0.0]
t = np.linspace(0,10,101)
sol = odeint(pend, y0, t, args = (b,c))
plt.plot(t,sol[:,1])
plt.plot(t,sol[:,0])
Esto funciona bien y todo, pero cuando trato con el sistema de Lotka-Volterra los códigos se descompone:
def F(t,n,a,b,c,d):
x, y = n
deriv = [a*x-b*x*y,c*x*y-d*y]
return deriv
t = np.linspace(0,100,100)
a = 1.1
b= 0.4
c = 0.1
d = 0.4
n0 = [10,10]
sol = odeint(F,n0,t,args = (a,b,c,d))
Esto devuelve una TypeError
<ipython-input-14-ea2a41feaef2> in F(t, n, a, b, c, d)
1 def F(t,n,a,b,c,d):
----> 2 x, y = n
3 deriv = [a*x-b*x*y,c*x*y-d*y]
4 return deriv
5
TypeError: cannot unpack non-iterable float object
Podría ayudar a que nadie me vea lo que me falta? Específicamente, ¿por qué funciona el código de ejemplo, si el segundo código está escrito con la misma estructura. ¡Gracias!
Simon Fink:
Asumo, que los argumentos pasados en esta línea no están en el orden correcto:
sol = odeint(F,n0,t,args = (a,b,c,d))
¿No debería ser:
sol = odeint(F,t,n0,args = (a,b,c,d))
Alternativamente, usted puede intercambiar el orden de los argumentos en la definición de función a:
def F(n,t,a,b,c,d):