これら2つの方法の違いは何ですか?ある方法で解決できる問題を、別の方法で解決できるでしょうか。それらの両方または1つをOpenMPやMPIと並列化できますか?
これら2つの方法の違いは何ですか?ある方法で解決できる問題を、別の方法で解決できるでしょうか。それらの両方または1つをOpenMPやMPIと並列化できますか?
回答:
共役勾配法は、おそらく最も高速な反復ソルバーですが、対称的な正定システムに対してのみです。非常に便利なのは、不定行列または非対称行列に対して同様のプロパティを持つ反復法があった場合です。
CG法は、クリロフ部分空間内の各ステップで近似解を求めます。
。
双共役勾配法の本質的なアイデアは、2番目のクリロフ部分空間を維持することです。
CGと同様の直交性プロパティを使用して、を解く際の安定性の問題を除いた再帰を求めます。
残念ながら、単純に適用すると失敗します。ただし、各BiCGステップの後に一般化最小残差(GMRES)アルゴリズムの1ステップを実行することにより、結果の反復は安定します。これは通常BiCG-Stabと呼ばれます。
そのため、BiCG-Stabは(原則として)CGよりも一般的なソルバーですが、CGが対象とした問題に適用すると、効率が低下します。BiCGまたはBiCG-stabは、より多くの行列-ベクトル乗算とより多くのドット積を必要とするため、分散メモリマルチプロセッシングを介して並列化すると、通信オーバーヘッドが増加しますが、それでも好きなだけスケールアップできます。
ここで注目すべき点が2つあります。これらは、今言った他のすべてのジャンクよりも重要です。
すべての反復法(BiCG、GMRES、QMR ...)には、有限精度演算での収束に失敗する行列があります。
したがって、特定の行列に適切な前提条件を考え出すことは、最適な外部レベルの反復ソルバーを使用するよりもおそらく重要です。
編集:オープンソースライブラリの場合、最も人気のある2つはPETScとTrilinosです。また、Pythonバインディング(petsc4pyおよびPyTrilinos)も入手することを強くお勧めします。Eigenを試すこともできます。一方には多くの機能はありませんが、もう一方には必要なものだけがあり、それ以上はありません。単にコードを使用するのではなく読み取る場合は、Eigenが最も簡単です。
参照:Yousef Saad、スパース線形システムの反復法 ; Nachtigal et al、Nonsymmetrix Matrix Iterationsはどのくらい高速ですか?