我试图使用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
我期望把原来的矩阵和逆相乘会给出一个恒等矩阵,但正如你所看到的,我给出了一个充满浮点数的矩阵。
问题在哪里?
发布于 2015-03-18 02:53:17
我想你在用手倒置矩阵时可能犯了一个错误。
当我执行以下操作时
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正在用它做一个ok的工作!
请记住,浮点数不像实数那样工作,除非小心,否则计算中可能会出现小的舍入误差。
如果您想要这样做,请看一看同情,它将能够用精确的数学进行计算(代价是它慢一点)。
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]])
发布于 2015-03-18 02:53:47
linalg
是对的,你错了。
它给你的矩阵确实是逆的。但是,如果您使用的是np.array
而不是np.matrix
,那么乘法运算符就不会像预期的那样工作,因为它计算的是按分量计算的乘积。
在这种情况下,您必须执行mat.dot(inv(mat))
。
在任何情况下,您将得到的不是一个完美的恒等矩阵,因为四舍五入的错误(当我尝试它的非对角线矩阵条目是按10 ** (-16)
的顺序)。
发布于 2015-03-18 03:23:15
您假定的逆显然是错误的;只有当逆矩阵中的某些项小于1时才能实现,而只有当某些项为负数时才能达到零。我不知道你做错了什么,所以我举了一个例子。使用克雷默法则,例如对于第一个条目(18*19 - 2*21)/(-939) =-0.319.-这正是numpy发现的.
https://stackoverflow.com/questions/29119880
复制相似问题