如何解决以solve_ivp [scipy.integrate]为例的问题
我正在研究关于 ode 数值积分的 Python,特别是我发现了 scipy.integrate 函数 solve_ipv
。我尝试了 scipy.integrate.solve_ipv page 中显示的示例,但可能存在与 Lotka Volterra 示例相关的代码错误:
def lotkavolterra(t,z,a,b,c,d):
x,y = z
return [a*x - b*x*y,-c*y + d*x*y]
sol = solve_ivp(lotkavolterra,[0,15],[10,5],args=(1.5,1,3,1))
t = np.linspace(0,15,300)
z = sol.sol(t)
import matplotlib.pyplot as plt
plt.plot(t,z.T)
plt.xlabel('t')
plt.legend(['x','y'],shadow=True)
plt.title('Lotka-Volterra System')
plt.show()
我认为这并不重要,但我使用的是 python3。
编辑:我没有在 dense_output=True
solv_ipv()
解决方法
在求解器调用中
sol = solve_ivp(lotkavolterra,[0,15],[10,5],args=(1.5,1,3,1),dense_output=True)
最后一个选项 dense_output=True
负责将 sol
函数添加到解决方案“bunch”对象中。该函数实现了特定于方法的分段多项式插值,在文献中称为“密集输出”。因此接下来的两行完全有意义,因为 z = sol.sol(t)
包含 t
中任何点的样本。
这个选项不会改变内部节点的顺序和步长。 sol.t
和 sol.y
包含或不包含该选项的相同值。甚至不涉及额外的计算,因为步进器为每一步计算这个插值多项式。即使在事件机制中没有密集输出选项,也可以使用它。在每个步骤之后存储各个插值多项式并在密集输出函数中组装时,只会增加内存使用。
为了避免sol.sol
的混淆,有些人将res
作为“result”或类似的作为求解器返回值的变量名,从而将插值函数作为{{1} }.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。