为什么我没有得到身份矩阵?

时间:2019-03-19 00:24:19

标签: python-3.x numpy

您好,我想知道为什么在执行此操作之后:

a = np.array([[1, 2], [3, 4]])
ainv = inv(a)
print(np.dot(a,ainv))

我得到:

[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

因为我使用a的逆矩阵,所以我应该得到:

[[1,0],[0,1]] 

因此,我希望获得支持以了解结果

2 个答案:

答案 0 :(得分:2)

a = np.array([[1.0, 2.0], [3.0, 4.0]]) 
ainv = np.linalg.inv(a)  #[[-2.0, 1.0],[1.5, -0.5]]
print(np.dot(a,ainv))

您发现的产量:

[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

让我们看一下数组元素的类型

type(ainv[1][1])

向我们显示数组的类型为

numpy.float64

让我们看看这种类型的numpy精度

numpy.finfo(numpy.float64).precision 

Numpy表示,这种浮点数精确到的十进制数字的近似值为15。

15

出于好奇,我们还可以查看机器epsilon的类型;

np.finfo(np.float64).eps

其中n最小,其中1 + n与1不可区分

2.220446049250313e-16

因此,即使对于数据类型,您获得的数字在技术上可以与0区别开来,但总体精度为15位小数,在大型矩阵上进行的计算可能会进一步增加浮点不精确度。

答案 1 :(得分:1)

几乎就是身份矩阵。您得到的数字非常接近零而不是零,这是浮点数的常见问题,因为它们只是实数的有限近似值。对于所有实际用途,8.8e-16或0.00000000000000088都是〜0。