【发布时间】:2018-12-25 19:35:25
【问题描述】:
我有一个由 16 个耦合微分方程组成的系统,我正在使用 Scipy.integrate.odeint 包。
代码必须运行 0 到 5 gigayears,然后绘制数据,微分方程的本质是它们非常不稳定。最重要的是我使用的时间步长是 1e+8 或者我得到这个恒定的错误:
'在此调用上完成的工作过多(可能是错误的 Dfun 类型)。 以 full_output = 1 运行以获取定量信息。'
我只是想知道,有没有其他方法可以让我的积分器更快地解决问题?对于耦合 ODE 的大型系统,是否有更好的集成方法?代码已经运行了 20 多个小时,但无济于事。
【问题讨论】:
-
在不知道您实际在做什么的情况下,我们怎么知道?请给我们一些代码!
-
scipy-cookbook.readthedocs.io/items/… 代码结构与此相同,只是函数中有16个方程,积分时间为5千兆年。
-
您可以考虑添加一些计时函数来确定代码的哪些部分消耗了最多的计算。 docs.python.org/2/library/timeit.html 从那里您可以查看如何优化代码的特定部分。
-
@user9159408:但你不是在模拟 5 千兆年的振荡僵尸启示录,是吗?您的实际 ODE 很可能很重要。
-
大多数积分器,尤其是那些具有自适应步长的积分器,都包含针对“人性化”问题调整的启发式或魔法常数。尝试重新调整您的问题,使基本时间单位为 0.1 或 1 gigayear,同时重新调整 ODE 的所有组件,以便您计算的数字在 1e-3 到 1e6 的范围内,如果可能的话,大小大致相同。不能保证它会有所帮助,但它应该可以防止“超出范围”的失真。
标签: python python-3.x differential-equations odeint