numpy矩阵求逆舍入误差

2024-10-01 17:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我的BinvA矩阵的(1,1)项得到了一个非常奇怪的值
我只是想把B矩阵倒置,然后做a(B^-1)a乘法。在

我知道当我用手计算时,我的(1,1)应该是0,但是我得到的却是1.11022302e-16。我怎样才能修好它?我知道浮点数不能完全精确地表示,但为什么这会给我一个如此不准确的响应,而不是舍入到0,我有什么办法可以使它更准确?在

她是我的准则:

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)

我的打印声明:

^{pr2}$

Tags: importnumpyasnp矩阵arrayinttranspose
2条回答

当你计算逆矩阵时,你的数组被转换成float64,它的machine epsilon是1e-15。epsilon是浮点数的相对量化步长。在

如果有疑问,我们可以使用finfo函数询问有关浮点数据类型的numpy信息。在这种情况下

np.finfo('float64')
finfo(resolution=1e-15, 
      min=-1.7976931348623157e+308, max=1.7976931348623157e+308, 
      dtype=float64)

因此,从技术上讲,小于eps的值对于float64类型来说是非常精确的0表示。在

如果只是表示方式让您感到困扰,您可以告诉numpy不要打印小的浮点数(从0开始为1eps或更少),方法是:

^{pr2}$

之后,您的print语句返回:

[[ 0.  -2.5]
 [-2.  -6.5]]

请注意,这是所有浮点实现所共有的一般数值问题。您可以在以下位置找到有关浮点舍入错误的详细信息:

或者在网上:

这不是一个完整的答案,但它可能会给你指明正确的方向。你真正想要的是使用小数的numpy数组。您可能会合理地认为:

import numpy as np
from decimal import Decimal
A = np.array([[2,2],[4,-1]],np.int)
for i, a in np.ndenumerate(A):
    A[i] = Decimal(a)
    print type(A[i])

但是遗憾的是,小数不在numpy中的datatypes supported out of the box中,所以每次您试图在数组中插入一个十进制数时,它都会将它重新转换为一个float。在

一种可能是设置数据类型,因此:

^{pr2}$

但是现在,如果你

print Binv.dtype

你会看到反转已经把它重铸回float。原因是利纳格投资公司(与许多其他函数一样)查找B的“common_type”,即它认为可以强制数组元素的标量。在

不过,这可能并非无望。我想看看您是否可以通过创建一个自定义的数据类型来解决这个问题,但结果发现标量(int、float等)根本不是数据类型。相反,您可能要做的是注册一个新的标量,它是十进制的article on scalars。您将看到一个指向numpyc-API的链接(不要害怕)。在页面中搜索“register”和“scalar”以开始。在

相关问题 更多 >

    热门问题