[SciPy-user] integrate.odeint and event handling
Christopher W. MacMinn
cmac@mit....
Wed Jan 21 11:44:02 CST 2009
Hello -
I was wondering if integrate.odeint offers any event handling
capabilities.
For example, say that I want to solve the simple ODE df/dt=f-2 with
f(t=0)=1. Also, say that I want to stop the integration when f=0,
maybe because I don't care about negative values of f, or maybe
because what I really want to know is the value of t when f=0. (The
analytical solution is f(t) = 2-exp(t), and f=0 at t=ln(2).)
The MATLAB code below will produce the desired solution. It will stop
integration when f=0, and I believe it will also integrate with some
care near f=0. Additionally, MATLAB returns the vector of times at
which the solution is evaluated, so I can easily grab the value of t
when f=0.
% ---------------------------------------------------------
function [ts,fs] = ode_with_events()
function dfdt = df(t,f)
dfdt = f-2.;
end
function [value,isterminal,direction] = df_events(t,f)
value = f;
isterminal = 1;
direction = 0;
end
f0 = 1.;
t0 = 0.;
t_max = 5.;
options = odeset('events',@df_events);
[ts,fs] = ode45(@df,[t0,t_max],f0,options);
end
% ---------------------------------------------------------
The Python code below integrates the ODE just fine, but is there a way
to get the "event" functionality described above?
# ---------------------------------------------------------
import numpy as np
from scipy import integrate
def ode_with_events():
def df(f,t):
return f-2.
f0 = 1.
t0 = 0.
t_max = 5.
ts = np.linspace(t0,t_max,100)
fs = integrate.odeint(df,f0,ts)
return ts,fs
# ---------------------------------------------------------
Thanks!
Best, Chris
More information about the SciPy-user
mailing list