PETScでSchur補数を計算するにはどうすればよいですか?


8

どのようにしてシューア補数を計算できますか?

S=KbbKbaKaa1Kab

どこ

K=(KaaKabKbaKbb

(いくつかの順序で)PETSc行列(Mat)ですか?

回答:


13

行列のシューア補数を計算することは非常にコストがかかり、実際にはほとんど必要ありません。PETScは、それを必要とするアルゴリズムを回避することを強くお勧めします。行列のシュール補数(密または疎)は本質的に常に密であるため、次のことから始めます。

  • 密な行列形成する、Kba
  • また、同じサイズの別の密行列を作成します。T
  • 次に、行列 をor で直接因数分解するか、またはSuperLU_Distのような外部ソルバーパッケージを使用する場合は、その後に続けて使用します。結果を呼び出します。KaaMatLUFactor()MatCholeskyFactor()MatGetFactor()MatLUFactorSymbolic()MatLUFactorNumeric()A
  • 次にを呼び出しますMatMatSolve(A,Kba,T)
  • 次にを呼び出しますMatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S)
  • ではに電話してくださいMatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO)
  • に続く MatScale(S,-1.0)

Schur補数をこのように計算する場合、KSP反復分解ソルバーを使用しても意味がありません。直接因数分解を使用して多くの中規模サイズの問題を解決する場合、反復ソルバーよりもはるかに高速だからです。ご覧のとおり、これには大量の作業スペースと計算が必要なので、回避するのが最善です。ただし、Schur補数を使用してシステムを解くために、を組み立てる必要はありません。を使用して(で解決するために使用)のアクションを適用するが、アセンブルしないマトリックスを作成するために使用します。SMatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)SKaa_preKaa

または、すでにブロック行列(ある順序で)がある場合、インデックスセット()isaとisb を作成して各ブロックをアドレス指定し、次に、を使用してシューア補数および/または事前調整に適した近似を作成します。以来、一般的に緻密で、標準的な前処理方法は、典型的にシューア相補体に直接適用することはできません。SIMR近似を使用して、Schur補数を事前調整して、 Schur補数(これは、のオプションの「前処理」行列に対してデフォルトで返されます)。

K=KaaKabKbaKbb
ISMatGetSchurComplement()SKbbKba診断Kaa1KabMatGetSchurComplement()

別の方法は、行列を微分演算子として解釈し、近似交換子引数を適用して、効率的に適用できるスペクトル的に等価な演算を見つけることです(Elman、Silvester、およびWathenの「PCD」前提条件を参照)。これの変形は、最小二乗整流子であり、これはムーアペンローズ疑似逆PCLSC行列に密接に関連しており、タイプの行列で動作するで使用できますMATSCHURCOMPLEMENT


2
解決した質問を再開するリスクがあるので、この回答は悲観的すぎると思います。特定の状況(特に部分構造化/ドメイン分解)では、スカー補数を計算するのが合理的であると思います。また、ここで説明するよりも複雑さの少ない時間計算で他のアルゴリズムを計算できます。インスピレーションについては、scicomp.stackexchange.com / questions / 28934を参照してください。
rchilton1980 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.