如何使用python中的cramer规则计算逆?

时间:2015-03-18 10:43:11

标签: python numpy matrix-inverse

我试图在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

我预计将原始矩阵与逆矩阵相乘会产生一个单位矩阵,但正如您所见,我给出了一个填充浮点的矩阵。

问题出在哪里?

3 个答案:

答案 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找到的。