- #1
nand_1
- 16
- 0
Hi all,
I'm having some issues with Matlab.
I'm running ode45 inside a function which is called repeatedly in a finite loop. As it is being called, Matlab is plotting and saving the data externally.
Here's a quick pseudo-code
This is all well and good, but as soon as ode45 is unable to solve a DE (were the solution does not converge), Matlab gets stuck in an (almost?) infinite loop repeatedly calling ode45 until a solution is found. I can obviously stop this using "Ctrl-C" but this will screw up the data I'm trying to gather and plot.
Is there a way to get ode45 to return some value if it takes more than x seconds to find a solution? Or perhaps get it to stop executing func2 and resume func1 (see above code).
I am already using the events function to stop ode45 as soon as it has converged close to the solution.
i.e,
Thanks in advance.
I'm having some issues with Matlab.
I'm running ode45 inside a function which is called repeatedly in a finite loop. As it is being called, Matlab is plotting and saving the data externally.
Here's a quick pseudo-code
Code:
func1 ( )
loop {
data = func2 (variables)
save data
plot data
}
end func1
func2 ( input vars)
--
--
options = odeset('events',@missile_event, 'RelTol',1e-14);
[t, x, te, xe, ie] = ode45 ( @de, [t0 tf], x0, options );
--
--
plot x vs t etc..
--
--
return data;
end
This is all well and good, but as soon as ode45 is unable to solve a DE (were the solution does not converge), Matlab gets stuck in an (almost?) infinite loop repeatedly calling ode45 until a solution is found. I can obviously stop this using "Ctrl-C" but this will screw up the data I'm trying to gather and plot.
Is there a way to get ode45 to return some value if it takes more than x seconds to find a solution? Or perhaps get it to stop executing func2 and resume func1 (see above code).
I am already using the events function to stop ode45 as soon as it has converged close to the solution.
i.e,
Code:
function [lookfor stop direction ] = missile_event(t, x)
r = sqrt(x(1)^2 + x(2)^2) ;
lookfor = r - 0.1;
stop = 1;
direction = 0;
Thanks in advance.