0

コレスキー分解を介してさまざまなライブラリを使用して、正方行列の逆行列を計算しています。しかし、私の結果は私が期待していたものではありません。私は数学の専門家ではありませんが、より近い結果が得られることを期待していました。

私はMLK、マグマ、CULAライブラリを使用して、CPUとGPUの逆行列を計算しています。これらのライブラリの計算を行った後、結果が常に1つの要素で異なることに気付きました。の逆数を計算したいとしますA= [0.237306,0.000458;0.000458,0.238497]

A[0] = 0.237306 
A[1] = 0.000458 
A[2] = 0.000458 
A[3] = 0.238497

私が得た結果は次のとおりです。

inv(A)[0] = 4.213983 
inv(A)[1] = -0.008092 
inv(A)[2] = 0.000458 
inv(A)[3] = 4.192946 

ただし、正しい結果は次のようになります。

   4.2139841  -0.0080924
  -0.0080924   4.1929404

ご覧のとおりinv(A)[3]、残りは問題ありませんが、違います。それはコレスキー反転がどのように機能するべきですか?これは正しい/おおよその結果ですか、それともここで何か間違ったことをしていますか?

4

2 に答える 2

3

私は何が起こっているのか理解しています。このライブラリは、Alexandre Cが指摘したように、行列の逆行列を上または下に計算します。したがって、ライブラリに渡す引数(UpperまたはLower)に応じて、マトリックスの上側または下側の逆数を計算します。完全な逆行列を計算できると思いましたが、どうやらこの方法では不可能です。

于 2012-07-20T14:34:23.317 に答える
1

これはおそらく、浮動小数点数のIEEE仕様と、浮動小数点数の操作に組み込まれている不正確さによるものです。

32ビットまたは64ビットの浮動小数点数を指定したかどうかはわかりません。精度を上げてみてください。

もう1つのポイントは、丸め誤差が発生しやすいため、通常、行列の逆行列を計算しないことです。より良い選択は、LU分解とフォワードバック置換です。

「正しい」答えはどこから得ましたか?結果の正しさをどのように判断していますか?

私はそれが数値解法に最適なツールではないことを知っていますが、あなたの行列をとると:

0.237306 0.000458 0.000458 0.238497

MINVERSEを実行すると、次の答えが得られます。

4.213984 -0.00809 -0.00899 4.19294

元の行列と逆行列を乗算して、識別行列が返されるかどうかを確認することで、その有効性を確認できます。MMULTから得たものは次のとおりです。

1 2.1684e-19 -2.168e-19 1

これは、数値法の人が単位行列と呼ぶものです。

だから私は私が得る答えは正しいと言います。同じ方法で自分のことを確認し、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを読む必要があります。

于 2012-07-20T13:27:19.953 に答える