翻译:矩阵的条件数衡量线性系统 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
使用
>> cond(A)
ans =
1.0000e+16
考虑使用该矩阵的下列系统:
b = [1
x = A\b
b1 = b + 0.01
x1 = A\b1
这给出了解决方案
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的相对扰动相同。
eps(1)*1e3
)进行比较。您引用的示例(diag([1e8 1e-8])
)达到了机器精度的奇异性,因为它的条件数字量级是eps(1)
。任何您对此矩阵执行的数值操作都会遇到大误差,就像@LuisMendo的答案所述。在进行SVD之前,“预归一化”矩阵的没有方法可以改变条件数。 - Ahmed Fasihdiag([1e8 1e-8])
这样的例子,我过去曾经非常成功地使用了纯Python的mpmath
包,它具有任意精度矩阵。但是速度就要说再见了,因为你的CPU可以将双精度浮点数加速到>2 GHz,但任意精度必须在软件中完成。 - Ahmed Fasih