あなたの質問は、2 つの異なる問題に関連しています。
- 逆行列
- 行列の平方根
逆
逆行列は特異行列には存在しません。一部のアプリケーションでは、Moore-Penrose またはその他の一般化された逆関数が、逆関数の適切な代替として使用される場合があります。ただし、ほとんどの場合、コンピュータ数値には丸め誤差が発生することに注意してください。これらのエラーにより、特異な行列がコンピューターに規則的に表示される場合や、その逆の場合があります。
あなたが与えたマトリックスのブロック構造を常に示す場合A
、その非対角ブロックのみを考慮することをお勧めします
A3 = A[ c( 1, 3, 4 ), c( 1, 3, 4 ) ]
A3
[,1] [,2] [,3]
[1,] 6.041358e+11 5.850849e+13 6.767194e+13
[2,] 5.850849e+13 1.066390e+16 1.087463e+16
[3,] 6.767194e+13 1.087463e+16 1.131599e+16
すべての代わりに、A
効率を高め、丸めの問題を減らします。残りの 1 対角のエントリは、平方根の逆数で 1 のままであるため、それらで計算を混乱させる必要はありません。この単純化の影響を理解するには、R が計算できることに注意してください。
A3inv = solve(A3)
計算できなかったのに
Ainv = solve(A)
しかし、以下で明らかになるように、A3inverse は必要ありません。
平方根
原則として、行列の平方根は、行列が対角ヨルダン正規形 ( https://en.wikipedia.org/wiki/Jordan_normal_formA
)を持つ場合にのみ存在します。したがって、必要な問題の真に一般的な解決策はありません。
幸いなことに、「ほとんどの」(実数または複素数) 行列が可逆であるように、「ほとんどの」(実数または複素数) 行列は対角複素数ジョルダン正規形を持ちます。この場合、ジョーダン標準形
A3 = T・J・T⁻¹</p>
R で次のように計算できます。
X = eigen(A3)
T = X$vectors
J = Diagonal( x=X$values )
このレシピをテストするには、比較してください
Tinv = solve(T)
T %*% J %*% Tinv
とA3
。A3
対角ジョーダン正規形の場合、それらは (丸め誤差まで) 一致する必要があります。
は対角なのでJ
、その平方根は単純に平方根の対角行列です。
Jsqrt = Diagonal( x=sqrt( X$values ) )
そのようにJsqrt·Jsqrt = J
。さらに、これは
(T・Jsqrt・T⁻¹)² = T・Jsqrt・T⁻¹・T・Jsqrt・T⁻¹ = T・Jsqrt・Jsqrt・T⁻¹ = T・J・T⁻¹ = A3
実際に得られるように
√A3 = T·Jsqrt·T⁻¹</p>
またはRコードで
A3sqrt = T %*% Jsqrt %*% Tinv
これをテストするには、計算します。
A3sqrt %*% A3sqrt
と比較してくださいA3
。
逆数の平方根
逆数の平方根 (または、同様に、平方根の逆数) は、対角ジョルダン正規形が計算されると簡単に計算できます。J
使用する代わりに
Jinvsqrt = Diagonal( x=1/sqrt( X$values ) )
上記と同様に、
A3invsqrt = T %*% Jinvsqrt %*% Tinv
そして観察する
A3·A3invsqrt² = … = T·(J/√J/√J)·T⁻¹ = 1
A3invsqrt が望ましい結果になるように、単位行列を計算します。
A3 が可逆でない場合、一般化された逆 (必ずしもムーア-ペンローズのものではない) は、未定義のすべてのエントリをJinvsqrt
0 で置き換えることによって計算できますが、上で述べたように、これは全体的な観点から適切な注意を払って行う必要があります。アプリケーションと丸め誤差に対するその安定性。
A3 が対角ジョーダン標準形を持たない場合、平方根がないため、上記の式は別の結果をもたらします。不運なときにこのケースに遭遇しないようにするには、次のテストを実装するのが最善です
A3invsqrt %*% A3 %*% A3invsqrt
は、1 行列と見なすものに十分近いです (これは、最初に A3 が可逆であった場合にのみ適用されます)。
追伸: の対角線のエントリごとに記号 ± を前に付けることができることに注意してJinvsqrt
ください。