Python 脚本需要 20 多个小时才能 运行
Python script taking over 20 hours to run
我有一个包含 16 个耦合微分方程的系统,我正在使用 Scipy.integrate.odeint 包。
代码必须 运行 从 0 到 5 gigayears 然后绘制数据,微分方程的性质是它们极度振荡。最重要的是我使用的时间步长是 1e+8 否则我会得到这个常量错误:
'在此调用中完成了过多的工作(可能是错误的 Dfun 类型)。
运行 with full_output = 1 获取定量信息。'
我只是想知道,是否有任何其他方法可以让我的积分器求解得更快?对于耦合 ODE 的大型系统,是否有更好的积分方法?该代码已经 运行ning 了 20 多个小时,现在无济于事。
对于大多数大型微分方程系统,主要瓶颈通常是计算导数(右侧)。您可能纯粹在 Python 中执行此操作,这使得它比它可能的要慢得多。我写了一个 Python module called JiTCODE,它通过对导数进行硬编码来加速集成,特别适用于大型 ODE 系统。
另请注意,odeint
使用 LSODA,这对于非刚性系统来说不是最有效的方法。
如果积分步骤数超过某个阈值,通常会出现您遇到的错误。对于长期集成,这可能是预料之中的。您可以通过调整参数 mxstep
.
来控制它
odeint
也有一个最大步长参数,它以我不知道的方式自动选择。虽然这似乎在快速测试中与您的时间尺度合理地缩放,但我不能排除它在您的情况下不能很好地处理 SI 单位的 gigayears,这可能会导致荒谬的许多步骤。
鉴于您使用的是千兆年(这暗示了天文学,这反过来又使能量守恒成为可能),您还应该检查辛积分器是否更适合您的问题。
我有一个包含 16 个耦合微分方程的系统,我正在使用 Scipy.integrate.odeint 包。
代码必须 运行 从 0 到 5 gigayears 然后绘制数据,微分方程的性质是它们极度振荡。最重要的是我使用的时间步长是 1e+8 否则我会得到这个常量错误:
'在此调用中完成了过多的工作(可能是错误的 Dfun 类型)。 运行 with full_output = 1 获取定量信息。'
我只是想知道,是否有任何其他方法可以让我的积分器求解得更快?对于耦合 ODE 的大型系统,是否有更好的积分方法?该代码已经 运行ning 了 20 多个小时,现在无济于事。
对于大多数大型微分方程系统,主要瓶颈通常是计算导数(右侧)。您可能纯粹在 Python 中执行此操作,这使得它比它可能的要慢得多。我写了一个 Python module called JiTCODE,它通过对导数进行硬编码来加速集成,特别适用于大型 ODE 系统。
另请注意,
odeint
使用 LSODA,这对于非刚性系统来说不是最有效的方法。如果积分步骤数超过某个阈值,通常会出现您遇到的错误。对于长期集成,这可能是预料之中的。您可以通过调整参数
mxstep
. 来控制它
odeint
也有一个最大步长参数,它以我不知道的方式自动选择。虽然这似乎在快速测试中与您的时间尺度合理地缩放,但我不能排除它在您的情况下不能很好地处理 SI 单位的 gigayears,这可能会导致荒谬的许多步骤。鉴于您使用的是千兆年(这暗示了天文学,这反过来又使能量守恒成为可能),您还应该检查辛积分器是否更适合您的问题。