あなたの質問には多くの問題があります。
ガウス消去法(LU分解)を使用して、行列の数値ランクを計算しないでください。 LU分解は、浮動小数点演算のこの目的には信頼できません。代わりに、(例えば、ランク現出QR分解を使用するxGEQPX
か、xGEPQY
これらのルーチンは、追跡するのが困難であるものの、Xは、C、D、S、又はZであるLAPACK、中;参照関連する問題にJedBrownの回答を)、またはSVDを使用(特異値分解など、xGESDD
またはxGESVD
xが再びC、D、S、又はZです)。SVDは、数値ランクを決定するためのより正確で信頼性の高いアルゴリズムですが、より多くの浮動小数点演算が必要です。
ただし、線形システムを解くには、LU分解(LAPACKの標準実装である部分ピボットを使用)が実際に非常に信頼できます。部分的ピボットによるLU因数分解が不安定な病理学的ケースがいくつかあります(数値線形代数の講義22を参照)詳細については、TrefethenおよびBauによる)。QR因数分解は、線形システムを解くためのより安定した数値アルゴリズムです。これがおそらく、正確な結果が得られる理由です。ただし、正方行列の場合、LU因数分解よりも2倍の浮動小数点演算が必要です(JackPoulsonがそれを修正するかもしれません)。長方形システムの場合、QR分解は、過剰決定された線形システムの最小二乗解を生成するため、より適切な選択です。SVDは線形システムの解決にも使用できますが、QR分解よりも高価になります。
jannebは、numpy.linalg.svdがxGESDD
LAPACKのラッパーであることは正しいです。特異値分解は2段階で進行します。最初に、分解されるマトリックスが2重対角形に縮小されます。LAPACKで2重対角形に縮小するために使用されるアルゴリズムは、おそらくローソン-ハンソン-チャンアルゴリズムであり、1点でQR分解を使用します。TrefethenとBauによる数値線形代数の講義31では、このプロセスの概要を説明しています。次に、xGESDD
分割統治アルゴリズムを使用して、2値対角行列から特異値と左右の特異ベクトルを計算します。このステップの背景を知るには、Golub and Van LoanによるMatrix Computations、またはJim DemmelによるApplied Numerical Linear Algebraを参照する必要があります。
最後に、特異値と固有値を混同しないでください。これらの2セットの数量は同じではありません。SVDは、行列の特異値を計算します。MATLABを使用したCleve Molerの数値計算は、特異値と固有値の違いの概要を示しています。一般に、特異行列が固有値の絶対値である通常の行列の場合を除き、与えられた行列の特異値とその固有値の間には明らかな関係はありません。
dgesdd
を使用します。あなたの本当の質問はおそらく「Lapack dgesddがどのように機能するのか?」です。