2013-03-28 72 views
2

我正在用ode45解決許多不同參數(這些參數是微分方程的係數)的ODE系統,我想找到解決方案更小的參數(不大於)給定值。在MATLAB ode45輸出設置條件(運行時)

如何設置的條件上ODE45,以「檢測」是否自動解決方案(對於一些參數)變得比(給)值大而解決系統和停止求解進一步措施

Jan建議在輸入函數的定義中加入以下條件,以便int。我嘗試了這一點,但它不起作用:經過幾個步驟(儘管條件還不正確),迭代很快結束,輸出保持恆定在某個數字。 (不正確的輸出)

(QM,U,V等爲常數,X具有4列)

[T,X]=ode45(@acceleration,tspan,x0); 


function xprime=acceleration(T,X) 
    size_X=length(X); 
    xprime=zeros (4,1); 
     if X(size_X,1)>threshold 

    xprime(1)=0; 
    xprime(2)=0; 
    xprime(3)=0; 
    xprime(4)=0; 

     else 

    xprime(1)=X(3); 
    xprime(2)=X(4); 
    xprime(3)=X(1)*X(4)^2 - 2*qm*(U+V*(cos(w*T)))*F1(num,X(1),X(2)); 
    xprime(4)= -2*X(3)*X(4)/X(1) - qm*((U+V*(cos(w*T)))/(X(1)))*F2(num,X(1),X(2)); 

     end 
    end 
  • 什麼是與上面的代碼的問題?
  • 有人建議將監視功能附加到ode45。 (here)。有誰知道如何做到這一點? 謝謝

回答

1

我沒有看到內置在Matlab ODE求解器中的選項,可能是(錯)用於您的目的。

但是,您可以相應地修改右邊的y' = f(t,y)。我可能會想到

  • IF y > threshold THEN f(t,y) = 0 - 這應該導致因爲步長控制的迭代中ODE45
  • 或者拋出一個異常快結束時,只有取消當前迭代(不知道如何做到這一點;)
+0

感謝您的幫助。我之前在scicomp.stackexchange上問過這個問題,並且有人建議將監視函數附加到ode45。這裏:[鏈接](http://scicomp.stackexchange.com/questions/5383/setting-a-condition-on-matlab-ode45-output?noredirect=1#comment10331_5383)。你現在該怎麼做? –

+0

我試過你的建議(就像我在問題中寫的那樣)。但它不起作用(如上所述)那有什麼問題? –

+0

行爲如預期。也許你的切換條件不對。你想檢查第四個組件嗎?嘗試檢查size_X是否符合你的要求... – Jan

0

您是否解決一組方程或試圖隨時間積分?沒有更多的信息,這聽起來像你應該使用fsolve或fmincon?

如果你真的在整合,我認爲你可以使用事件功能來指示你想停止的ode45。 ballode的例子可能會有所幫助。