2

暗黙的なスキームを使用して odeint ライブラリを使用して ODE のシステムを解くことに興味があり、単純なimplicit_euler例を実装するのが困難です。

ドキュメントを見ると、明示的なステッパー、適応型のステッパー、およびステッパーを機能させることができましたrosenbrock4。前者は半暗黙的なようです。したがって、私は完全に暗黙的なスキームを実装することに興味がありました (同時に、各時間ステップでヤコビ行列を取得します)。しかし、このステッパーのドキュメントと実際の例を見つけることができませんでした。私が持っているのは

typedef boost::numeric::ublas::vector< double > vector_type;
typedef boost::numeric::ublas::matrix< double > matrix_type;`

struct stiff_system
{
    void operator()( const vector_type &x , vector_type &dxdt , double /* t */ )
    {
        dxdt[ 0 ] = -101.0 * x[ 0 ] - 100.0 * x[ 1 ];
        dxdt[ 1 ] = x[ 0 ];
    }
};

struct stiff_system_jacobi
{
    void operator()( const vector_type & /* x */ , matrix_type &J , const double & /* t */ , vector_type &dfdt )
    {
    J( 0 , 0 ) = -101.0;
    J( 0 , 1 ) = -100.0;
    J( 1 , 0 ) = 1.0;
    J( 1 , 1 ) = 0.0;
    dfdt[0] = 0.0;
    dfdt[1] = 0.0;
    }
};

typedef implicit_euler< double > stepper_IE;
vector_type inout( 2 , 1.0 );
size_t steps = integrate_const( stepper_IE() ,
            std::make_pair( stiff_system() , stiff_system_jacobi() ) ,
            inout , 0.0 , 5.0 , 0.01, streaming_observer( std::cout, x_vec , times ));

エラーは次のとおりです。

C:\boost_1_55_0\boost\numeric\odeint\stepper\implicit_euler.hpp:94: エラー: C2064: 用語は、3 つの引数を取る関数として評価されません クラスは、operator()適切な数の引数を取る関数へのポインタまたは関数への参照への ' ' またはユーザー定義の変換演算子を定義しません

私の質問は次のとおりです。誰かがそれを機能させる方法を知っていますか、または誰かがこれよりも詳細なドキュメントを教えてくれますか:

コードプロジェクトのドキュメント

またはこれ:

メイン odeint ページ

ありがとう

4

1 に答える 1

1

残念ながら、陰的オイラー法と Rosenbrock ソルバー (別の陰的ソルバー) には同じインターフェイスがありません。詳細には、暗黙のオイラーは、この署名を持つヤコビアンの関数を期待しています

void jacobian( const state_type &x , matrix_type &jacobi , const value_type t );

stiff_system_jacobiしたがって、の定義をに変更する必要があります

struct stiff_system_jacobi
{
    void operator()( const vector_type & , matrix_type &J , const double & ) const
    {
        J( 0 , 0 ) = -101.0;
        J( 0 , 1 ) = -100.0;
        J( 1 , 0 ) = 1.0;
        J( 1 , 1 ) = 0.0;
    }
};

システムが本当に非自律的である場合は、時間を表し、自明なダイナミクス dt/dt = 1 を持つ座標を 1 つ追加して状態タイプを拡張する必要があります。

于 2014-06-13T19:44:32.307 に答える