【发布时间】:2019-03-13 23:09:49
【问题描述】:
我想知道,ODEINT 和 solve_ivp 在求解微分方程方面有什么区别。它们之间的优缺点是什么?
f1 = solve_ivp(f, [0,1], y0) #y0 is the initial point
f2 = odeint(f, y0, [0, 1], args=(a, b)) # a and b are arguments of function f
谢谢
【问题讨论】:
我想知道,ODEINT 和 solve_ivp 在求解微分方程方面有什么区别。它们之间的优缺点是什么?
f1 = solve_ivp(f, [0,1], y0) #y0 is the initial point
f2 = odeint(f, y0, [0, 1], args=(a, b)) # a and b are arguments of function f
谢谢
【问题讨论】:
主要区别如下:
odeint 首先出现,它使用 FORTRAN 包 odepack 中的 lsoda 来解决 ODE。solve_ivp 是一个更通用的解决方案,让用户可以决定使用哪个积分器来求解 ODE。如果您将method 参数定义为method='LSODA',那么这将使用与odeint 相同的积分器。此外,您还可以选择其他方法,例如 BDF 和 RK25。 关于性能,有一张票表明solve_ivp 较慢。这可能是因为它是用 Python 编写的。
在 scipy 中检查它们的文档:
https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.integrate.odeint.html https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.integrate.solve_ivp.html
【讨论】:
solve_ivp 更适合求解 ODE,但比 ODEINT 慢。
solve_ivp 和 method='LSODA' 需要 1.11 秒。 odeint 需要 0.21 秒。解决方案之间的最大差异约为5e-06