2

boost::odeint私は変数の異なるコレクションの微分方程式を解くために使用したいと思います- タイプの -std::vector並列で。もちろん、解決策の 1 つは、すべての変数を大きなベクトルに結合し、それを状態変数として使用することです。

boost::fusionただし、さまざまなベクトルを保持する状態タイプとして採用するなど、より洗練されたソリューションをお勧めします。関連する問題の投稿と実装から私が理解している限り、原則として、そうすることに障害はありません。具体的な実装に関するいくつかのヒントを見逃しているだけです-特に、の正しい仕様に関して

代数、演算、サイズ変更

エラーステッパーなどの作成に必要です。たとえば、既存の実装のうちどれをodeint::fusion_algebra直接使用できますか?この場合、何をする必要がありますか?

4

1 に答える 1

1

各要素がサポートしている限り、および でboost::fusion問題がなければコンパイル時コンテナーを使用するfusion_algebradefault_operations

  • スカラー (*) との乗算
  • 足し算と引き算 (+,-)
  • サイズ変更

これは、doublefloat、またはなどの基本的な浮動小数点型の場合ですstd::complexこれは、 MTL、boost::ublas、または vexcl と viennaclの vector および matrix 型などの式テンプレートをサポートする型にも当てはまります。ただしstd::vector、ベクトルは適切な +*-/ 演算子を実装またはオーバーロードしないため、これは不可能です。この場合、3つの可能性があります

  1. 式テンプレートをサポートするベクター タイプを選択してください
  2. 融合シーケンスを融合シーケンスで反復し、サブ代数からfor_each正しいものを呼び出すネストされた代数を実装しますfor_each
  3. フュージョン シーケンスの要素を反復処理するカスタム操作を実装します。

注1:通常、サイズ変更とは、型のサイズ変更が必要な場合is_resizable、コンパイル時にtrueに特化することを意味します。

template<>
is_resizable< YourType > : boost::true_type { };

と専門resize_impl<>化とsame_size<>。デフォルトの実装を見てください。これは非常に簡単で、ワンライナーで済むはずです。

注 2: ステップ サイズ制御も必要で、expresson テンプレートでベクトル型を選択する場合は、演算子/と関数maxが存在し、要素ごとの除算と要素ごとの最大値を実行する必要があります。これを実装するのは難しいかもしれません。サポートが必要な場合は、お気軽に再度お問い合わせください。

于 2013-03-10T20:08:12.193 に答える