如何使用计算机检查矩阵是否为奇异矩阵

3

我想知道一种稳健的方法来使用计算机检查矩阵是否是非奇异的。我知道使用行列式(要求其非零)可能会误导,因为它无法区分一个矩阵确实是奇异的情况和由于数值误差而得到一个非常小的值(例如10^-12)的情况以及类似于10^-12*I的情况,其中行列式非常小,而矩阵绝对不是奇异的(它是正交的)。

有一个很好的链接(如何确定矩阵是否奇异?),认为可以使用矩阵的条件数,或者换句话说,最大奇异值与最小奇异值之比。

但是这又会有问题吗?2x2矩阵[10^8 0; 0 10^-8]是正交的,因此绝对不是奇异的,但其奇异值为10^8和10^-8(条件数为10^16),因此根据上面的链接,它将被归类为奇异。

在奇异值分解之前,正确的方法是将行规范化,然后简单地检查最小奇异值是否较小(例如小于10^-7)吗?


有趣的问题! - Luis Mendo
请记住,使用浮点数进行任何计算都会导致舍入误差,因此无法确定矩阵是否实际上是奇异的。这就是为什么我们实际上使用条件数来表示矩阵接近奇异的程度。为什么不测试不同的方法,看看哪种方法产生最准确的结果呢?另外,很容易想出一些情况,其中归一化行实际上会恶化问题。PS:请注意,使用浮点数进行任何计算都会导致舍入误差,因此无法确定矩阵是否实际上是奇异的。 - flawr
链接是正确的:您必须查找矩阵的奇异值,并将最小/最大奇异值比与机器精度(或其倍数,例如eps(1)*1e3)进行比较。您引用的示例(diag([1e8 1e-8]))达到了机器精度的奇异性,因为它的条件数字量级是eps(1)。任何您对此矩阵执行的数值操作都会遇到大误差,就像@LuisMendo的答案所述。在进行SVD之前,“预归一化”矩阵的没有方法可以改变条件数。 - Ahmed Fasih
如果你真的需要处理像 diag([1e8 1e-8]) 这样的例子,我过去曾经非常成功地使用了纯Python的 mpmath 包,它具有任意精度矩阵。但是速度就要说再见了,因为你的CPU可以将双精度浮点数加速到>2 GHz,但任意精度必须在软件中完成。 - Ahmed Fasih
2个回答

2
翻译:矩阵的条件数衡量线性系统 Ax=b 对 b 的微小扰动的敏感程度。较大的条件数意味着相对扰动 b 可以在解 x 中被极大地放大。这里的“相对扰动”指原始向量和扰动向量之间的差异,与原始向量的大小相比。具体而言,设 b1 为 b 的扰动版本,x1 为相应的扰动解,则 b(或 x)的相对扰动定义为 norm(b-b1)/norm(b)(或 norm(x-x1)/norm(x))。
根据这个定义,条件数的重要性可以表述如下:大的条件数意味着 norm(x1-x)/norm(x) 可以比 norm(b1-b)/norm(x) 大得多。 (有关此结果的证明,请参见 B. Noble 和 J.W. Daniels 的《应用线性代数》(第3版)第271页;或 Mathematics Stack Exchange 上的 此问答。)
您的示例矩阵是:
A = [10^8 0; 0 10^-8];

使用

>> cond(A)
ans =
     1.0000e+16

考虑使用该矩阵的下列系统:
b = [1; 0]; % original b
x = A\b; % original solution
b1 = b + 0.01; % perturbed b
x1 = A\b1; % perturbed solution

这给出了解决方案 x = [1e-8; 0](原始)和 x1 = [1.01e-08; 1e6](扰动)。解的相对扰动为:
>> norm(x-x1)/norm(x)
ans =
     1.0000e+14

如您所见,它比在b中引入的相对扰动要大得多。
>> norm(b-b1)/norm(b)
ans =
   0.0141

请注意,对于其他选择的 b,相对扰动可能不会被如此剧烈地放大。条件数表征了在所有可能的 b 选择中最坏情况的行为。
另一方面,考虑 A行归一化版本
B = A;
B(1,:) = B(1,:)/norm(B(1,:));
B(2,:) = B(2,:)/norm(B(2,:));

这只是一个单位矩阵:
>> B
B =
     1     0
     0     1

当然,它的条件是最好的。因此,现在相对于b的扰动,x中的相对扰动不再被放大:
y = B\b;
y1 = B\b1;

提供

>> norm(y-y1)/norm(y)
ans =
   0.0141

这与变量b的相对扰动相同。

0

条件数并不决定矩阵是否奇异,它显示出所得到的解是否对线性系统的右手边具有鲁棒性。一个非奇异矩阵可能具有非常糟糕的条件数。

如果矩阵A的任何一列可以表示为其余列的线性组合,则该矩阵是奇异的。这等价于说A是满秩的,当且仅当它是非奇异的。因此应使用排名揭示分解。推荐的方法(至少我当时学到的!)是Rank-revealing QR factorization


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接