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,它可以在您工作的精度下为您提供两个数字之间的最小差异。

format命令仅控制在命令行中结果的显示,而不是结果在内部存储的方式。特别是,format rat不会使 MATLAB 以符号方式进行计算。为此,您可以查看Symbolic Math Toolbox。通常比诊断浮点精度问题(例如您遇到的问题format hex)更有用。format long

于 2011-10-31T10:17:09.670 回答