具有条件变化系数的同时微分方程

时间:2015-03-20 21:57:24

标签: matlab conditional-statements modeling differential-equations

我想模仿Chemostat(某种生物反应器)。 我设置了以下系统,可以使用ode45方法解决:

%chemostat model, based on:
%DCc=-v0*Cc/V + umax*Cs*Cc/(Ks+Cs)-rd -->Change of cell concentration over time
%Dcs=(v0/V)*(Cs0-Cs) - Cc*(Ys*umax*Cs/(Ks+Cs)-m) -->Change of substrate concentration over time

function dydt=sys(t,y,v0,V,umax,Ks,rd,Cs0,Ys,m)
         dydt=[-(v0/V)*y(1)+(umax*y(1)*y(2))/(Ks+y(2))-rd; 
               (v0/V)*(Cs0-y(2))-(Ys*umax*y(2)*y(1))/(Ks+y(2))];

我用以下函数调用该函数:

[t,y]=ode45(@systemEquations, [0 40],[1 100],[],**v0**, V,umax,Ks,rd,Cs0,Ys,m);

在运行计算之前设置所有附加系数的值。到目前为止一切正常。 现在我希望v0依赖于系统状态。例如。最初v0 = 0,当我的细胞浓度超过一定值时,我希望它改变。

问题是,我完全不知道如何实现这一点。颂歌解决者的Matlab帮助也没有任何帮助...

感谢您提供任何帮助或建议!

干杯, dahlai

1 个答案:

答案 0 :(得分:0)

使用您的差分系统功能为您照顾它!首先将v0表示为时间和状态的函数:

function v0 = funV0( t, y )
    v0 = 1;
    if y(1) > 5
        v0 = y(2); % As an example, if [Y1] > 5, then set v0 = [Y2]
    end
end

然后在差分系统中使用该功能。您可以将@ funV0作为参数传递,也可以让差分系统函数直接执行它。我现在将它视为一个参数。

function dydt=sys(t,y,v0,V,umax,Ks,rd,Cs0,Ys,m)
     dydt=[-(v0(t,y)/V)*y(1)+(umax*y(1)*y(2))/(Ks+y(2))-rd; 
           (v0(t,y)/V)*(Cs0-y(2))-(Ys*umax*y(2)*y(1))/(Ks+y(2))];

使用:

调用
[t,y]=ode45(@systemEquations, [0 40],[1 100],[],@funV0, V,umax,Ks,rd,Cs0,Ys,m);

当然,这个原则可以应用于任何时间或状态依赖参数。此样式还允许您尝试各种参数函数假设您将参数近似为状态函数:您可以通过传入不同的V0函数来试验不同的近似值。