用Python求解非线性一阶微分方程

用Python求解非线性一阶微分方程,python,math,numpy,matplotlib,scipy,Python,Math,Numpy,Matplotlib,Scipy,我想用Python解一个非线性一阶微分方程 比如说, df/dt=f**4 我编写了以下程序,但是matplotlib有一个问题,所以我不知道我在scipy中使用的方法是否正确 from scipy.integrate import odeint import numpy as np import matplotlib.pyplot as plt derivate=lambda f,t: f**4 f0=10 t=np.linspace(0,2,100) f_numeric=scipy.inte

我想用Python解一个非线性一阶微分方程

比如说,

df/dt=f**4

我编写了以下程序,但是matplotlib有一个问题,所以我不知道我在scipy中使用的方法是否正确

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
derivate=lambda f,t: f**4
f0=10
t=np.linspace(0,2,100)
f_numeric=scipy.integrate.odeint(derivate,f0,t)
print(f_numeric)
plt.plot(t,f_numeric)
plt.show()
这将导致以下错误:

AttributeError: 'float' object has no attribute 'rint'

在这种情况下,您最好使用,它允许您获得封闭形式的解决方案:

from IPython.display import display
import sympy as sy
from sympy.solvers.ode import dsolve
import matplotlib.pyplot as plt
import numpy as np

sy.init_printing()  # LaTeX like pretty printing for IPython


t = sy.symbols("t", real=True)
f = sy.symbols("f", function=True)


eq1 = sy.Eq(f(t).diff(t), f(t)**4)  # the equation 
sls = dsolve(eq1)  # solvde ODE

# print solutions:
print("For ode")
display(eq1)
print("the solutions are:")
for s in sls:
    display(s)

# plot solutions:
x = np.linspace(0, 2, 100)
fg, axx = plt.subplots(2, 1)
axx[0].set_title("Real part of solution of $\\frac{d}{dt}f(t)= (f(t))^4$")
axx[1].set_title("Imag. part of solution of $\\frac{d}{dt}f(t)= (f(t))^4$")
fg.suptitle("$C_1=0.1$")
for i, s in enumerate(sls, start=1):
    fn1 = s.rhs.subs("C1", .1)  # C_1 -> 1
    fn2 = sy.lambdify(t, fn1, modules="numpy")  # make numpy function
    y = fn2(x+0j)  # needs to be called with complex number
    axx[0].plot(x, np.real(y), label="Sol. %d" % i)
    axx[1].plot(x, np.imag(y), label="Sol. %d" % i)
for ax in axx:
    ax.legend(loc="best")
    ax.grid(True)
axx[0].set_ylabel("Re$\\{f(t)\\}$")
axx[1].set_ylabel("Im$\\{f(t)\\}$")
axx[-1].set_xlabel("$t$")
fg.canvas.draw()
plt.show()
在IPython shell中,您应该看到以下内容:


在这种情况下,您最好使用,它允许您获得封闭形式的解决方案:

from IPython.display import display
import sympy as sy
from sympy.solvers.ode import dsolve
import matplotlib.pyplot as plt
import numpy as np

sy.init_printing()  # LaTeX like pretty printing for IPython


t = sy.symbols("t", real=True)
f = sy.symbols("f", function=True)


eq1 = sy.Eq(f(t).diff(t), f(t)**4)  # the equation 
sls = dsolve(eq1)  # solvde ODE

# print solutions:
print("For ode")
display(eq1)
print("the solutions are:")
for s in sls:
    display(s)

# plot solutions:
x = np.linspace(0, 2, 100)
fg, axx = plt.subplots(2, 1)
axx[0].set_title("Real part of solution of $\\frac{d}{dt}f(t)= (f(t))^4$")
axx[1].set_title("Imag. part of solution of $\\frac{d}{dt}f(t)= (f(t))^4$")
fg.suptitle("$C_1=0.1$")
for i, s in enumerate(sls, start=1):
    fn1 = s.rhs.subs("C1", .1)  # C_1 -> 1
    fn2 = sy.lambdify(t, fn1, modules="numpy")  # make numpy function
    y = fn2(x+0j)  # needs to be called with complex number
    axx[0].plot(x, np.real(y), label="Sol. %d" % i)
    axx[1].plot(x, np.imag(y), label="Sol. %d" % i)
for ax in axx:
    ax.legend(loc="best")
    ax.grid(True)
axx[0].set_ylabel("Re$\\{f(t)\\}$")
axx[1].set_ylabel("Im$\\{f(t)\\}$")
axx[-1].set_xlabel("$t$")
fg.canvas.draw()
plt.show()
在IPython shell中,您应该看到以下内容:


尝试t=np.linspace0,0.000331000这很奇怪,因为当我将scipy.integrate.odeint更改为odeint时,上面的代码对我来说很好,因为您实际上没有导入scipy名称空间,所以应该只通过其name@HYRY:我试过t=np.linspace0,0.000331000,它适用于这个t,如何使其适用于t=np.linspace0,2100@阿兹拉图德:它符合你的建议。。。但并非总是如此。事实上,如果您尝试我的代码10次,它将无法工作10次:将出现AttributeError。你还有其他建议吗?@Jack,请检查符号解决方案:**4@HYRY:我使用了你的链接,其中df/dt=f^4,f0=10,WolframAlpha给出了fx=10/1-3000x^1/3作为解决方案。然后我在Geogebra上绘制了解决方案,结果与我运行代码后绘制的结果不一样。try t=np.linspace0,0.000331000这很奇怪,因为当我将scipy.integrate.odeint更改为odeint时,上面的代码对我来说很好,因为您实际上没有导入scipy命名空间,odeint函数应仅由其name@HYRY:我试过t=np.linspace0,0.000331000,它对这个t有效,我怎样才能使它对t=np.linspace0,2100有效@阿兹拉图德:它符合你的建议。。。但并非总是如此。事实上,如果您尝试我的代码10次,它将无法工作10次:将出现AttributeError。你还有其他建议吗?@Jack,请检查符号解决方案:**4@HYRY:我使用了你的链接,其中df/dt=f^4,f0=10,WolframAlpha给出了fx=10/1-3000x^1/3作为解决方案。然后我在Geogebra上绘制了解决方案,结果与我运行代码后绘制的结果不一样。谢谢,非常有趣,我用一个复杂的非线性方程尝试了你的解决方案,但它一直在运行,有没有办法限制计算时间,或者我遗漏了什么,方程:eq1=sy.Eqt*3*ft.difft-ft.difft**3,ft*1-3*ft.difft**2和dsolve:sls=dsolveeq1,ics={f0:-2,ft.difft.subst,0:0}@FabianoTarlao不确定你的方程是否存在封闭形式的解-乍一看似乎不是这样…谢谢,非常有趣,我用一个复杂的非线性方程尝试了你的解,但它一直在运行,有没有办法限制计算时间,或者我遗漏了什么,方程:eq1=sy.Eqt*3*ft.difft-ft.difft**3,ft*1-3*ft.difft**2和dsolve:sls=dsolveeq1,ics={f0:-2,ft.difft.subst,0:0}@FabianoTarlao不确定你的方程是否存在闭式解-乍一看似乎不是这样。。。