Python SciPy ODE求解器未收敛

时间:2018-08-03 00:40:06

标签: python scipy ode

我正在尝试使用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循环。它会永远增加nstep,而系统永远也不会解决。我认为,如果我不将其放入while循环中,则会解决系统问题,因为解决方案已被标绘。 while循环是否必要?我的求解器公式不正确吗?

1 个答案:

答案 0 :(得分:1)

参数nsteps调节一个采样步骤(即调用z.integrate)中最多可以执行多少个积分步骤。如果采样步骤足够小以捕获动态,则其默认值可以。如果要在一个较大的采样步骤中将很大的时间跨度进行积分(例如,以消除瞬态动力学),则该值很容易过小。

此参数的目的是避免由于意外的非常长的集成而引起的问题。例如,如果您想在一夜中循环执行100个控制参数值的给定积分,则您不想在第二天早上看到14号病态且仍在运行。

如果这与您无关,只需将nsteps设置为一个很高的值,然后就不用担心了。肯定没有必要连续增加nsteps,因为您只是在重新进行相同的计算。


  

运行此命令不会中断while循环。它会永远增加nstep,而系统永远也不会解决。

这表明您遇到的问题与超出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的默认值不适合您的情况,您需要对其进行调整。