Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

How to use Matlab ODE solver events to stop an integration

  1. May 16, 2012 #1

    ryan.j

    User Avatar
    Gold Member

    How to use Matlab ODE solver "events" to stop an integration

    I'm using Matlab's ODE solver (specifically ode15s) to solve a system of equations. The sum of the values of the equations eventually arrive at a steady state, but the time at which that occurs is dependent on several things, not known beforehand, and is one of the things I'm studying.

    Consequently, I'd like to set tf in the call to the ODE solver to a value that I'm confident is beyond that time, and cause the integration to stop once a certain convergence criteria is met.

    I have been unable to use 'Events' to do this effectively. Here is the function that is called by 'Events':

    function [value,isterminal,direction] = Tprime_converger(t,T)

    if length(t) == 1 %convergence can only be checked for t>1
    value = 1;
    else
    value = abs(sum(T(length(t)-1,;)) - sum(T(length(t),;))) - 2*eps;
    end

    isterminal = 1;
    direction = 0;

    end


    Any help would be greatly appreciated.

    Thanks.
    -ryan
     
    Last edited: May 16, 2012
  2. jcsd
  3. May 17, 2012 #2

    ryan.j

    User Avatar
    Gold Member

    Re: How to use Matlab ODE solver "events" to stop an integration

    After ruminating on it through the night I came up with a solution. If someone knows of a better way to do this, by all means share it.

    What I did was create a variable that was global to both the "Tprime_converger" function and the "Tprime" function, which is the function where the system of ODEs is defined.

    At the end of "Tprime", I added the computation :

    Taco = T - dT;

    and I changed "Tprime_converger" to :

    function [value,isterminal,direction] = Tprime_converger(t,T)

    value = abs( sum(Taco(:)) - sum(T(:)) ) - 2*eps;

    isterminal = 1;
    direction = -1;

    end

    I checked the values against computations using the same functions without implementing any 'Events' where the ODE solver is part of a loop with its own convergence checker built in at each time step the loop iterates on, and the solutions differed with a relative difference on the order of 10^-14; essentially no difference. The upshot is that the implementation using 'Events' converges significantly more rapidly.

    -ryan
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: How to use Matlab ODE solver events to stop an integration
  1. MATLAB ODE solver (Replies: 2)

  2. Matlab ode solver (Replies: 1)

Loading...