CroCo
CroCo

Reputation: 5741

ode solver with fixed step size

I would like to know whether the step size in odeint is fixed or not. In stepper

The basic stepper concept. A basic stepper following this Stepper concept is able to perform a single step of the solution x(t) of an ODE to obtain x(t+dt) using a given step size dt.

In my following code,

#include <iostream>
#include <boost/numeric/odeint.hpp>

using namespace std;
using namespace boost::numeric::odeint;

/* The type of container used to hold the state vector */
typedef std::vector< double > state_type;

const double gam = 0.15;


void sys( const state_type &x , state_type &dx ,  double t )
{
    dx[0] =  x[1];
    dx[1] = -x[0] - gam*x[1];

    static int count(0);

    cout << "count in sys: " << count << endl;

    ++count;
}

int main(int argc, char **argv)
{
    const double dt = 0.1;

    runge_kutta_dopri5<state_type> stepper;
    state_type x(2);
    // initial values
    x[0] = 1.0;
    x[1] = 0.0;



   int count(0);
   double t = 0.0;

   for ( size_t i(0); i < 100; ++i, t+=dt ){

       stepper.do_step(sys , x , t, dt );
       cout << "count in main: " << count << endl;
       ++count;
   }

    return 0;
}

In the above code, I have two counters, one inside the sys function which is passed to do_step for solving the ode and another counter inside the main function. The output is shown as follows

count in sys: 598 
count in sys: 599 
count in sys: 600 
count in main: 99 
Press any key to continue . . .

Does this mean that the step size is not fixed because the sys is being called more than the once in the main?

Upvotes: 0

Views: 503

Answers (1)

headmyshoulder
headmyshoulder

Reputation: 6310

The step size is fixed for your stepper. For each step is calls the system function 6 times. In detail, it performs 6 Euler steps each with a different step sizes and does some kind of averaging to increase the accuracy of the solution.

Upvotes: 2

Related Questions