我是一名有兴趣以数字方式解决ODE的物理学生。我通常使用Runge-Kutta方法在C中编写自己的求解器。
我最近学习了Python,并使用SciPy的odeint
函数来解决ODE。但我担心函数算法是如何工作的,因为它不采用步长参数。那么,我怎样才能了解它是如何工作的?我怎么知道他们的结果的精确度是什么?
我咨询了this documentation, 但它没有提供太多信息,我也不太了解他们描述的可选参数。
答案 0 :(得分:5)
SciPy有三个用于集成ODE的模块:
scipy.integrate.odeint
,它使用LSODA算法。scipy.integrate.ode
,支持四种不同的后端(LSODA,DoPri5,DoP853和VODE)。scipy.integrate.solve_ivp
,支持五个后端(LSODA,DoPri5,Bogacki-Shampine,Radau和后向差异化方法)。请注意,在询问第一个模块时,您使用了第二个模块。
这些解算器的所有都会调整步长。
这意味着他们估计积分误差,例如,通过比较两个简单积分器的结果(它们智能地交织在一起以节省运行时间)。
然后使用该估计来调整步长,使得估计的误差低于由参数rtol
和atol
指定的用户定义的阈值。
这些参数允许您控制精度。