1

小さな問題があります。'ph' と 'ph2' の 2 つの運動方程式があります x(1)> 0.111 のときに 'ph' の計算を停止するように ODE を設定する方法がわかりません。その後、0.111 までしか 'ph2' の計算を開始しません。 'ph' + 'ph2' を 1 つのグラフにプロットすると、時間 'w' に依存します。時間制限を設定する必要があると思いますが、方法がわかりません。HELP を使用していますが、何のメリットもありません。

[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];
4

1 に答える 1

4

Event location プロパティx(1) > 0.111を使用できるときに ph の計算を停止するには(マニュアル ページとその使用方法の)。実際には、これはタイム ステップごとに評価される関数であり、返される値が 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

そして、options = odeset('Events',@events)呼び出す前に設定してください

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

しかし、 ph が出力dx=[x(2); ...]することを考えると、 x(1) のチェックを行うには、その変数も出力する必要があります-次のようなものですdx=[x(1); x(2);...]

お役に立てれば。

于 2013-05-27T14:49:25.960 に答える