【问题标题】:Why inverse equality does not satisfy in MATLAB?为什么逆等式在 MATLAB 中不满足?
【发布时间】:2011-10-30 17:56:59
【问题描述】:

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 floating-point matrix-inverse


    【解决方案1】:

    很可能是floating point error。请注意,the format function affects only how numbers display, not how MATLAB computes or saves them. 因此将其设置为 rat 不会帮助解决不准确的问题。

    我还没有测试过,但您可以尝试使用 Fractions Toolbox 进行精确的有理数算术,这应该与上述相等。

    【讨论】:

      【解决方案2】:

      考虑一下(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 Toolboxformat hex 通常比 format long 更有用,用于诊断浮点精度问题,例如您遇到的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 2013-07-08
        • 1970-01-01
        • 2017-06-14
        • 2019-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多