Matlab理解ode求解器

Matlab understanding ode solver

我有一个用 ode23 求解器求解的链接微分方程组。当达到某个阈值时,其中一个参数会发生变化,这会反转我的函数的斜率。

我使用调试功能跟踪了 ode 的行为,并注意到它在 "time" 中开始跳回到这一点附近。基本上它会生成更多数据 points.However,这些并没有全部表示在最终的解决方案向量中。

有人可以解释这种行为吗,尤其是为什么不是所有计算值都能进入解向量?

//编辑:澄清一下,当 v 从 0 变为任何其他值时,行为开始。 (当我将 v 的每个值写入一个向量时,它有超过 1000 个分量,而 ode 求解器解决方案只有 ~300 个)。

在下面找到我的方程式的代码:

%chemostat model, based on:
%DCc=-v0*Cc/V + umax*Cs*Cc/(Ks+Cs)-rd
%Dcs=(v0/V)*(Cs0-Cs) - Cc*(Ys*umax*Cs/(Ks+Cs)-m)
function dydt=systemEquationsRibose(t,y,funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m)
     v=funV0Ribose(t,y); %funV0Ribose determines v dependent on y(1)

if y(2)<0
    y(2)=0
end
      dydt=[-(v/V)*y(1)+(umax*y(1)*y(2))/(Ks+y(2))-rd; 
           (v/V)*(Cs0-y(2))-((1/Ys)*(umax*y(2)*y(1))/(Ks+y(2)))];

提前致谢!

干杯, 大来

第一个条件也可以表示为

y(2) = max(0, y(2)).

正如你所看到的,这仍然是一个连续函数,但有一个扭结,即一阶导数不连续。这也可以解释为曲率半径为 0 的点,即无限曲率。

ode23 使用 2 阶方法进行积分,使用 3 阶方法估计误差,可能使用 1 阶欧拉步估计刚度。

扭结上的积分步骤将所有离散化错误呈现为 1 阶(或 2 阶,取决于约定),混淆了步长控制的逻辑。这迫使相当激进的步长减少,但由于那个小步随后下降,很可能没有扭结,再次找到正确的顺序,导致下一步的步长增加,这可能再次超过扭结等

return数组仅包含成功的积分步骤,不包含步长控制的失败尝试。