1

I have a small problem. I have 2 equation of motion 'ph' and 'ph2' I don´t know how to set ODE to stop calculating 'ph' when x(1)> 0.111 and then starts to calculated 'ph2' again only to 0.111, after that plot 'ph' + 'ph2' to one graph depend on time 'w' i think I have to set some time limitations but dont know how to. I use HELP but no benefit for me.

[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];
user2401142
  • 9
  • 1
  • 4

1 Answers1

4

To stop calculating ph when x(1) > 0.111 you can use the Event location property (manual page and example on how to use it). In practice it's a function evaluated at each time step and if the value returned is 0, then ode45 stops the integration.

Add the function

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

And set it by options = odeset('Events',@events) before calling

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

But given that ph outputs dx=[x(2); ...], in order to do a check on x(1) you need to output also that variable - something like dx=[x(1); x(2);...]

Hope this helps.

Michele
  • 2,796
  • 2
  • 21
  • 29
  • It may help to look at the `ballode` demo included with Matlab. Type `edit ballode` in the command window to see the code. Note how in that example they seed subsequent iterations with information from the previous one, which can greatly improve efficiency: `options = odeset(options,'InitialStep',t(nt)-t(nt-refine),'MaxStep',t(nt)-t(1));`. – horchler May 27 '13 at 17:50
  • Also, using global variables is not a good idea. You should pass your parameters using [anonymous functions](http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html). See my answer to [this question](http://stackoverflow.com/questions/16598558/finding-the-maxima-of-a-function-using-ode45/16639006#16639006) for examples of how to pass parameters to your integration functions and events functions using `ode45`. – horchler May 27 '13 at 17:57
  • Thx a lot guys. Nicely done! I need to work, after that i can debug and optimalize that. – user2401142 May 27 '13 at 20:43