我正在尝试使用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 回答
参数
nsteps
调节在一个采样步骤期间可以最大程度地执行多少积分步骤(即,调用z.integrate
) . 如果您的采样步骤足够小以捕获动态,则其默认值是可以的 . 如果您想在一个大的采样步骤中集成一个巨大的时间 Span (例如,为了摆脱瞬态动态),那么该值很容易变得太小 .该参数的要点是避免因意外非常长的集成而产生的问题 . 例如,如果你想在一个循环中对一个控制参数的100个值执行给定的积分过夜,你不希望第二天早上看到14号是病态的并且仍然在运行 .
如果这与您无关,只需将
nsteps
设置为非常高的值并停止担心 . 肯定没有必要连续增加nsteps
,你只是重新执行相同的计算 .这表明你遇到的问题不同于
nsteps
,很可能是问题没有得到很好的解决 . 仔细阅读集成商生成的错误消息 . 我还建议您检查微分方程 . 在集成无法查看出现问题之前,查看解决方案可能会有所帮助,即在运行此之后绘制x
:您对
max_step
的值非常高(这不应高于动态的时间范围) . 根据您的应用程序,这可能是合理的,但它表明您正在处理大量数据 . 这反过来可能意味着参数atol
和first_step
的默认值不适合您的情况,您需要调整它们 .