Matlab理解ode求解器

时间:2015-04-14 23:26:02

标签: matlab ode

我有一个链接微分方程组,我用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 个答案:

答案 0 :(得分:1)

第一个条件也可以表示为

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

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

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

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

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