0

MATLAB は逆行列演算を満たしません。

(ABC)-1 = C-1 * B-1 * A-1

MATLABでは、

if inv(A*B*C) == inv(C)*inv(B)*inv(A)
   disp('satisfied')
end

資格はありません。作ってformat longみて分かった点の差はあるのですが、作ってみると物足りませんformat rat

どうしてこんなことに?

4

2 に答える 2

2

浮動小数点エラーの可能性が非常に高いです。このformat関数は数値の表示方法にのみ影響し、MATLAB による数値の計算方法や保存方法には影響しないことに注意してください。したがって、に設定してratも不正確さは改善されません。

私はテストしていませんが、正確な有理数の計算のためにFractions Toolboxを試すことができます。これにより、上記と等しくなるはずです。

于 2011-10-30T18:00:50.687 に答える
1

これを考慮してください (MATLAB R2011a):

a = 1e10;
>> b = inv(a)*inv(a)
b =
  1.0000e-020
>> c = inv(a*a)
c =
  1.0000e-020
>> b==c
ans =
     0
>> format hex
>> b
b =
   3bc79ca10c924224
>> c
c =
   3bc79ca10c924223

MATLAB が中間量inv(a)、またはa*a(aがスカラーか行列か) を計算するとき、既定では最も近い倍精度浮動小数点数として格納されますが、これは正確ではありません。したがって、これらのわずかに不正確な中間結果が後続の計算で使用されると、丸め誤差が発生します。

のように直接等しいかどうか浮動小数点数を比較する代わりにinv(A*B*C) == inv(C)*inv(B)*inv(A)、絶対差を のようにしきい値と比較する方がよい場合がよくありabs(inv(A*B*C) - inv(C)*inv(B)*inv(A)) < threshます。ここthreshには、任意の小さな数値、または を含む何らかの式を指定epsできます。これにより、作業している精度で 2 つの数値の最小の差が得られます。

このformatコマンドは、結果が内部的に保存される方法ではなく、コマンド ラインでの結果の表示のみを制御します。特に、format ratMATLAB がシンボリックに計算を行わないようにします。これについては、Symbolic Math Toolboxを参照してください。多くの場合、遭遇したような浮動小数点の精度の問題を診断するformat hexよりもさらに便利です。format long

于 2011-10-31T10:17:09.670 に答える