Простая 2D-система (с использованием массива) с odeint не компилируется

Я использую g++ 4.7 на Mint 12 с Boost 1.55. Я пытаюсь решить простую 2D-систему оды с помощью odeint, следуя приведенному здесь примеру 1d: 1d. Первый пример хорошо компилируется как в исходной версии, так и в измененной версии из ответа. Теперь, если я хочу 2D-систему и использую double[2], ничего не работает:

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

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

void rhs( const double *x, double *dxdt, const double t )
{
    dxdt[0] = 3.0/(2.0*t*t) + x[0]/(2.0*t);
    dxdt[1] = 3.0/(2.0*t*t) + x[1]/(2.0*t);
}

void write_cout( double *x, const double t )
{
    cout << t << '\t' << x[0] << '\t' << 2*x[1] << endl;
}

typedef runge_kutta_cash_karp54< double[2] > stepper_type;

int main()
{
    double x[2] = {0.0,0.0};
    integrate_adaptive( make_controlled( 1E-12, 1E-12, stepper_type() ), rhs, x, 1.0, 10.0, 0.1, write_cout );
}

Сообщение об ошибке представляет собой беспорядок, но заканчивается:

/usr/include/boost/numeric/odeint/алгебра/range_алгебра.hpp:129:47: ошибка: функция, возвращающая массив

Является ли массив двойным [2] проблемой? И как мне это исправить? Возможно, с помощью вектора? Кстати, я пробовал использовать оба

typedef runge_kutta_cash_karp54< double > stepper_type;

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

как было предложено в 1-м ответе, но безрезультатно. Отмечу также, что на старой машине со старым бустом (не помню какой версии) все компилировалось без проблем. Спасибо за любое предложение!


person FedericoUrban    schedule 20.03.2014    source источник


Ответы (1)


Используйте std::array‹ double ,2 >

#include <array>

typedef std::array< double , 2 > state_type;
void rhs( state_type const &x, state_type &dxdt, const double t )
{
    dxdt[0] = 3.0/(2.0*t*t) + x[0]/(2.0*t);
    dxdt[1] = 3.0/(2.0*t*t) + x[1]/(2.0*t);
}

void write_cout( state_type const& x, const double t )
{
    cout << t << '\t' << x[0] << '\t' << 2*x[1] << endl;
}

typedef runge_kutta_cash_karp54< state_type > stepper_type;
person headmyshoulder    schedule 20.03.2014