MATLAB中为什么不满足反等式?

MATLAB中为什么不满足反等式?,matlab,floating-point,matrix-inverse,Matlab,Floating Point,Matrix Inverse,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时,它甚至不满足 为什么会这样呢?很可能是一个问题。请注意,因此将其设置为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
时,它甚至不满足

为什么会这样呢?

很可能是一个问题。请注意,因此将其设置为
rat
不会有助于提高准确性

我还没有测试过,但是你可以尝试一下精确的有理数算术,这应该给上面的等式。

很可能是一个。请注意,因此将其设置为
rat
不会有助于提高准确性

我还没有测试过,但您可以尝试使用精确的有理数算术,这应该与上面给出的等式相等。

考虑一下这一点(MATLAB R2011a):

当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
可以是一个任意的小数字,也可以是一个包含
eps
的表达式,它可以使两个数字之间的差值在计算精度上最小

format
命令仅控制命令行中结果的显示,而不是内部存储结果的方式。特别是,
格式rat
不会使MATLAB以符号方式进行计算。对于此,您可以查看<对于诊断浮点精度问题,例如您遇到的问题,代码>格式十六进制
通常比
格式长
更有用。

考虑一下这一点(MATLAB R2011a):

当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
可以是一个任意的小数字,也可以是一个包含
eps
的表达式,它可以使两个数字之间的差值在计算精度上最小

format
命令仅控制命令行中结果的显示,而不是内部存储结果的方式。特别是,
格式rat
不会使MATLAB以符号方式进行计算。对于此,您可以查看<代码>格式十六进制
通常比
格式长
更适用于诊断浮点精度问题,例如您遇到的问题

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