3

odeint ブースト インテグレータを使用して、カー時空の測地線を調べたいと思います。これには、さまざまなパラメーター値に対して積分器を実行する必要があります (初期条件と初期運動量ベクトルがあるため、システムの角運動量は開始方法によって異なります)。

ここに配置された優れた例に従っています

http://headmyshoulder.github.io/odeint-v2/examples.html

具体的には、ローレンツ アトラクタの例です。

私が最初に注意したこと (ローレンツではなく、私のカー システムで) は、いくつかの初期条件で t=0 の時点の後に NaN が得られることです (ただし、これはどこかでより深いエラーを示唆していることは間違いありません)。これをさらに調査するために、毎回再コンパイルすることなくシステムのパラメーターを変更できるようにしたいと考えています。これは、たとえば R や sigma を再コンパイルせずに変更したい場合と同じです。私が知る限り、おそらくここの2番目のコードブロックを除いて、追加の引数を統合関数に渡す直接的な方法はありません

http://headmyshoulder.github.io/odeint-v2/doc/boost_numeric_odeint/tutorial/harmonic_oscillator.html

私は C++ の知識が不足しているため、よくわかりません。

実行時の引数を取得してこのソルバーに渡す方法についての知識をいただければ幸いです。これにより、毎回コンパイルせずに一連のバッチを実行できます。

4

2 に答える 2

2

ODE を定義するシステム関数にランタイム パラメーターを渡すことができます。

struct ode
{
    double param;
    ode( double param ) : m_param( param ) {}

    void operator()( state_type const& x , state_type& dxdt , time_type t ) const 
    {
        // your ode
    }
};

integrate_const( stepper {} , ode { 0.1 } , x , t_start , t_end , dt , observer );
于 2015-11-23T06:46:59.853 に答える