Boost logo

Boost :

Subject: [boost] library proposal: odeint
From: Karsten Ahnert (karsten.ahnert_at_[hidden])
Date: 2009-12-13 10:02:34


Hi,

I am new on this list and want to start a discussion if a library for
solving ordinary differential equations (ODEs) would fit into boost.

We are developing a lib - odeint - for such problems. odeint can be
found in the sandbox: https://boost.org/svn/boost/sandbox/odeint, but
the current stage is far away from being ready for release or submission.

ODEs are usually solved iteratively. Therefore, we have introduced two
stepper concepts, one for steppers with- and one for steppers without
error estimation. At the moment some explicit solvers are implemented:
Euler, RK4, Cash Karp, RK78,midpoint and Burlisch-Stoer.

Here are some examples:

typedef std::tr1::array< double , 3 > state_type;

// define the ODE
void lorenz( state_type &x , state_type &dxdt , double t )
{
    const double sigma = 10.0 , R = 28.0 , b = 8.0 / 3.0
    dxdt[0] = sigma * ( x[1] - x[0] );
    dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
    dxdt[2] = x[0]*x[1] - b * x[2];
}

state_type x = {{ 1.0 , 0.0 , 0.0 }};
ode_step_euler< state_type > stepper;
double t = 0.0;

// iterate the ODE by hand with constant stepsize
for( size_t oi=0 ; oi<10000 ; ++oi,t+=dt )
    stepper.next_step( lorenz , x , t , 0.01 );

// integrate the ODE with constant stepsize
// from t = 0.0 to t = 100.0 with dt = 0.01
// and write t and x[0] to cout
integrate_const( rk4 , lorenz , 0.0 , 0.01 , x , 100.0 ,
               cout << _1 << tab << _2[0] << "\n" );

// stepsize controller for rk5 cash-karp
controlled_stepper_standard< stepper_rk5_ck< state_type > >
        rk5_controlled( rk5 , eps_abs, eps_rel, 1.0, 1.0);

// solve the ODE with an adaptive stepsize controller
size_t steps = integrate_adaptive( controlled_rk5, lorenz, x, 0.0,
       10.0 , 0.01, cout << _1 << tab << _2[0] << "\n" );

Best regards,

Karsten


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk