我有一个由16个耦合的微分方程组成的系统,并且我使用的是Scipy.integrate.odeint软件包。
代码必须运行0到5吉年,然后绘制数据,微分方程的本质是它们极易振荡。最重要的是,我使用的时间步长是1e + 8,否则会出现此恒定错误:
'此调用完成的工作过多(可能是Dfun类型错误)。 以full_output = 1运行以获取定量信息。'
我只是想知道,还有什么其他方法可以使积分器更快地求解?耦合ODE的大型系统是否有更好的集成方法?该代码已经运行了20多个小时,无济于事。
答案 0 :(得分:0)
对于大多数大型微分方程组,主要瓶颈通常是在计算导数(右侧)。您可能纯粹在Python中执行此操作,这使其运行速度大大降低。我写了Python module called JiTCODE,它通过对衍生代码进行硬编码来加快集成速度,并且特别适用于大型ODE系统。
还要注意,odeint
使用LSODA并不是非僵硬系统最有效的方法。
如果集成步骤数超过特定阈值,通常会出现错误。对于长时间的集成,这是可以预期的。您可以通过调整参数mxstep
来控制它。
odeint
还具有一个最大步长参数,该参数以我不知道的方式自动选择。尽管这似乎可以在快速测试中与您的时间比例合理地缩放,但我不能排除它不能很好地解决您的情况下以SI单位使用千兆年的情况,这可能会导致很多步骤。
鉴于您工作了数万亿年(这暗示着天文学,这反过来又使节能成为可能),还应该检查辛辛积分器是否更适合您的问题。