Sid*_*ius 4 python scipy numerical-integration ode python-3.x
我正在研究 python 的有关 ode 数值积分的内容,特别是我发现了 scipy.integrate 函数solve_ipv
。我尝试了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=(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()
Run Code Online (Sandbox Code Playgroud)
sol.sol(t)
在此代码中没有任何意义。我们应该写什么?也许是一个元组z = sol.t, sol.y
?
还清楚的是len(sol.y[0])=57
和len(sol.y[1])=57
whilet
有 300 个元素。因此,将它们的值耦合到绘图可能是一个问题。
在该页面中还有一个图表,显示了如果代码运行我们将获得什么。
我认为这不重要,但我正在使用 python3。
编辑:我没有dense_output=True
插入solv_ipv()
在求解器调用中
sol = solve_ivp(lotkavolterra, [0, 15], [10, 5], args=(1.5, 1, 3, 1),
dense_output=True)
Run Code Online (Sandbox Code Playgroud)
最后一个选项dense_output=True
负责将sol
函数添加到解决方案“束”对象中。该函数实现了特定于方法的分段多项式插值,在文献中称为“密集输出”。因此,接下来的两行完全有意义,因为z = sol.sol(t)
包含 中任何点的样本t
。
此选项不会更改内部节点的顺序和步长。sol.t
并sol.y
在有或没有该选项的情况下包含相同的值。甚至不涉及额外的计算,因为步进器为每个步骤计算该插值多项式。即使事件机制中没有密集输出选项,也会使用此选项。当每个步骤之后存储各个插值多项式并将其组装在密集输出函数中时,仅会增加内存使用量。
为了避免混淆sol.sol
,有些人采用res
“结果”或类似的名称作为求解器返回值的变量名称,以便将插值函数访问为res.sol(t)
。
归档时间: |
|
查看次数: |
4945 次 |
最近记录: |