how to stop ode45 when one of states reach certain value

282 views (last 30 days)
[x_dot] =derivative(t, x)
x is states [x(1).....x(4)] I need to stop the integration when x(3) reaches 0.1 when the integration stop record (t)

Accepted Answer

Jan
Jan on 4 May 2016
Opt = odeset('Events', @myEvent);
[T, Y] = ode45(@YourFun, T, Y0, Opt);
function [value, isterminal, direction] = myEvent(T, Y)
value = (Y(3) == 0.1);
isterminal = 1; % Stop the integration
direction = 0;
  7 Comments
James Gilliam
James Gilliam on 20 Oct 2023
What is T in this senario and how is it defined? Thanks
Walter Roberson
Walter Roberson on 20 Oct 2023
In the call
[T, Y] = ode45(@YourFun, T, Y0, Opt);
the input T is the timespan to integrate over. It is a vector that must have at least two elements, but may have more. If it has two elements then ode45() will decide by itself what times to output information at; if it has more than two elements then ode45() will output information at the times given in the vector.

Sign in to comment.

More Answers (2)

Walter Roberson
Walter Roberson on 4 May 2016
Edited: Walter Roberson on 13 Sep 2017

Gustavo Lunardon
Gustavo Lunardon on 17 Aug 2020
This is confusing. In matlab help it says: An event occurs when value(i) is equal to zero. All answers in this post make it value = 1 for the event to happen. Are the answers outdated somehow?
  1 Comment
Walter Roberson
Walter Roberson on 19 Aug 2020
This is a valid concern.
value = (X(8) == 0.05 ) and (Y(3) == 0.1) would happen rarely, when the values were bit-for-bit identical to the representation of 0.05 and 0.1 . One bit different in the representation and the condition will not fire. Better is to write x(8) - 0.05 or 0.05 - x(8), and Y(3)-0.1 or 0.1-Y(3) -- zero crossings can be detected for those.

Sign in to comment.

Categories

Find more on Programming in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!