Я использую 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-м ответе, но безрезультатно. Отмечу также, что на старой машине со старым бустом (не помню какой версии) все компилировалось без проблем. Спасибо за любое предложение!