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()
sol.sol(t)
在此代码中没有任何意义。我们应该写什么?也许是一个元组 z = sol.t, sol.y
?
也很清楚len(sol.y[0])=57
和len(sol.y[1])=57
而t
有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.t
和 sol.y
包含具有或不具有该选项的相同值。甚至不涉及额外的计算,因为步进器会为每一步计算此插值多项式。即使在事件机制中没有密集输出选项,也可以使用它。只有在每一步之后存储单独的插值多项式并在密集输出函数中组装时才会增加内存使用。
为了避免sol.sol
的混淆,有些人将res
作为“结果”或类似的作为求解器return值的变量名称,因此插值函数是访问为 res.sol(t)
.
我正在研究 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()
sol.sol(t)
在此代码中没有任何意义。我们应该写什么?也许是一个元组z = sol.t, sol.y
?也很清楚
len(sol.y[0])=57
和len(sol.y[1])=57
而t
有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.t
和 sol.y
包含具有或不具有该选项的相同值。甚至不涉及额外的计算,因为步进器会为每一步计算此插值多项式。即使在事件机制中没有密集输出选项,也可以使用它。只有在每一步之后存储单独的插值多项式并在密集输出函数中组装时才会增加内存使用。
为了避免sol.sol
的混淆,有些人将res
作为“结果”或类似的作为求解器return值的变量名称,因此插值函数是访问为 res.sol(t)
.