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=]).
我正在 运行使用 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=]).