求解一阶odes的python包
PyODESolver的Python项目详细描述
pyodesolver
解odes的python包
安装
要安装pyodesolver,请执行:
python3 -m pip install PyODESolver
这将使包pyodesolver可用于导入。 本次发布python3
python3
并导入新包pyodesolver
import pyodesolver
快速入门指南:
要开始使用pyodesolver,请包含一个解算器方法。 在本例中,我们将使用显式Euler方法来求解 微分方程y’(t)=-2*y(t),y(0)=pi。这个 微分方程有精确解
y(t) = pi * exp(-2 * t).
表达式的右侧
y'(t) = -2*y(t),
y(0) = pi
称为RhsFunction。这个例子已经在 文件rhs_function.py中的示例func01。 为了使用显式的欧拉解算器,我们首先导入 所需文件
from method_explicit_euler import ExplicitEuler
from rhs_function import ExampleFunc01
import numpy as np
我们不能在主函数中构造方法对象 并对其调用generate以获取解算器对象。
if __name__ == "__main__":
N = 10**3
t = np.linspace(0, 1, num=N)
y0 = np.pi
ee_solver = ExplicitEuler(N, y0, [0, 1], ExampleFunc01())
solution = ee_solver.generate()
生成器对象在本例中非常有用,因为它非常 依靠所需的内存并完全控制 它的用户可以根据需要生成新的时间步。例如 一个线程可以用于更新绘图,另一个线程可以 调用next(解决方案)以匹配绘图的帧速率。
要提取整个解决方案,我们可以使用:
numericSol = []
for (time, val) in solution:
numericSol.append(val)
要在本例中绘制解决方案,我们可以使用
import matplotlib.pyplot as plt
plt.plot(t, np.array(numericSol))
plt.show()
求解任意节点
要解决定制的ode,只需要两个组件 新的RhsFunction和该函数的Jacobian。在案例中 如果jacobian是未知的,显式方法仍将起作用。
要实现新的rhsfunction,用户可以从rhsfunction继承 并定义一个新的子类
class NewFunction(RHSFunction):
...
rhsfunction公开了三个引发notimplementederrors的方法。 然后,用户可以通过提供
def eval(self, y_vec, time):
...
以及
def jacobian(self, y_vec, time):
...
提供显式和隐式方法所需的一切。 可以按照快速入门指南中的说明获得解决方案。