odeint で 2 点境界問題を解こうとしています。私の方程式は次の形をしています
y'' + a*y' + b*y + c = 0
の境界条件がある場合はかなり些細なことですy(x_1) = y_1 , y'(x_2) = y_2
が、境界条件がの場合y(x_1) = y_1 , y(x_2) = y_2
は失われます。このような問題を odeint や他の科学ライブラリで処理する方法を知っている人はいますか?
odeint で 2 点境界問題を解こうとしています。私の方程式は次の形をしています
y'' + a*y' + b*y + c = 0
の境界条件がある場合はかなり些細なことですy(x_1) = y_1 , y'(x_2) = y_2
が、境界条件がの場合y(x_1) = y_1 , y(x_2) = y_2
は失われます。このような問題を odeint や他の科学ライブラリで処理する方法を知っている人はいますか?
この場合、撮影方法が必要です。odeint にはそのようなメソッドはありません。最初のケースである初期値問題 (IVP) を解決しました。Numerical Recipies でこの方法が説明されており、Boost.Odeint を使用してタイム ステップを実行できると思います。
このタイプの問題を解決するための代替のより効率的な方法は、有限差分法または有限要素法です。有限差分については、Numerical Recipes をチェックできます。有限要素については、dealii ライブラリをお勧めします。
もう 1 つのアプローチは、b-スプラインを使用することです: 積分の初期 x0 点と最終 xfinal ポイントを知っていると仮定すると、解 y(x) を (x0,xfinal) で定義された b-スプライン基底で展開できます。つまり、
y(x)= \sum_{i=1}^n A_i*B_i(x),
ここで、A_i は決定される定数係数であり、B_i(x) は b-スプライン基底 (数値的に微分できる明確に定義された多項式関数) です。科学的なアプリケーションでは、GSL で b スプラインの実装を見つけることができます。
この置換により、境界値の問題は線形問題に縮小されます。これは、(繰り返されるインデックスにアインシュタインの総和を使用している) ためです。
A_i*[ B_i''(x) + a*B_i'(x) + b*B_i(x)] + c =0
ポイント x のセットを選択し、上記の方程式から線形システムを作成できます。このタイプの方法に関する情報は、H Bachau、E Cormier、P Decleva、JE Hansen、および F Martín によるレビュー ペーパー「Applications of B-splines in Atomic and Molecular Physics」に記載されています。
http://iopscience.iop.org/0034-4885/64/12/205/
この問題を直接解決するライブラリは知りませんが、線形システムを形成できる B スプライン用のライブラリがいくつかあります (必要に応じて GSL をお勧めします)。このスタックオーバーフローの質問を参照してください: スプライン、B-スプライン、および NURBS C++ ライブラリ