一步将 scipy 集成转换为 matlab 集成

计算科学 matlab scipy
2021-12-07 23:35:49

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 套件解决这个问题?

0个回答
没有发现任何回复~