我正在尝试研究矩阵方程问题(Ax = b)的残差来源。为了验证我的答案,我减去Ax-b,期望为0。我获得的值与机器epsilon的数量级相同,而不是“纯”零。问题在于,这些残差似乎是彼此的倍数,因此我不确定如何解释它们。

我在这里找到了一些细节:Machine epsilon computation issue,这并不能弄清楚为什么会出现多个ε而不是一个或多个。

我使用产生np.finfo(float).eps2.220446049250313e-16检查了系统。我在解x中得到的残差之一与此值相同,但是,另一个似乎是ε的一半。

这是我使用的代码:

# Arbitrary Matrix A and Vector b
A = np.array([[2,-1,0],[1,-2,1],[0,-1,2]])
b = np.array([[1],[0],[1]])

# Solve for Vector x
x = np.linalg.solve(A,b)

# Calculate difference, expected to be column of zeros
diff = A.dot(x) - b
print(diff)


这是输出:

Output:
[[ 0.00000000e+00]
 [-1.11022302e-16]  #-------> Is this machine epsilon...
 [-2.22044605e-16]] #-------> ...or this?


对此有什么解释/解释?我知道仍然可以表示小于epsilon的值,但是在那种情况下为什么两个余数都不-1.11022302e-16

提前致谢!

最佳答案

所谓的机器epsilon就是1处的最低精度(ULP)单位。即,它是表示1中最低有效位的位置值。当有效位中有53位时,表示1二进制数字1.000…0002,其中二进制点后有52个零。因此,最低位数的位置值是2-52,而2-52是1的ULP。

通常,让ULP(x)代表x的最小精度单位。通常,浮点格式将数字表示为(−1)s•f•be,其中b是固定基数(二进制格式为两个,十进制为十,十六进制为16),s为符号位(0对于+,对于-)为1,e是一个指数,f是一个具有p位的有效数字,其中p是格式的固定数量。对于IEEE-754 binary32,对于53位,p为53。 ULP是按指数缩放的有效位数中最低精度的位置值,因此,如果以浮点格式用符号位s,有效位数f和指数e表示某个数字x,则其ULP为b1- p•是。 (我假设有效数字的格式是小数点之前的一个基数b位数,小数点之后的p-1位数,这就是为什么其最低位数的位置值为b1-p。间隔[1,b)。有时,重要部分的缩放比例会有所不同,并且会调整指数以进行补偿。例如,在证明有效数为整数时可能很有用。)

在二进制格式中,ULP(2)= 2•ULP(1),ULP(1/2)=½•ULP(1),ULP(¼)=¼•ULP(1),依此类推。

假设您已经计算出两个在[1,2)区间内的值,如果使用实数算术计算,它们将是相等的,但是它们是使用浮点算术计算的,并且略有不同。由于表示的格式,它们只能相差ULP(1)的倍数。当减去这些数字时,根据情况,您通常会得到0,ULP(1),2•ULP(1)或ULP(1)的其他倍数。如果用浮点算术计算两个如果用实数算术计算将是相同的数,则它们在计算的各个部分中可能会遇到不同的舍入误差。

如果计算间隔[1/2,1)中的两个值,则它们只能相差ULP(1/2)的倍数。

这就是为什么您看到ULP(1)的各种倍数或二进制分数的原因。它只是浮点格式量化的产物。

10-08 12:53