MatLab ODE启动/停止条件

我有一个小问题。 我有2个运动方程'ph'和'ph2'我不知道如何在x(1)> 0.111时设置ODE停止计算'ph',然后开始再次计算'ph2'到0.111,之后将'ph'+'ph2'绘制成一张图取决于时间'w',我认为我必须设定一些时间限制,但不知道如何去做。 我使用帮助但对我没有好处。

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

要在x(1) > 0.111时停止计算ph值,可以使用Event location属性 (手册页和示例如何使用它)。 在实践中,它是在每个时间步骤评估的函数,如果返回的值为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); ...] dx=[x(2); ...] ,为了检查x(1),你还需要输出这个变量 - 就像dx=[x(1); x(2);...] dx=[x(1); x(2);...]

希望这可以帮助。

链接地址: http://www.djcxy.com/p/84183.html

上一篇: MatLab ODE start/stop conditions

下一篇: How do I emulate 'include' behaviour in MATLAB?