3

boost.odeint(ブースト常微分方程式ソルバー)で任意精度行列を使用する例がいくつかあります。

さまざまなタイプの座標(デカルト、極、または作用角)でodeint原子を使用したいと思います。

アトムに対してどの操作をオーバーロードする必要がありますか?+、-、最小、最大、パウ?

odeintが使用する操作をどのファイルで検索できますか?

デフォルトの代数 から(1)を更新します。「+」、「*」およびabs()、max()が必要なようです。

4

1 に答える 1

5

かなり長い答えで申し訳ありませんが、私はある種の説明が役立つだろうと感じました:

一般に、odeintでタイプを特殊化する方法は2つあります。

1つの方法は、、、、などのようstd::vectorstd::array、コンテナまたはコレクションを反復する方法を適応させると考えられる代数を特殊化することです。ublas::matrix

  • range_algebraこれは、boost.rangeからの範囲の概念を満たすすべてのコンテナーで機能します
  • fusion_algebraコンパイル時シーケンスの場合
  • vector_space_algebraこれは、反復を操作に向けます。
  • thrust_algebra推力で使用するための-CUDA用のSTLのようなフレームワーク

特殊なタイプに適応する2番目の可能性は、コンテナーの要素に対して基本的な操作を実行する方法を指定できると考えられる操作です。ここでは、いくつかの事前定義された操作が存在します

  • default_operationsdouble、、、...floatのようなほとんどのタイプで機能するものは、演算子+、-、*、/と、、のような基本関数が定義されていることを前提としています。std::complex<>default_operationsabsmax
  • 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ライブラリを使用すると、非常に簡単です。

編集:いくつかのタイプミスを修正しました。

于 2012-04-12T08:40:28.063 に答える