【问题标题】:Finding inverse of an ill-conditioned matrix找到病态矩阵的逆矩阵
【发布时间】:2022-01-17 21:33:51
【问题描述】:

我正在尝试实现一种数值方法,这需要我在某个点计算 6x6 矩阵 (A) 的逆。该矩阵由四个 3x3 矩阵 (B1...4) A = [[B1, B2], [B3, B4]] 组成。 虽然 3x3 矩阵中条目的大小大致相同,但 3x3 矩阵中的大小差异很大。 (下面是6x6矩阵的例子)

问题:在计算这个矩阵的逆时,得到的矩阵与预期的结果有很大的偏差。我试图通过计算I = A*A^-1 来确认这一点,但结果与单位矩阵相差甚远。 我认为这是由于矩阵状况不佳,因为每个 3x3 矩阵之间的差异如此之大。

有谁知道计算这种矩阵的逆矩阵的方法吗?

我目前的想法是将每个 3x3 矩阵乘以一个系数,以降低每个 3x3 矩阵 A = [[B1*a, B2*b], [B3*c, B4*d]] 之间的差异。之后,我将计算逆,然后尝试从结果矩阵中扣除系数。但是,我发现很难确定执行最后一步的方法。

示例:

[1.28872490245158e-06 1.4637613938654e-07 -1.70029707059287e-07 -18.6570630324193 -239.692934347905 -314.364362678385;
1.4637613938654e-07 1.6625715962304e-08 -1.9312338927429e-08 -2.1191092480495 -27.2248377456929 -35.7061787834127;
-1.70029707059287e-07 -1.9312338927429e-08 2.24331051783591e-08 2.46154548263497 31.6242196715729 41.4760981140375;
-18.6570630324193 -2.1191092480495 2.46154548263497 13813398787722.4 -52045116012728.7 59648566307319.4;
-239.692934347905 -27.2248377456929 31.6242196715729 -52045116012728.7 456984106570523 1138610755446.41;
-314.364362678385 -35.7061787834127 41.4760981140375 59648566307319.4 1138610755446.41 453138063298379]

【问题讨论】:

  • 你用的是matlab还是python
  • @Nic 这更像是一道数学题,而不是编程题。也许它更适合MSECV
  • 做原型我用的是matlab,不过最终版本会用python实现的。
  • 你的输入不清楚,你只有2个维度。你能提供一个真正的 python 对象和匹配的预期输出吗?
  • @Nicdew 解决此类问题的一种方法是使用preconditioner。我怀疑在这种情况下,Jacobi 预处理器就足够了。

标签: python numpy matlab matrix matrix-inverse


【解决方案1】:

在您的示例 6x6 矩阵中,前三列是线性相关的;第二列和第三列都是第一列的标量倍数:

>> a=<your example>;
>> a(:,1:3)./a(:,[1 1 1])
ans =
     1.000000000000000e+00     1.135821455052853e-01    -1.319363866841049e-01
     1.000000000000000e+00     1.135821455052859e-01    -1.319363866841050e-01
     1.000000000000000e+00     1.135821455052855e-01    -1.319363866841045e-01
     1.000000000000000e+00     1.135821455052838e-01    -1.319363866841038e-01
     1.000000000000000e+00     1.135821455052868e-01    -1.319363866841046e-01
     1.000000000000000e+00     1.135821455052856e-01    -1.319363866841046e-01

这种情况下的倒数实际上没有意义;这不仅仅是在不同的 3x3 子矩阵之间进行缩放的问题。

各种可能性:

  • 生成示例的任何内容都存在错误,并且正确的矩阵经过合理调整(尽管可能缩放不当)。如果这是唯一的问题,则在两侧应用简单的对角线缩放sc = diag(1 ./ sqrt(diag(a))) 通常可以解决缩放问题。
  • 上面打印的最后一位数字的细微差别实际上很重要,而不仅仅是计算a 产生的舍入噪声。即,它们是实际信号,是真正决定您想要的结果的信号。那么你在正常表示中的精度已经用完了。您必须进行某种重新表述以使这些可见。
  • 列相关性告诉您一些有关问题的信息,它实际上是比 6x6 更低的维度。考虑到对称性并查看a1 = a(3:6, 3:6)(删除两个依赖列加上相应的行),结果被严重缩放,但sc * a1 * sc(如上sc)是合理的,条件数约为@987654327 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多