Scipy 集成允许我们一次进行一个自适应时间步长的 ode 集成并对其进行处理。但是,matlab ode 需要我们指定一个时间跨度,并确定其中的自适应时间步长,但不能在其中做事情。
来自 scipy
ODE.set_initial_value(y0, tlist[0])
numoftimes = len(tlist)
for ii in range(1, numoftimes):
# while loop up to tlist[ii]
while ODE.t < tlist[ii]:
t_prev = ODE.t
y_prev = ODE.y
# integrate up to tlist[ii], one step at a time.
ODE.integrate(tlist[ii], step=1)
#do something to the output
...
但是,在matlab中,我没有做到这一点,主要step=1
是不可用。
Matlab 中的哪个 ODE 求解器仅允许我在一个时间步内前进
尝试是在 matlab ode 套件中使 tspan 非常小。但这不是自适应的。在某些区域,原始 ode 时间步长非常大(非刚性),但在某些区域,ode 时间步长非常小(刚性)。
tlist = [0 tf]
numoftimes = len(tlist)
for ii = 1:numoftimes
# while loop up to tlist(ii)
while t_prev < tlist(ii)
t_prev = T(end,:)
y_prev = Y(end,:)
# integrate up to tlist(ii), one step at a time.
t = [t_prev,t_prev+0.0000000000001];
[T, Y] = ode45(dydt, t, y);
#do something to the output
...
end
end
这并不像我所拥有的那样好,即使 ode45 确实只集成了 1 个步骤 1. 强制时间步长为固定间隔 2. 耗时,因为在某些非刚性区域中,“原始自适应”时间步长不必是那样小的。
如何使用 matlab ode 套件解决这个问题?