0

ブースト1.55でMint 12でg ++ 4.7を実行しています。私は odeint で ode の単純な 2d システムを解決しようとしています - ここで 1d の例に従ってください: 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/algebra/range_algebra.hpp:129:47: エラー: 配列を返す関数

配列 double[2] は問題ですか? そして、どうすれば修正できますか?おそらくベクトルを使用していますか?ちなみに両方使ってみた

typedef runge_kutta_cash_karp54< double > stepper_type;

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

1dの回答で提案されているとおりですが、役に立ちません。また、古いブーストを搭載した古いマシン(どのバージョンかは覚えていません)では、すべてが問題なくコンパイルされたことにも言及する必要があります。ご提案ありがとうございます。

4

1 に答える 1

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;
于 2014-03-20T12:39:37.320 に答える