微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以solve_ivp [scipy.integrate]为例的问题

如何解决以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()
  1. sol.sol(t) 在这代码中没有意义。我们应该写什么?也许是一个元组 z = sol.t,sol.y ?

  2. 很明显,len(sol.y[0])=57len(sol.y[1])=57t 有 300 个元素。出于这个原因,将它们的值耦合到一个图上可能是一个问题。

页面中还有一个图表,说明如果代码运行,我们会得到什么。

我认为这并不重要,但我使用的是 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.tsol.y 包含或不包含该选项的相同值。甚至不涉及额外的计算,因为步进器为每一步计算这个插值多项式。即使在事件机制中没有密集输出选项,也可以使用它。在每个步骤之后存储各个插值多项式并在密集输出函数中组装时,只会增加内存使用。


为了避免sol.sol的混淆,有些人将res作为“result”或类似的作为求解器返回值的变量名,从而将插值函数作为{{1} }.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。