我在几百万个案例中使用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')
我的问题是:发生这种情况会发生什么?这种整合是否会被抛弃?或者,我可以强迫它被抛出?如果我在数百万次运行中失去了一些,我不在乎,但我不希望数据受到污染。
答案 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
选项})。