【问题标题】:scipy ODE, what happens when nsteps exceeded?scipy ODE,当 nsteps 超过时会发生什么?
【发布时间】:2018-10-25 14:43:20
【问题描述】:

我正在使用 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')

我的问题是:发生这种情况时会发生什么?那个集成运行被抛出了吗?或者,我可以强迫它被扔掉吗?我不在乎我是否在数百万次运行中丢失了一些,但我不希望数据被污染。

【问题讨论】:

    标签: numpy scipy ode numerical-integration


    【解决方案1】:

    出现此错误时返回值可疑。作为一个测试用例,我尝试用 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] 并带有警告“在此调用上完成的工作过多(可能是错误的 Dfun 类型)”。返回值显然是错误的:确切的解决方案是exp(1) = 2.718... 似乎在达到nsteps 时积分过程确实停止了,并且此时找到的任何y 都将返回,即使它不是y(1)。

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

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

    除此之外:考虑使用new SciPy API for ODE,例如solve_ivp,它消除了旧的ode 方法的一些微观管理(solve_ivp 中没有nsteps 选项)。

    【讨论】:

    • 好的,所以澄清一下,集成实际上并没有在 nsteps 处停止,它会一直持续到完成并在 nsteps 处发出警告?
    • 重新阅读代码,到达nsteps时它确实终止了,所以我的回答是错误的。查看修订版。
    • 好的,谢谢。那么有没有办法摆脱这种整合呢?或者也许我可以捕捉到该警告并手动将其丢弃?
    • 另一方面,我仍在使用旧的 ODE,因为我需要根据位置而不是时间来退出(请参阅我的上一个问题:stackoverflow.com/questions/50047265/…
    • 只需在每个r.integrate 之后检查r.successful()。在答案中编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2010-12-08
    • 2016-02-20
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多