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
。
どうしてこんなことに?
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
。
どうしてこんなことに?
浮動小数点エラーの可能性が非常に高いです。このformat
関数は数値の表示方法にのみ影響し、MATLAB による数値の計算方法や保存方法には影響しないことに注意してください。したがって、に設定してrat
も不正確さは改善されません。
私はテストしていませんが、正確な有理数の計算のためにFractions Toolboxを試すことができます。これにより、上記と等しくなるはずです。
これを考慮してください (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 rat
MATLAB がシンボリックに計算を行わないようにします。これについては、Symbolic Math Toolboxを参照してください。多くの場合、遭遇したような浮動小数点の精度の問題を診断するformat hex
よりもさらに便利です。format long