您好,我想知道为什么在执行此操作之后:
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]]
因此,我希望获得支持以了解结果
答案 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。