目前,我的问题需要我解决一个大型非线性 ODE 系统(最多约 5000 个)。到目前为止,我一直在使用scipy.integrate.odeint它作为我的主力。
我的问题的一个更简单的子集只涉及约 50 个非线性 ODE。在区间上求解系统的 3 倍。不错!
但是,在上求解的 1500 倍。不太好!
可能出现这种情况的一个明显原因是,在之间的某些点,解决方案的收敛时间比平时要长得多——因此,在每个时间步求解系统所花费的平均时间大于然后超过。我的直觉在这里正确吗?
还有哪些其他问题?
目前,我的问题需要我解决一个大型非线性 ODE 系统(最多约 5000 个)。到目前为止,我一直在使用scipy.integrate.odeint它作为我的主力。
我的问题的一个更简单的子集只涉及约 50 个非线性 ODE。在区间上求解系统的 3 倍。不错!
但是,在上求解的 1500 倍。不太好!
可能出现这种情况的一个明显原因是,在之间的某些点,解决方案的收敛时间比平时要长得多——因此,在每个时间步求解系统所花费的平均时间大于然后超过。我的直觉在这里正确吗?
还有哪些其他问题?
自适应时间积分器调整步长以尝试最大化效率,同时将截断误差(通常是局部的)控制在规定的容差范围内。如果解发生快速变化,则局部截断误差估计将迫使时间步长减小。隐式积分器具有额外的复杂性,即代数系统(尤其是非线性系统)可能需要大不相同的工作量,而工作量可能取决于步长。
生产 ODE 集成器应该包括诊断,以便您可以看到时间花费在哪里(例如,非常短的时间步长或许多非线性迭代)。然后,您可以决定是更改方法参数、选择不同的方法还是接受观察到的性能。