回答:
小さな行列の場合、特異値分解を使用して条件数を確実に計算できます。KSPSolve()
マトリックスでa を実行し、で実行し-pc_type svd -pc_svd_monitor
ます。
より大きな行列の場合、クリロフ法を使用して条件数を推定できます。たとえば、GMRESによって実行されるArnoldi反復は、Hessenberg分解を増分的に計算します。ヘッセンベルク行列の極値特異値と固有値は、元の行列の優れた近似値です。この方法でPETScに固有値を推定させるには、次を実行します
-ksp_monitor_singular_value -ksp_type gmres -ksp_gmres_restart 1000 -pc_type none
これらのオプションは、各クリロフ反復で極値特異値を推定することを意味します。GMRESは、大規模な再起動でクリロフ空間(CGも使用できます)を計算するために使用されます。再起動時に、GMRESは現在のクリロフ空間を破棄するため、特異値推定の進行状況はすべて再起動時に失われます。最後のオプション-pc_type none
は、前処理されていない行列でこの反復を実行することを示しています。デフォルトでは、事前条件演算子(または)が使用されるため、事前条件演算子の推定値になります。
これは通常、最大の特異値に対して正確ですが、メソッドが収束しない限り最小の特異値を過大評価する可能性があります。行列のソルバーを使用している場合(たとえばを使用KSPSolve()
)、適用した同じ手順を使用して最小特異値を推定できます。
使用する 最小の特異値のより正確な推定が必要な場合(および他のすべての固有値と特異値の問題)にSLEPcをます。