numpy矩阵求逆四舍五入错误

发布于 2021-01-29 18:00:39

我的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]]
关注者
0
被浏览
206
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    计算逆时,会将数组转换为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上浮点舍入错误的更多信息

    或在网上:



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看