【问题标题】:Why inv(matrix)*matrix is not exact identity matrix in Octave?为什么 inv(matrix)*matrix 不是 Octave 中的精确单位矩阵?
【发布时间】:2021-08-22 12:26:54
【问题描述】:

为什么inv(A)*A 不是精确的单位矩阵? 所有对角线元素都是正确的,但其余的不是。 我知道这是残差,那怎么处理呢?

代码:

A = [1,2,0;0,5,6;7,0,9]
A_inv = inv(A)
A_invA = inv(A)*A

输出:

【问题讨论】:

  • 您只需要知道所有计算中都存在舍入误差。如果不考虑一些容差,就无法进行相等比较。见stackoverflow.com/q/686439/7328782
  • 请将代码发布为(格式化的)文本,而不是图像
  • @CrisLuengo 谢谢。
  • @LuisMendo 我已经编辑了问题并将两者都包含在内。没问题还是我应该只坚持代码?
  • @LuisMendo 知道了。感谢您的指导。

标签: matlab matrix octave matrix-inverse


【解决方案1】:

inv 文档的探索将引导您走上以下道路,它很好地回答了您的问题(强调我的问题):

八度:1>帮助inv 'inv' 是来自文件 libinterp/corefcn/inv.cc 的内置函数 -- X = inv (A) -- [X, RCOND] = inv (A) -- [...] = 逆 (...) 计算方阵 A 的逆矩阵。 如果需要,返回对倒数条件数的估计, 否则,如果倒数,则警告病态矩阵 条件数很小。 通常最好避免计算矩阵的逆 例如,它更快更准确 用 'Y = A \ b' 求解方程组 (A*x = b),而不是 'Y = inv (A) * b'。

在您的特定情况下,您会看到:

A = [1,2,0;0,5,6;7,0,9];
[X, RCOND] = inv(A);
RCOND
% RCOND = 0.070492

那么,这个值是什么意思?你可以在相关函数rcond中找到答案,直接计算这个值:

八度:2> 帮助 rcond 'rcond' 是来自文件 libinterp/corefcn/rcond.cc 的内置函数 -- C = rcond (A) 计算倒数条件数的 1-范数估计为 由 LAPACK 返回。 如果矩阵是良条件的,那么 C 将接近 1,如果 矩阵条件很差,它将接近于 0。 [...] 另见:cond, condest。

您的值是 0.07,非常接近 0,因此您的 A 矩阵的条件很差。

要详细了解“条件不佳”的确切含义,我们可以查看cond 函数:

octave:26> 帮助条件 'cond' 是文件 /opt/octave-6.2.0/share/octave/6.2.0/m/linear-algebra/cond.m 中的一个函数 -- 条件 (A) -- 条件 (A, P) 计算矩阵的 P 范数条件数 倒置。 'cond (A)' 定义为'norm (A, P) * norm (inv (A), P)'。 [...] 矩阵的条件数量化了矩阵的敏感度 对矩阵进行小的更改时的矩阵求逆运算 元素。理想情况下,条件数将接近 1。当 数字很​​大,这表明变化很小(例如下溢 或舍入误差)将在结果中产生较大的变化 输出。在这种情况下,解决方案来自数值 计算可能不准确。

在你的情况下:

cond(A,2)
% ans = 7.080943875445246

所以你有它。您的矩阵条件相对较差,这意味着它的求逆更容易受到精度误差的影响。如果您改用mldivide(即\ 运算符),可能会获得更好的结果。

【讨论】:

  • @RishabhKumarSingh 让我们以相反的顺序开始。 3) 重新表述答案中已经存在的内容:如果A 具有对它的微小变化(或“扰动”)在B 中产生大变化的属性,则矩阵A 与逆B 的条件很差.如果扰动是机器精度的数量级,这意味着您正在达到机器可以表示微小变化的极限,因此易受这些微小变化影响的“真实”逆可能与一个以所选精度计算。
  • 2) 我不能 100% 确定精度问题是否会以同样的方式影响 pinv,但我认为答案是肯定的,因为该问题不太可能与实现差异有关,还有更多工作要做具有您的 CPU 的基本精度。
  • 1) 并不是说​​mldivide 通常不易受到精度问题的影响。上面 octave 告诉你的是,如果你先计算 inv(在处理条件不佳的矩阵时可能会导致很大的错误),然后然后使用这个结果来求解方程组,你就是'将大误差传播到第二次计算,而mldivide 使用不同的技术来求解方程组,它不依赖于以相同方式计算逆,因此避免了在结果中引入如此大的误差.
  • 非常感谢。关于第 2 点,我实际上正在参加 Andrew Ng 的 ML 课程。有一点他说:When implementing the normal equation in octave we want to use the 'pinv' function rather than 'inv.' The 'pinv' function will give you a value of θ even if (X'*X) is not invertible. where θ = pinv(X'*X) * X' * y.
  • @RishabhKumarSingh 确实!但这是 pinv 的数学属性,与精度无关。如果存在 inv,则 pinv 必然等于 inv。因此,如果 inv 不能以某种机器精度正确导出,那么我认为 pinv 也不会。但是,如果 inv 不存在, pinv 仍然会给出结果:这是因为在数学上 pinv 实现的类似于“最小二乘最小化”过程:即生成的矩阵最小化某种距离。如果存在 inv,则该距离最小化为零,结果等于 inv。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多