2017-02-26 8 views
0

外部変数(時間 - ホルモンレベルとともに変化する)をodeに入力する方法を理解しようとします。 イベントの使用について考えています。私はしかし、私は間違ってSTHん私はMatlab ode solvers: changing state and specified time でコードを実行しようとしたその使用方法を学習するためには、最適化(ビルトイン・イベントとMATLABで微分方程式のoptimilisation)イベントを使用して外部変数を方程式に入力する

をしよう。私は問題が私の機能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などのソルバーを使用することをお勧めします。このようにして、私は解決策を得ることができました(特異行列に近いために多くの警告があります)。

私はそれがあなたを助けてくれることを願っています!

+0

ありがとうアレッサンドロ、私は行方不明を修正しましたが、それでもシリーズやエラーが発生し、実行されません。私はevents_in_Matlabを実行しようとします。関数myfunはodeにネストされていますが、次のエラーメッセージが表示され、実行されません。未定義関数または変数 'myfun'。 @(t、y)myfun(t、y、a)のエラー odeargumentsのエラー(行87) 不適切な方法で実行しようとしていますか?前もって感謝します。 – Malgorzata

+0

私はこれを次のように実行します: メインファイル 'dt = 0.01; T = 0:dt:30; y_0 = [0 0]; Y = 0(長さ(T)、長さ(y_0)); %t = 10〜t = 20、パラメータa = 10を渡してODEに追加 a = 10; (10/dt + 1:20/dt + 1)、Y(10/dt + 1、:))を計算することを特徴とする請求項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

関連する問題