我正在尝试使用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循环是否必要?我的求解器公式不正确吗?
答案 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
设置的值非常高(此值不应超过动态设置的时间范围)。根据您的应用程序,这可能很合理,但是这表明您正在使用大量程序。反过来,这可能意味着参数atol
和first_step
的默认值不适合您的情况,您需要对其进行调整。