1

次の問題を計算するために matlab を使用しています。

A、直交行列によるB2 つであり、どこに単位行列があります。そしてよりもはるかに大きいです。これも直交行列です。mnA'*A = IB'*B = IImnC = (2B*B'-I)*A

しかし、matlab では、number の精度によって次の問題が発生します。

max(max(abs(A'*A-I))) = e0 > 0
max(max(abs(B'*B-I))) = e0 > 0

そして、計算されたものCmax(max(abs(C'*C-I))) = e1 > e0.

を計算して上記のプロセスを繰り返すとD = (2C*C'-I)*B、このエラーは のリフトアップを制限しD、そのような種類の反復がますます増えると、このエラーは爆発します。

この誤差範囲を増やさずに計算する方法はありますか?

ありがとう!

4

1 に答える 1

0

原則として、実行する計算と変換が増えるほど、浮動小数点エラーについて心配しなければならなくなります。

影響を軽減するには、いくつかの可能性があります。

1) 正確な算術演算をサポートする Maple や Mathematica などのソフトウェアを使用すると、計算負荷が大きくなりますが、問題はほとんど解消されます。私の理解では、Matlab は正確な算術演算をサポートしていません (ただし、これについては間違っている可能性があります...)

2) Double よりも高い精度を使用して、浮動小数点エラーを軽減します。たとえば、FEX 提出のMultiple Precision Toolbox for MATLABは、任意の大きな精度形式をサポートすると主張しています。ただし、私自身は使用したことがないので、それがどれほどうまく機能するかについてコメントすることはできません.

3) 行列内の数値の相対的な大きさに応じて、浮動小数点エラーを減らすために利用できるいくつかの数値トリックまたは変換が存在する場合があります。これは大きなトピックですが、一般的に考えられるのは、問題をスケーリングして、数値がすべて互いに可能な限り近い大きさになるようにすることです。

私が気づいていない他の可能性があるかもしれません。私は確かにこの分野の専門家ではありません。他の回答者が何を示唆しているのか興味があります。

ああ、もう 1 つ、密接に関連する SO questionに出くわしました。

于 2013-01-16T01:23:41.687 に答える