2015-04-15 35 views
0

我有一個耦合微分方程組。其中一個參數隨着時間而變化,我想跟蹤所述參數的變化(並用我的最終圖形覆蓋它)。matlab ode23提取成功的積分步驟改變參數

我試圖將所有生成的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求解器調用:

[t,y]=ode23(@systemEquationsRibose, [t0 tx],[Cc0 Cs0],[],@funV0Ribose,V,umax,Ks,rd,Cs0,Ys,m); 

v由一個單獨的函數fu nV0Ribose。funV0Ribose的值取決於y(1)在每個給定的時間點。

+0

如在您的其他問題提出,而不是使用'[T0 TX]'規定的採樣點的列表,'linspace(T0,TX,300)'或類似。步長仍然是自適應的,採樣點處的值將被內插。 – LutzL

+0

嗨再次=) 我不知道這是如何幫助。我仍然會得到一個向量vel,其中包含v的值,返回數組中沒有相應的值。如果我錯過了一些事情,請詳細說明。 – Dahlai

+0

難道你不能只在't'上評估'funV0Ribose'並且''你在oncce上''ode23'已經完成了嗎? – David

回答

0

做了一些更深入的挖掘(並將正確的詞彙輸入到google)我找到了一個解決方案: 第二個答案與閱讀文檔一起閱讀(對我來說這仍然非常困難,因爲我對MATLAB很新穎): Saving derivative values in ode45 in Matlab

我的實現: 初始化輸出功能:

options=odeset('OutputFcn', @recordFun) 
global v 
if isempty(v) 
    v=0 
end 

調用ODE求解器:

[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