scipy ODE,超过 nsteps 会发生什么?

scipy ODE, what happens when nsteps exceeded?

我正在 运行使用 scipy ode 对数百万个案例进行数值积分,偶尔会出现错误:

Excess work done on this call (perhaps wrong Dfun type).

我增加了一些 nsteps (500,000),并且我还尝试为 'stiff' 问题指定 BDF 方法,如 in this question

所述
r = ode(RHS).set_initial_value(state0, t_initial).set_f_params(Efield,qmp)
r.set_integrator('vode',nsteps=500000,method='bdf')

我的问题是:发生这种情况时会发生什么?那个整合 运行 被扔掉了吗?或者,我可以强制将其扔掉吗?我不在乎丢几百万运行,但我不希望数据被污染

发生此错误时,return 值值得怀疑。作为测试用例,我尝试仅用 10 个步骤将 dy/dt = y 从 0 集成到 1:

from scipy.integrate import ode
r = ode(lambda t, y: y).set_initial_value(1, 0).set_integrator('lsoda', nsteps=10)
print(r.integrate(1))

这将打印 [1.40213975] 和警告 "Excess work done on this call (perhaps wrong Dfun type)"。 return 值显然是错误的:确切的解决方案是 exp(1) = 2.718... 似乎积分过程确实在达到 nsteps 时停止,并且此时找到的任何 y 都是 returned,即使如果不是 y(1).

您可以通过在 r.integrate 之后调用 r.successful() 来检测这一点:如果它 returns False,则最近的步骤失败。

增加 nsteps(这里 50 就足够了)消除了警告和 return 的正确值。

旁白:考虑使用 new SciPy API for ODE,例如 solve_ivp,它消除了旧 ode 方法的一些微观管理(nsteps 中没有选项15=]).