如何检查矩阵与计算机不是单一的

时间:2017-04-06 21:40:39

标签: matlab matrix linear-algebra linear

我想知道一种强大的方法来检查矩阵是否使用计算机是单数的。我知道使用行列式(要求它不为零)可能会产生误导,因为它无法区分矩阵确实是奇异的情况,并且由于数值误差,你会得到一个非常小的值(例如~10 ^ -12)和像10 ^ -12 * I这样的情况再次给出一个非常小的行列式,而矩阵绝对不是奇异的(它是正交的)。

有一个很好的联系(How to find out if a matrix is singular?)争论可以使用矩阵的条件,或者换句话说,最大奇异值与最小奇异值之比。

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

是一种在奇异值分解之前对行进行标准化的正确方法,然后简单地检查最小的奇异值是否小(例如小于10 ^ -7)?

非常感谢!

2 个答案:

答案 0 :(得分:2)

矩阵的条件数测量线性系统 A x = b b中的扰动的敏感程度即可。大的条件数意味着b中的{strong>相对扰动可以在解x中大大放大。

这里的术语相对扰动表示与原始矢量的大小相比,原始和扰动矢量的差异程度。具体来说,让b1表示相应扰动解的bx1的扰动版本。 b(或x)中的相对扰动定义为norm(b-b1)/norm(b)(或norm(x-x1)/norm(x))。

根据这个定义,条件数的重要性可以表达如下:大条件数意味着norm(x1-x)/norm(x) 可以远大于{ {1}}。 (有关此结果的证明,请参阅B. Noble和J.W. Daniels撰写的 Applied Linear Algebra (第3版),第271页;或数学堆栈交换中的this Q&A

您的示例矩阵

norm(b1-b)/norm(x)

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 中的相对扰动与x中的相对扰动相比没有放大:

b

给出

y = B\b;
y1 = B\b1;

与<{1}}中的相对扰动相同

答案 1 :(得分:0)

条件数不决定矩阵是否是单数,它表明所获得的解是否是稳健的w.r.t.线性系统的RHS与否。非奇异矩阵可能具有非常糟糕的条件。

如果矩阵A中的任何列可以表示为其余列的线性组合,则它是单数。这相当于说A当且仅当它是满级时才是非奇异的。因此应该使用排名揭示因子分解。推荐的方法(至少这是我当时教过的!)这样做是Rank-revealing QR factorization