numpy矩阵求逆四舍五入错误
我的BinvA矩阵的(1,1)条目得到一个非常奇怪的值,我
只是想将B矩阵求逆,并进行(B ^ -1)A乘法。
我知道,当我手动进行计算时,我的(1,1)应该为0,但我得到1.11022302e-16。我该如何解决?我知道浮点数不能完全准确地表示出来,但是为什么这会给我这么不准确的响应,而不是四舍五入,有什么办法可以使我更准确呢?
她是我的代码:
import numpy as np
A = np.array([[2,2],[4,-1]],np.int)
A = A.transpose()
B = np.array([[1,3],[-1,-1]],np.int)
B = B.transpose()
Binv = np.linalg.inv(B) #calculate the inverse
BinvA = np.dot(Binv,A)
print(BinvA)
我的印刷声明:
[[ 1.11022302e-16 -2.50000000e+00]
[ -2.00000000e+00 -6.50000000e+00]]
-
计算逆时,会将数组转换为
float64
,其机器epsilon为1e-15。ε是浮点数的
相对量化步骤 。如有疑问,我们可以使用
finfo
函数询问有关浮点数据类型的numpy信息。在这种情况下np.finfo('float64') finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)
因此,从技术上讲,您的值小于类型
eps
的0的精确表示float64
。如果仅仅是表示而困扰您,您可以告诉numpy不要打印小的浮点数(0到1 eps或更小):
np.set_printoptions(suppress=True)
之后,您的打印语句返回:
[[ 0. -2.5] [-2. -6.5]]
请注意,这是所有浮点实现共有的通用数值问题。您可以找到有关SO上浮点舍入错误的更多信息
或在网上: