python计算大矩阵的逆的精度问题?
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网

python计算大矩阵的逆的精度问题?

前提是不使用numpy等库,自己编写求矩阵的逆,当求一个比较小的矩阵时,结果是正确的,但当矩阵一大(60*60),便出现与用numpy算出来结果不一样了,不知道是不是精度问题,该如何改进?

# 本函数求矩阵的逆
def matrix_nimatrix:
    extend_matrix = copy.deepcopymatrix
    l = lenmatrix
    for i in range0, l:    #在矩阵右边补充一个单位矩阵,使用初等变换求逆矩阵
        extend_matrix[i].extend[0]*i
        extend_matrix[i].extend[1]
        extend_matrix[i].extend[0]*l-i-1
    for i in range0, lenextend_matrix:    #判断矩阵对角线上是否有0,有0则置换,如置换不了,则没有逆矩阵
        if extend_matrix[i][i] == 0:
            for j in rangei, lenextend_matrix:
                if extend_matrix[j][i] != 0:
                    extend_matrix[i], extend_matrix[j] = extend_matrix[j], extend_matrix[i]
                    break
            if j >= lenextend_matrix:
                print 没有逆矩阵
                return 0
            break
    for i in range0, lenextend_matrix:    #开始计算逆矩阵
        f = extend_matrix[i][i]
        for j in range0, lenextend_matrix[i]:    #先把行换为0
            extend_matrix[i][j] /= f
        for m in range0, lenextend_matrix:
            if m == i:
                continue
            b = extend_matrix[m][i]
            for n in range0, lenextend_matrix[i]:    #在把列换为0
                extend_matrix[m][n] -= extend_matrix[i][n] * b
    for i in range0, lenextend_matrix:
        extend_matrix[i] = extend_matrix[i][l:]
    return extend_matrix

太长,懒得看代码。
这个应该主要是矩阵奇异性的问题,因为 A 的逆其实等于 A* / |A|,所以如果 A 的行列式很小,再加上计算机保存浮点数精度的问题,就会有问题。

所以这个是矩阵本身的问题,你可以试试大的非奇异矩阵比如行列式等于 1 的矩阵。

3000*60 矩阵有 逆吗? 你求得是伪逆?

  1. 最好拿matlab或者是mathematica的结果对比一下,再确定真的是自己的程序出错

  2. 大矩阵求逆可能会碰到的精度问题就是舍入误差,当其中某一行/列的最大值和最小值差距过大,用初等变换的方法特别容易导致舍入误差

  3. 为了避免摄入误差,最好采用列主元或者全主元的三角分解法来求逆,我以前用这种方法写过,精度和matlab差不多,不过没有和numpy这样的库对比过。

栏目列表

广告位

澳门银河官网