3

かなり初心者の質問なので、ご容赦ください。

ここにある例に従っています-> http://www.codeproject.com/Articles/268589/odeint-v2-Solving-ordinary-differential-equations

特に、私はこの関数を見ています:

void lorenz( state_type &x , state_type &dxdt , double t )
{                                                         
dxdt[0] = sigma * ( x[1] - x[0] );
dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
dxdt[2] = x[0]*x[1] - b * x[2];
 } 

私の場合、R は一連の値 (100 個の double を持つベクトル) を取ります。

odeint は次のように呼び出されます。

integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , dt );

Rの各値に対してこれを行いたいのですが、どうすればこれを達成できますか? 私の C++/OOP に関する知識は限られていますが、喜んで学びます。

ありがとうございました。

4

2 に答える 2

4

「クラス」バージョンを使用できますがR、目的の値で初期化されるように変更してください。

class lorenz_class {
    double R_;
public:
    lorenz_class (double r) : R_(r) {}
    void operator()( state_type &x , state_type &dxdt , double t ) {
        dxdt[0] = sigma * ( x[1] - x[0] );
        dxdt[1] = R_ * x[0] - x[1] - x[0] * x[2];
        dxdt[2] = x[0]*x[1] - b * x[2];
    }
};

次に、ベクターを繰り返し処理し、テンプレート関数に渡すインスタンスRに値を渡します。lorenz_classintegrate_const

for (unsigned i = 0; i < myR.size(); ++i) {
    lorenz_class lorenz(myR[i]);
    integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , dt );
}
于 2012-08-21T18:02:47.017 に答える
3

ちょっとした補足: チュートリアルでは、ローレンツ系のパラメーター研究の非常によく似た例を示しています: http://headmyshoulder.github.com/odeint-v2/doc/boost_numeric_odeint/tutorial.html。これは Thrust と VexCL セクションにあり、この問題を並列化して複数の CPU または GPU で動作させる方法を示しています。

于 2012-08-22T05:45:36.357 に答える