solve_ivp [scipy.integrate] 示例的问题

Problems with the example of solve_ivp [scipy.integrate]

我正在研究 python 关于 ode 数值积分的内容,特别是我发现了 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.

编辑:我没有在 solv_ipv()

中插入 dense_output=True

在求解器调用中

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作为“结果”或类似的作为求解器return值的变量名称,因此插值函数是访问为 res.sol(t).