odeint простой пример 1d ode не компилируется

Я пытаюсь запустить примеры odeint в boost

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


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


/* we solve the simple ODE x' = 3/(2t^2) + x/(2t)
 * with initial condition x(1) = 0.
 * Analytic solution is x(t) = sqrt(t) - 1/t
 */

void rhs( const double x , double &dxdt , const double t )
{
    dxdt = 3.0/(2.0*t*t) + x/(2.0*t);
}

void write_cout( const double &x , const double t )
{
    cout << t << '\t' << x << endl;
}

// state_type = double
typedef runge_kutta_dopri5< double > stepper_type;

int main()
{
    double x = 0.0; 
    //with the following line commented the program compiles
    integrate_adaptive( make_controlled( 1E-12 , 1E-12 , stepper_type() ) ,
                        rhs , x , 1.0 , 10.0 , 0.1 , write_cout );
}
54_0 на Debian Squeeze g++4.4.

Система Лоренца работает нормально, но Простая одномерная ода:

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


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


/* we solve the simple ODE x' = 3/(2t^2) + x/(2t)
 * with initial condition x(1) = 0.
 * Analytic solution is x(t) = sqrt(t) - 1/t
 */

void rhs( const double x , double &dxdt , const double t )
{
    dxdt = 3.0/(2.0*t*t) + x/(2.0*t);
}

void write_cout( const double &x , const double t )
{
    cout << t << '\t' << x << endl;
}

// state_type = double
typedef runge_kutta_dopri5< double > stepper_type;

int main()
{
    double x = 0.0; 
    //with the following line commented the program compiles
    integrate_adaptive( make_controlled( 1E-12 , 1E-12 , stepper_type() ) ,
                        rhs , x , 1.0 , 10.0 , 0.1 , write_cout );
}

не компилируется. Есть 192 строки ошибок, которые заканчиваются на:

/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘end(double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(const double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(const double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(double&)’
/usr/local/include/boost/numeric/odeint/algebra/range_algebra.hpp:76: error: no matching function for call to ‘begin(double&)’

В чем проблема?


person cpp    schedule 15.09.2013    source источник
comment
Похоже, вы используете g++ 4.4, который не поддерживает функцию std::begin, появившуюся с C++11. Вы можете попробовать обновить свой компилятор gcc до последней версии (не уверен в этом, так что это комментарий, а не ответ)   -  person taocp    schedule 15.09.2013
comment
@taocp, я пытался скомпилировать это с включенными функциями С++ 11: g++ -std=c++0x test.cpp -o test но ошибка та же   -  person cpp    schedule 15.09.2013


Ответы (1)


Пример на веб-странице работает только с версией odeint на github. Если вы измените тип шагового двигателя на

typedef runge_kutta_dopri5< double , double , double , double , vector_space_algebra > stepper_type;

он должен работать. Мы включили механизм автоматического определения алгебры, которого нет в официальной версии Boost, но который будет добавлен очень скоро.

person headmyshoulder    schedule 15.09.2013
comment
Спасибо! Я бился пару часов, пытаясь заменить решатель gsl решателем boost::numeric::odeinit. Будет ли эта функция перенесена в более ранние версии boost? - person Dilawar; 10.04.2016
comment
Нет, мы не будем обратно портировать эту функцию. Я думаю, что это тоже не способ повышения. Теперь в boost есть бэкпорты. По крайней мере, я не знаю никаких бэкпортов. - person headmyshoulder; 10.04.2016