Python solve_ivp[scipy.integrate]示例中的问题
我正在研究python中与ode数值积分有关的内容,特别是我发现了scipy.integrate函数Python solve_ivp[scipy.integrate]示例中的问题,python,python-3.x,scipy,ode,numerical-integration,Python,Python 3.x,Scipy,Ode,Numerical Integration,我正在研究python中与ode数值积分有关的内容,特别是我发现了scipy.integrate函数solve_ipv。我尝试了中所示的示例,但与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=(
solve_ipv
。我尝试了中所示的示例,但与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个元素。因此,将它们的值耦合到绘图可能是一个问题
solv\u ipv()中插入densed\u output=True
sol = solve_ivp(lotkavolterra, [0, 15], [10, 5], args=(1.5, 1, 3, 1),
dense_output=True)
最后一个选项densite\u output=True
负责将sol
函数添加到解决方案“bunch”对象中。此函数实现特定于方法的分段多项式插值,在文献中称为“密集输出”。因此,下面两行完全有意义,因为z=sol.sol(t)
包含t
中任意点的样本
此选项不会更改内部节点的顺序和步长sol.t
和sol.y
包含有或没有该选项的相同值。甚至不需要额外的计算,因为步进器为每一步计算插值多项式。即使在事件机制中没有密集输出选项,也会使用此选项。当在每一步之后存储单个插值多项式并将其组合到密集输出函数中时,仅会增加内存使用
为了避免混淆sol.sol
,有些人将res
作为“结果”或类似的变量名作为解算器返回值,因此插值函数被访问为res.sol(t)
是的,我忘记了那个调用,但在我的代码中我没有使用densed\u output=True
。简而言之,该命令是否使输出数组相对于参数t
更平滑?我们确实改变了实向量输出吗?是的,多项式插值比分段线性函数看起来更平滑。Matlab的ode45等通过“优化”选项将每个步骤段的内部点添加到输出中来更好地实现这一点。因此,绘图看起来更平滑,但点的密度仍然适合解决方案的实际“曲率”。