gpt4 book ai didi

matlab - 如何用计算机检查矩阵是否是奇异的

转载 作者:行者123 更新时间:2023-12-05 05:21:15 26 4
gpt4 key购买 nike

我想知道一种可靠的方法来使用计算机检查矩阵是否不是奇异矩阵。我知道使用行列式(要求它不为零)可能会产生误导,因为它无法区分矩阵确实是奇异的情况和由于数值错误你得到一个非常小的值(例如〜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)是否是正确的方法?

最佳答案

矩阵的条件数衡量线性系统 A x = bb 中扰动的敏感程度 。大条件数意味着 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 的 Applied Linear Algebra(第 3 版),第 271 页;或在 Mathematics Stack Exchange 上的 this Q&A。)

您的示例矩阵

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;

给予

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

这与 b 中的相对扰动相同 .

关于matlab - 如何用计算机检查矩阵是否是奇异的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com