首页 文章

Matlab理解ode求解器

提问于
浏览
0

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

我使用调试功能跟踪了ode的行为,并注意到它在这个点附近开始跳回“时间” . 基本上它会生成更多的数据点 . 但是,这些并不都在最终的解决方案向量中表示 .

有人可以解释这种行为,特别是为什么不是所有计算值都能找到解决方案向量的方法?

//编辑:为了澄清,当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)))];

提前致谢!

干杯,dahlai

1 回答

  • 1

    第一个条件也可以表示为

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

    可以看出,这仍然是一个连续的函数,但有一个扭结,即一阶导数的不连续性 . 人们也可以将其解释为具有曲率半径的点,即无限曲率 .

    ode23 使用order 2方法进行积分,使用order 3方法估计误差,并且可能使用1 Euler步骤来估算刚度 .

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

    返回数组仅包含成功的集成步骤,而不是步长控制的失败尝试 .

相关问题