boost.odeint(ブースト常微分方程式ソルバー)で任意精度と行列を使用する例がいくつかあります。
さまざまなタイプの座標(デカルト、極、または作用角)でodeint原子を使用したいと思います。
アトムに対してどの操作をオーバーロードする必要がありますか?+、-、最小、最大、パウ?
odeintが使用する操作をどのファイルで検索できますか?
デフォルトの代数 から(1)を更新します。「+」、「*」およびabs()、max()が必要なようです。
かなり長い答えで申し訳ありませんが、私はある種の説明が役立つだろうと感じました:
一般に、odeintでタイプを特殊化する方法は2つあります。
1つの方法は、、、、などのようstd::vector
にstd::array
、コンテナまたはコレクションを反復する方法を適応させると考えられる代数を特殊化することです。ublas::matrix
range_algebra
これは、boost.rangeからの範囲の概念を満たすすべてのコンテナーで機能しますfusion_algebra
コンパイル時シーケンスの場合vector_space_algebra
これは、反復を操作に向けます。thrust_algebra
推力で使用するための-CUDA用のSTLのようなフレームワーク特殊なタイプに適応する2番目の可能性は、コンテナーの要素に対して基本的な操作を実行する方法を指定できると考えられる操作です。ここでは、いくつかの事前定義された操作が存在します
default_operations
double
、、、...float
のようなほとんどのタイプで機能するものは、演算子+、-、*、/と、、のような基本関数が定義されていることを前提としています。std::complex<>
default_operations
abs
max
thrust_operation
推力で使用する場合私があなたの質問を正しく理解している場合、あなたは異なる座標系に住むことができる点の1つ以上のタイプを持っているので、このタイプの演算子はodeintで動作するように適合させる必要があります。この場合range_algebra
、「default_operations」と組み合わせて使用できます。タイプが呼び出されpoint_type
、基本的に主な浮動小数点タイプであるdoubleで構成されているとします。'default_operations'を使用するには、次のものが必要です。
point_type operator+( point_type , double );
point_type operator+( double , point_type );
point_type operator+( point_type , point_type );
point_type operator*( point_type , double );
point_type operator*( double , point_type );
point_type operator/( point_type , double );
double abs( point_type );
必要なのはこれだけだと思います。vector
次に、、などのコンテナでpoint_typeを使用できるようになります。odeintにarray
も例があり、特別なポイントタイプを適応させる方法を示しています:ポイントタイプの太陽系。Boost.Operatorsライブラリを使用すると、非常に簡単です。
編集:いくつかのタイプミスを修正しました。