0

私はC++でdgesvおよびdgemmfortranサブルーチンを使用して、いくつかの単純な行列の乗算と左除算を行っています。

ランダム行列AとBの場合、次のようにします。

A\(A\(A*B));

ここで、*はdgemmを使用して定義され、\はdgesvを使用して定義されます。明らかに、この式は単位行列に単純化する必要があります。私はMATLABに対して答えをテストしていて、対角線上で多かれ少なかれ1を取得していますが、他のエントリは非常にわずかにずれています(数値はe-15のオーダーであるため、すでに0に近いです) 。

この結果が期待できるのかどうか疑問に思っていますか?私がこのようなことをすると:

C = A+B;
D = A*B;

D\(C\(C*C));

結果は教義と聖約に出てくるはずです。基本的に、C(C * C)は非常に正確です(MATLABと完全に一致します)が、2番目にD \ CIを実行すると、e-1またはe+00でさえずれているものが得られます。私はそれが起こるはずではないと思いますか?

4

1 に答える 1

2

あなたの問題は、C /C++の浮動小数点変数の有限精度に関連しているようです。あなたはここでそれについてもっと読むことができます。その影響を最小限に抑えるいくつかの手法がありますが(それらのいくつかはwikiの記事で説明されています)、いくつかの操作の後は常に精度がいくらか失われます。任意精度の数値をサポートするサードパーティの数学ライブラリ(GMPなど)を使用することをお勧めします。しかし、それでも-数値的アプローチに固執している限り、計算の精度は常に汚染されます。

于 2012-11-05T16:56:25.003 に答える