How to become aware of failure of ode45 without looking at the displayed warning?

StackOverflow https://stackoverflow.com/questions/17537254

  •  02-06-2022
  •  | 
  •  

Question

When the solution of ODE45 diverges (doesn't matter why and how), the following warning will be displayed, and the solver can not continue:

Warning: Failure at t=8.190397e+01. Unable to meet integration tolerances without reducing the step size below the smallest value allowed (2.273737e-13) at time t.

I am running ode45 on a matrix (lots of inputs), so I want to find out automatically for which inputs the above condition(failure) happens. I mean, Is there any other sign of this condition returned by ode45 that can be written in an array automatically? Something that can be used in a if statment as:

if {some variable is returned/is equal to ...} then {the solver has failed}

to identify those faulty inputs automatically without looking for the displayed warning.

Was it helpful?

Solution

You can turn that warning into an error, and errors can be caught by try/catch blocks.

An example:

% Change this particular warning into an error
warnId = 'MATLAB:ode45:IntegrationTolNotMet';
warnstate = warning('error', warnId);    

% That can be caught with try/catch
try     
    % Quick-failing integration, suggested by horchler
    [t,y] = ode45(@(t,y)[y(1)^2;y(2)],[0 1],[1;1]);

catch ME
    % Check if we indeed failed on meeting the tolerances
    if strcmp(ME.identifier, warnId)

        % DO YOUR STUFF HERE

    else
        % Something else has gone wrong: just re-throw the error
        throw(ME);
    end

end

% Don't forget to reset the warning status
warning(warnstate);

You can get the warnId of any warning by virtue of the lastwarn command. For errors, see lasterr.

OTHER TIPS

Another method would be to just check for how much time ode45 was able to run. for example if you run

[x,t] = ode45(@some_ode,[t0,tf],x0);

then after this line is executed, simply check the value of t(end). If t(end)==tf, then ode45 did its job, otherwise there was a failure

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top