我有一个链接微分方程组,我用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 回答
第一个条件也可以表示为
可以看出,这仍然是一个连续的函数,但有一个扭结,即一阶导数的不连续性 . 人们也可以将其解释为具有曲率半径的点,即无限曲率 .
ode23
使用order 2方法进行积分,使用order 3方法估计误差,并且可能使用1 Euler步骤来估算刚度 .扭结上的积分步骤使得所有离散化误差为1阶(或2,取决于约定),使步长控制的逻辑混淆 . 这迫使一个相当激进的步长减小,但由于那个小步骤然后下降,很可能,没有扭结,再次找到正确的订单,导致下一步的步长增加,这可能再次超过扭结等
返回数组仅包含成功的集成步骤,而不是步长控制的失败尝试 .