我有一个耦合微分方程系统。其中一个参数随着时间的推移而变化,我想跟踪所述参数的变化(并用我的最终图表覆盖它)。
我试图将v的所有生成值写入单独的向量中。但是,由于并非所有函数调用都会导致成功集成,因此我最终会得到v的多个值而不是我的ode-solver返回向量。
有人可以指出我如何在我的代码中实现此功能吗?
非常感谢,现在已经尝试了几个小时了。不幸的是,无济于事。
干杯, dahlai
在下面找到我的代码:
耦合微分方程+尝试将v的所有值写入向量:
%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)
y(2) = max(0, y(2)); %minimum value of y(2), therefore Cs, is 0
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)));
];
% persistent k
% persistent vel
%
% if isempty(vel)
% vel=0
% end
%
% if isempty(k)
% k=1
% end
%
% if v>= vel(k)
% vel(k+1)=v %stores all v values, for plotting and analysis of v0 behaviour
% end
% assignin('base','vel',vel)
% k=k+1
end
ode23-solver call:
[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],[],@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m);
v由一个名为funV0Ribose的单独函数给出。funV0Ribose的值取决于每个给定时间点的y(1)。
答案 0 :(得分:0)
进行更多挖掘(并将正确的词汇放入谷歌)我找到了一个解决方案: 第二个答案和阅读文档(这对我来说仍然很难,因为我对MATLAB很新): Saving derivative values in ode45 in Matlab
我的实施: 初始化输出函数:
options=odeset('OutputFcn', @recordFun)
global v
if isempty(v)
v=0
end
致电ode-solver:
[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],options,@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m);
recordFun:
function status=recordFun(t,y,flag,funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m)
status = 0; %=0 to keep ode-solver running, if =1 ode-solver stops
%counter for growing vectors
persistent k
if isempty(k)
k=0
end
%recording of every v value
persistent vel %to store vel for multiple calls of recordFun
global v %to access v from @systemEquationsRibose
vel(k+1)=v
assignin('base','vel',vel)
k=k+1 %counter increase for next elements of growing vectors
end