python计算大矩阵的逆的精度问题?
前提是不使用numpy
等库,自己编写求矩阵的逆,当求一个比较小的矩阵时,结果是正确的,但当矩阵一大(60*60),便出现与用numpy
算出来结果不一样了,不知道是不是精度问题,该如何改进?
# 本函数求矩阵的逆
def matrix_ni(matrix):
extend_matrix = copy.deepcopy(matrix)
l = len(matrix)
for i in range(0, l): #在矩阵右边补充一个单位矩阵,使用初等变换求逆矩阵
extend_matrix[i].extend([0]*i)
extend_matrix[i].extend([1])
extend_matrix[i].extend([0]*(l-i-1))
for i in range(0, len(extend_matrix)): #判断矩阵对角线上是否有0,有0则置换,如置换不了,则没有逆矩阵
if extend_matrix[i][i] == 0:
for j in range(i, len(extend_matrix)):
if extend_matrix[j][i] != 0:
extend_matrix[i], extend_matrix[j] = extend_matrix[j], extend_matrix[i]
break
if j >= len(extend_matrix):
print '没有逆矩阵'
return 0
break
for i in range(0, len(extend_matrix)): #开始计算逆矩阵
f = extend_matrix[i][i]
for j in range(0, len(extend_matrix[i])): #先把行换为0
extend_matrix[i][j] /= f
for m in range(0, len(extend_matrix)):
if m == i:
continue
b = extend_matrix[m][i]
for n in range(0, len(extend_matrix[i])): #在把列换为0
extend_matrix[m][n] -= extend_matrix[i][n] * b
for i in range(0, len(extend_matrix)):
extend_matrix[i] = extend_matrix[i][l:]
return extend_matrix
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
太长,懒得看代码。
这个应该主要是矩阵奇异性的问题,因为 A 的逆其实等于
(A*) / |A|
,所以如果 A 的行列式很小,再加上计算机保存浮点数精度的问题,就会有问题。所以这个是矩阵本身的问题,你可以试试大的非奇异矩阵(比如行列式等于 1 的矩阵)。
3000*60 矩阵有 逆吗? 你求得是伪逆?
最好拿matlab或者是mathematica的结果对比一下,再确定真的是自己的程序出错
大矩阵求逆可能会碰到的精度问题就是舍入误差,当其中某一行/列的最大值和最小值差距过大,用初等变换的方法特别容易导致舍入误差
为了避免摄入误差,最好采用
列主元
或者全主元
的三角分解法来求逆,我以前用这种方法写过,精度和matlab差不多,不过没有和numpy
这样的库对比过。