matlab ode23 提取成功集成步骤的变化参数
matlab ode23 extract changing parameter of successful integration steps
我有一个耦合微分方程组。其中一个参数随时间变化,我想跟踪所述参数的变化(并将其与我的最终图表叠加)。
我试图将 v 的所有生成值写入一个单独的向量。但是,由于并非所有函数调用都会导致成功集成,因此我最终得到的 v 值比我的 ode-solver return 向量的值要多。
有人可以指出我如何将此功能实现到我的代码中吗?
非常感谢,已经尝试了几个小时了。不幸的是,无济于事。
干杯,
大来
在下面找到我的代码:
耦合微分方程 + 尝试将 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 求解器调用:
[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],[],@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m);
v 由一个名为 funV0Ribose.The 的单独函数给出,funV0Ribose 的值在每个给定时间点都取决于 y(1)。
进行更多挖掘(并将正确的词放入 google)我找到了解决方案:
第二个答案连同阅读文档(这对我来说仍然很难,因为我是 MATLAB 的新手):
Saving derivative values in ode45 in Matlab
我的实现:
初始化输出函数:
options=odeset('OutputFcn', @recordFun)
global v
if isempty(v)
v=0
end
正在调用解算器:
[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],options,@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m);
记录乐趣:
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
我有一个耦合微分方程组。其中一个参数随时间变化,我想跟踪所述参数的变化(并将其与我的最终图表叠加)。
我试图将 v 的所有生成值写入一个单独的向量。但是,由于并非所有函数调用都会导致成功集成,因此我最终得到的 v 值比我的 ode-solver return 向量的值要多。
有人可以指出我如何将此功能实现到我的代码中吗?
非常感谢,已经尝试了几个小时了。不幸的是,无济于事。
干杯, 大来
在下面找到我的代码:
耦合微分方程 + 尝试将 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 求解器调用:
[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],[],@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m);
v 由一个名为 funV0Ribose.The 的单独函数给出,funV0Ribose 的值在每个给定时间点都取决于 y(1)。
进行更多挖掘(并将正确的词放入 google)我找到了解决方案: 第二个答案连同阅读文档(这对我来说仍然很难,因为我是 MATLAB 的新手): Saving derivative values in ode45 in Matlab
我的实现: 初始化输出函数:
options=odeset('OutputFcn', @recordFun)
global v
if isempty(v)
v=0
end
正在调用解算器:
[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],options,@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m);
记录乐趣:
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