Problemas al usar scipy.integrate.odeint con python

Estaba tratando de usar odeint para resolver un problema. Mi código es el siguiente:

import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint eta=1.24e-9/2 def fun(x): f=1.05e-8*eta*x**(1.5)*np.exp(13.6/x) return (np.sqrt(1.+4*f)-1)/2./f x=np.arange(0,1,0.001) y=odeint(fun,x,0)[0] plt.plot(x,y) plt.plot(x,x) plt.show() 

Las dos curvas son iguales, lo que obviamente es incorrecto. Si grafico la función, se verá como una función escalonada, que es muy pequeña antes de aproximadamente 0,3 y va exponencialmente a 1. ¿Puedes ayudarme a descubrir qué tiene de malo? ¡Gracias!

Hay varios problemas con su código, la mayoría de los cuales puede resolver usted mismo si lee la cadena de odeint para odeint más detenidamente.

Para comenzar, el siguiente es un ejemplo simple de resolver una ecuación diferencial escalar con odeint . En lugar de tratar de entender (y posiblemente depurar) su función, usaré una ecuación muy simple. Resolveré la ecuación dy / dt = a * y, con la condición inicial y (0) = 100. Una vez que tenga este ejemplo en funcionamiento, puede modificar la fun para resolver su problema.

 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt def fun(y, t, a): """Define the right-hand side of equation dy/dt = a*y""" f = a * y return f # Initial condition y0 = 100.0 # Times at which the solution is to be computed. t = np.linspace(0, 1, 51) # Parameter value to use in `fun`. a = -2.5 # Solve the equation. y = odeint(fun, y0, t, args=(a,)) # Plot the solution. `odeint` is generally used to solve a system # of equations, so it returns an array with shape (len(t), len(y0)). # In this case, len(y0) is 1, so y[:,0] gives us the solution. plt.plot(t, y[:,0]) plt.xlabel('t') plt.ylabel('y') plt.show() 

Aquí está la ttwig:

parcela generada por el ejemplo

Se pueden encontrar ejemplos más complicados del uso de odeint en el Libro de cocina de SciPy (desplácese hacia abajo hasta la viñeta con la etiqueta “Ecuaciones diferenciales ordinarias”).