我正在尝试实现一种数值方法,它要求我在某个点上计算6x6矩阵(a(的逆。该矩阵由四个3x3矩阵(B1…4(CCD_ 1组成。虽然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]
在示例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
(是合理的,条件数约为2e6