设H(n)
为n
的Hilbert矩阵。
设e = (0,...,0,1)
- 单位矢量。
让e_im := H(n) * e
。
我使用一些计算机代数系统解决H(n) * x_1 = e_im
。
让r = (r_1,...,r_n)
为小型随机向量。
让(e + r)_im := H(n) * (e + r)
。
我使用一些计算机代数系统解决H(n) * x_2 = (e + r)_im
。
为什么剩余|| H(n) * x_1 - e_im ||
如此之小,但|| H(n) * x_2 - (e + r)_im||
如此之大?
我使用numpy和scipy.linalg,我的代码:
H = scipy.linalg.hilbert(500)
e = numpy.zeros((500, 1))
e[499] = 1
e_im = H.dot(e)
x_1 = scipy.linalg.solve(H, e_im)
r = 0.0001 * numpy.random.rand(500, 1)
e_plusr_im = e + r
x_2 = scipy.linalg.solve(H, e_plusr_im)
Residials = [scipy.linalg.norm(H.dot(x_1) - b_1, 2), scipy.linalg.norm(H.dot(x_2) - b_2, 2)]
答案 0 :(得分:3)
这是众所周知的数值线性代数现象,(参见大多数线性代数课程资料)。
矩阵的condition number kappa(A) = ||A|| ||A^-1||
表示矩阵求逆在一般情况下放大了多少错误。这里:
>>> import scipy.linalg
>>> import numpy as np
>>> H = scipy.linalg.hilbert(500)
>>> np.linalg.cond(H)
4.6335026663215786e+20
根据经验,(确定性)浮点误差对于64位浮点数具有相对大小1e-16。条件数是如此之大,以致得到的误差具有相对大小> 1,所以除非你很幸运,并且解决方案和中间计算具有精确的浮点表示,否则你可能会失去所有精度。如果您手动添加噪音,它也会被放大。