2013-05-27 86 views
1

我有一個小問題。我有2個運動方程'ph'和'ph2'我不知道如何在x(1)> 0.111時設置ODE來停止計算'ph',然後開始再次計算'ph2'到0.111,之後在一張圖上繪製'ph'+'ph2'取決於時間'w',我認爲我必須設置一些時間限制,但不知道如何去做。我使用幫助但對我沒有好處。MatLab ODE啓動/停止條件

[t,y] = ode45(@ph,[0,w_max],[0,0]); 

function dx = ph(tt,x) 
global F1 c m_c Ff p w s ln f_t sig dstr Ren pn Fex Fzmax xz xn l Fz mn 
Fpp = F1 + c*x(1); 

if pn<0 
pn=abs(pn); 
end 

if x(1)<ln 

    pn=spline(w,p,tt)-((2*sig)/dstr*Ren);  
    Fex=3.1416.*f_t.*pn.*(ln-x(1)); 
end 

if x(1)<42e-5 
    Fz = Fzmax*(1-(1/xz)*(x(1)+l)); 
end 

if x(1)>44e-3 
    m_c=m_c-mn; 
end 
dx=[x(2);((spline(w,p,tt)*s)-Fpp-Ff-Fex-Fz)./m_c]; 


[t2,y2] = ode45(@ph2,[0,w_max],[0,0]); 

function dx=ph2(tt,x) 

    global Fv m_c g f alfa Fzp c m_nbp 

    Ft=m_c*g*f; 
    Fv = 2*f*(Fzp/cos(alfa)); 

    if x(1)>0.44 

    m_c=m_c+m_nbp 

    end 

    dx = [x(2);((x(1)*c)-Ft-Fv)/m_c]; 
+0

你的意思是說你真的想建立一個分段函數作爲ODE嗎? – wakjah

+0

我不知道更好的解決方案:o/ – user2401142

回答

4

要停止計算pH值時x(1) > 0.111可以使用活動地點財產(關於如何使用它manual pageexample)。在實踐中,它是在每個時間步驟評估的函數,如果返回的值爲0,則ode45會停止積分。

添加功能

function [value,isterminal,direction] = events(t,y) 
% Locate the time when y passes through 0.111 in all 
% directions and stop integration. 
value = y(1) - 0.111; % Detect y=0.111 
isterminal = 1;  % Stop the integration 
direction = 0;   % All direction 

,並呼籲

[t,y] = ode45(@ph,[0,w_max],[0,0],options); 

之前options = odeset('Events',@events)設置但考慮到pH值的輸出dx=[x(2); ...],爲了做X上的一個檢查(1)你需要輸出也是這個變量 - 就像dx=[x(1); x(2);...]

希望這會有所幫助。

+0

這可能有助於查看Matlab附帶的'ballode'演示。在命令窗口中輸入'edit ballode'來查看代碼。請注意,在這個例子中,他們如何使用前一個信息進行後續迭代,這可以大大提高效率:'options = odeset(options,'InitialStep',t(nt)-t(nt-refine),'MaxStep',t (NT)-t(1));'。 – horchler

+0

另外,使用全局變量不是一個好主意。您應該使用[匿名函數]傳遞參數(http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html)。查看我對[這個問題]的答案(http://stackoverflow.com/questions/16598558/finding-the-maxima-of-a-function-using-ode45/16639006#16639006),瞭解如何將參數傳遞給您的示例集成函數和使用'ode45'的事件函數。 – horchler

+0

Thx很多傢伙。做得很好! 我需要工作,之後,我可以調試和優化。 – user2401142