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

时间:2018-05-15 17:03:30

标签: numpy scipy ode numerical-integration

我在几百万个案例中使用scipy ode运行数值集成,偶尔我会收到错误:

  

此次调用完成的工作量过多(可能是错误的Dfun类型)。

我增加了nsteps一点点(500,000),我也尝试为'僵硬'问题指定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')

我的问题是:发生这种情况会发生什么?这种整合是否会被抛弃?或者,我可以强迫它被抛出?如果我在数百万次运行中失去了一些,我不在乎,但我不希望数据受到污染。

1 个答案:

答案 0 :(得分:1)

发生此错误时,返回值可疑。作为测试用例,我尝试将dy / dt = y从0整合为1,只需10步:

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]警告"在此调用上完成的超额工作(可能是错误的Dfun类型)"。返回值显然是错误的:确切的解决方案是exp(1) = 2.718...当达到nsteps时,似乎积分过程确实停止,并且返回该时间找到的y,即使它不是y(1)。

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

增加nsteps(50就足够了)消除了警告并返回正确的值。

除此之外:考虑使用solve_ivp,例如ode,这会消除旧nsteps方法的一些微观管理({1}中没有solve_ivp选项})。