我试图在python中使用numpy包生成逆矩阵。不幸的是,我没有得到我期望的答案。
原始矩阵:
([17 17 5]
[21 18 21]
[2 2 19])
按照Cramer的规则反转原始矩阵给出:
([4 9 15]
[15 17 6]
[24 0 17])
显然使用numpy.linalg.inv()
给出了
-3.19488818e-01,3.80191693e-01,-6.38977636e-03,
3.33333333e-01, -3.33333333e-01, 2.26123699e-18,
-2.84345048e-01, 2.68370607e-01, 5.43130990e-02n
我预计将原始矩阵与逆矩阵相乘会产生一个单位矩阵,但正如您所见,我给出了一个填充浮点的矩阵。
问题出在哪里?
答案 0 :(得分:0)
我认为你手工反转矩阵可能会犯错误。
当我执行以下内容时
import numpy as np
a = np.array([[17, 17, 5], [21, 18, 21], [2, 2, 19]], dtype=np.float)
inv = np.linalg.inv(a)
print np.dot(inv, a)
我得到了
array([[ 1.00000000e+00, 0.00000000e+00, 1.05471187e-15],
[ 1.11022302e-16, 1.00000000e+00, -7.21644966e-16],
[ 1.38235777e-17, 5.65818009e-18, 1.00000000e+00]])
哪个好,请注意所有非对角线元素的机器精度大约为零,所以看起来numpy正在用这个做好工作!
请记住,浮点数不像实数一样工作,除非你小心,否则你可能会发现小的舍入错误会进入你的计算。
如果你想这样做,请看看sympy,它将能够用精确的数学计算(以它慢一点为代价)。
import sympy as sp
a = sp.Matrix([[17, 17,5],[21,18,21],[2,2,19]])
inv = a.inv()
print inv
print a * inv
产生精确的逆
Matrix([
[-100/313, 1/3, -89/313],
[ 119/313, -1/3, 84/313],
[ -2/313, 0, 17/313]])
当乘以原始矩阵时,会得到您所期望的确切身份
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
答案 1 :(得分:0)
linalg
是对的,你错了。
它给你的矩阵确实是相反的。但是,如果您使用np.array
而不是np.matrix
,则乘法运算符不会按预期工作,因为它会计算分量产品。
在这种情况下,你必须mat.dot(inv(mat))
。
在任何情况下,由于舍入误差,你得到的将不是一个完美的单位矩阵(当我尝试它时,非对角矩阵条目的顺序为10 ** (-16)
)。
答案 2 :(得分:0)
你假定的逆转显然是错误的;只有当逆矩阵中的某些条目小于1时才能实现这些,而只有当某些条目为负时才能实现零。我没看到你做错了什么,所以我举一个例子。使用Cramer's rule即可获得对于第一个条目(18 * 19 - 2 * 21)/( - 939)= -0.319 ... - 正是numpy找到的。