2017-02-26 58 views
0

我試圖弄清楚如何將外部變量(隨時間變化 - 激素水平)輸入到模型中。 我正在考慮使用事件。我嘗試做優化(微分方程optimilisation在Matlab與內置事件)使用事件將外部變量輸入方程

爲了學習如何使用他們,我一直在努力,在Matlab ode solvers: changing state and specified time 但是運行的代碼,我做某事錯了。我想這個問題與我的功能myfun有關,但我不知道爲什麼。

我試過以下運行:

  function ydot=myfun(t,y,a) 

      S1 = 2 *a* 2 * y(2) - 2 * 3 * y(1)*y(1); 
      S2 = 3 * y(1)*y(1) + a - 5 * y(2); 
      ydot = [S1; S2]; 
      y_0=[0,0]; 
      %[t,y]=ode45(@myfun,[0:0.1:Tfinal],y_0); 


and run following with nested myfun function: 


%function events=events_in_Matlab(a) 
     dt=0.01; 
     T=0:dt:30; 
     y_0=[0 0]; 
     Y=zeros(length(T),length(y_0)); 


     %t=0 to t=10, pass parameter a=0 to add to ODEs 
     a=0; 
     [~,Y(1:10/dt+1,:)]=ode45(@(t,y)myfun(t,y,a),T(1:10/dt+1),y_0); 
     %t=10 to t=20, pass parameter a=10 to add to ODEs 
     a=10; 
     [~,Y(10/dt+1:20/dt+1,:)]=ode45(@(t,y)myfun(t,y,a),T(10/dt+1:20/dt+1), 
     Y(10/dt+1,:)); 
     %t=20 to t=30, pass parameter a=20 to add to ODEs 
     a=20; 

     [~,Y(20/dt+1:end,:)]=ode45(@(t,y)myfun(t,y,a),T(20/dt+1:end),(20/dt+1,:)); 
+0

您需要執行插值,因爲步長在ode45中不固定。 – CroCo

回答

0

我覺得你的代碼是正確的,但你的微分方程可能不正常。

首先,你的最後一個方程缺少「Y」,它應該是:

[~,Y(20/dt+1:end,:)]=ode45(@(t,y)myfun(t,y,a),T(20/dt+1:end),Y(20/dt+1,:));

其次,它似乎這是微分方程的剛性系統。我建議你使用另一個解算器,例如ode23s而不是ode45。通過這種方式,我設法得到了一個解決方案(由於接近奇異矩陣而引發了很多警告)。

我希望它能幫助你!

+0

謝謝亞歷山德羅,我已經糾正了一個缺少的Y,但仍然得到一系列錯誤或者錯誤,並且它沒有運行。我嘗試執行events_in_Matlab,因爲函數myfun嵌套到ode中,但會得到以下錯誤消息,並且不會運行:未定義的函數或變量「myfun」。 錯誤events_in_matlab> @(t,y)myfun(t,y,a) odearguments中的錯誤(第87行) 我是否嘗試以不正確的方式運行?提前致謝。 – Malgorzata

+0

我這樣運行: 在主文件中 'dt = 0.01; T = 0:dt:30; y_0 = [0 0]; Y =零(長度(T),長度(Y_0)); %t = 10到t = 20,通過參數a = 10加到ODE a = 10; (t,y,)myfun(t,y,a),T(10/dt + 1:20/dt +1),Y(10/dt + 1,:)) ; 情節(T1,Y1)' 而在功能來解決: '函數ydot = myfun(T,Y,A) S1 = 2 * A * 2 * Y(2) - 2 * 3 * Y(1)* Y(1); S2 = 3 * y(1)* y(1)+ a-5 * y(2); ydot = [S1; S2]; end' –

+0

非常感謝你的解釋,它讓我從更復雜的例子開始。 – Malgorzata