Scipy集成允许我们一次进行一个自适应时间步长的集成并对其做一些事情。但是,matlab ode需要我们指定一个timespan,并确定其中的自适应时间步长,但不能在其中做任何事情。
来自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套件解决这个问题?