我想知道一种强大的方法来检查矩阵是否使用计算机是单数的。我知道使用行列式(要求它不为零)可能会产生误导,因为它无法区分矩阵确实是奇异的情况,并且由于数值误差,你会得到一个非常小的值(例如~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)?
非常感谢!
答案 0 :(得分:2)
矩阵的条件数测量线性系统 A x = b 对 b中的扰动的敏感程度即可。大的条件数意味着b
中的{strong>相对扰动可以在解x
中大大放大。
这里的术语相对扰动表示与原始矢量的大小相比,原始和扰动矢量的差异程度。具体来说,让b1
表示相应扰动解的b
和x1
的扰动版本。 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。