首页 文章

Python SciPy ODE解算器没有收敛

提问于
浏览
0

我正在尝试使用scipy的ode求解器来绘制2D方程组之间的相互作用 . 我正在尝试通过以下代码块更改传递给解算器的参数:

# define maximum number of iteration steps for ode solver iteration
m = 1 #power of iteration
N = 2**m #number of steps

# setup a try-catch formulation to increase the number of steps as needed for solution to converge
while True:
    try:
        z = ode(stateEq).set_integrator("vode",nsteps=N,method='bdf',max_step=5e5)
        z.set_initial_value(x0, t0)
        for i in range(1, t.size):
            if i%1e3 == 0:
                print 'still integrating...'
            x[i, :] = z.integrate(t[i]) # get one more value, add it to the array
            if not z.successful():
                raise RuntimeError("Could not integrate")
        break
    except:
        m += 1
        N = 2**m
        if m%2 == 0:
            print 'increasing nsteps...'
            print 'nsteps = ', N

运行它永远不会打破while循环 . 它不断增加nsteps,系统永远不会得到解决 . 如果我不把它放在while循环中,我认为系统会得到解决,因为解决方案会被绘制出来 . while循环是否必要?我是否错误地制定了求解器?

1 回答

  • 1

    参数 nsteps 调节在一个采样步骤期间可以最大程度地执行多少积分步骤(即,调用 z.integrate ) . 如果您的采样步骤足够小以捕获动态,则其默认值是可以的 . 如果您想在一个大的采样步骤中集成一个巨大的时间 Span (例如,为了摆脱瞬态动态),那么该值很容易变得太小 .

    该参数的要点是避免因意外非常长的集成而产生的问题 . 例如,如果你想在一个循环中对一个控制参数的100个值执行给定的积分过夜,你不希望第二天早上看到14号是病态的并且仍然在运行 .

    如果这与您无关,只需将 nsteps 设置为非常高的值并停止担心 . 肯定没有必要连续增加 nsteps ,你只是重新执行相同的计算 .


    运行它永远不会打破while循环 . 它不断增加nsteps,系统永远不会得到解决 .

    这表明你遇到的问题不同于 nsteps ,很可能是问题没有得到很好的解决 . 仔细阅读集成商生成的错误消息 . 我还建议您检查微分方程 . 在集成无法查看出现问题之前,查看解决方案可能会有所帮助,即在运行此之后绘制 x

    z = ode(stateEq)
    z.set_integrator("vode",nsteps=1e10,method='bdf',max_step=5e5)
    z.set_initial_value(x0, t0)
    
    for i,time in enumerate(t):
        x[i,:] = z.integrate(time)
        if not z.successful():
            break
    

    您对 max_step 的值非常高(这不应高于动态的时间范围) . 根据您的应用程序,这可能是合理的,但它表明您正在处理大量数据 . 这反过来可能意味着参数 atolfirst_step 的默认值不适合您的情况,您需要调整它们 .

相关问题