Matlab中矩阵乘法化简结果不一致:精度还是概念错误?
关于Matlab中两个二次型表达式的精度差异分析
这完全是浮点数运算的精度误差导致的,核心原因是两种计算路径的数值稳定性不一样。
为什么会出现结果差异?
- 第一个表达式
xᵀAx - 2yᵀAx + yᵀAy需要三次独立的矩阵乘法(xᵀAx、yᵀAx、yᵀAy),再做两次减法。如果x和y的数值非常接近,xᵀAx和yᵀAy会是两个非常接近的大数,2yᵀAx也会和它们接近,这时候大数相减会触发灾难性抵消——两个几乎相等的浮点数相减时,之前运算积累的舍入误差会被大幅放大,极端情况下直接得到0(因为浮点数无法区分极小的差异)。 - 第二个表达式
(x-y)ᵀA(x-y)是先计算差值d = x - y,再计算dᵀAd。这种路径直接针对极小的差值向量d进行运算,避免了大数相减的抵消问题,误差累积更少,所以能保留住理论上应有的极小值(7.1387e-28本质就是浮点数下的近似0)。
哪种计算方式更准确?
毫无疑问是 (x-y)ᵀA(x-y) 更准确。因为它的计算逻辑更贴合问题的本质——求x和y差值的二次型,从数值计算的稳定性角度来说,这种直接计算差值的方式避免了不必要的大数运算和相减抵消,能最大程度减少浮点数舍入误差的影响,尤其是当x和y接近时优势更明显。
内容的提问来源于stack exchange,提问作者k12345
相关产品推荐
相关产品推荐

