在 Python 中使用 Gauss-Jordan Elimination 求逆矩阵

Finding inverse of a matrix using Gauss-Jordan Elimination in Python

所以我试图通过 Gauss-Jordan Elimination 找到矩阵的逆(使用 Python 列表)。但我面临着这个特殊的问题。在下面的代码中,我将我的代码应用于给定矩阵,并按预期缩减为单位矩阵。

M = [[0, 2, 1], [4, 0, 1], [-1, 2, 0]]
P = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
n = len(P)
def inverse(a):
    for k in range(n):
        if abs(a[k][k]) < 1.0e-12:
            for i in range(k+1, n):
                if abs(a[i][k]) > abs(a[k][k]):
                    for j in range(k, n):
                        a[k][j], a[i][j] = a[i][j], a[k][j]
                    break
        pivot = a[k][k]
        for j in range(k, n):
            a[k][j] /= pivot
        for i in range(n):
            if i == k or a[i][k] == 0: continue
            factor = a[i][k]
            for j in range(k, n):
                a[i][j] -= factor * a[k][j]
    return a

inverse(M)

输出为

[[1.0, 0.0, 0.0], [0, 1.0, 0.0], [0.0, 0.0, 1.0]]

但是当我应用相同的代码时,在为我的单位矩阵(它是给定矩阵的增广矩阵的一部分)添加代码行之后,它没有在应该的时候给我正确的逆(因为我我正在对它应用与我在给定矩阵上应用的相同的操作。

M = [[0, 2, 1], [4, 0, 1], [-1, 2, 0]]
P = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
n = len(P)
def inverse(a, b):
    for k in range(n):
        if abs(a[k][k]) < 1.0e-12:
            for i in range(k+1, n):
                if abs(a[i][k]) > abs(a[k][k]):
                    for j in range(k, n):
                        a[k][j], a[i][j] = a[i][j], a[k][j]
                        b[k][j], b[i][j] = b[i][j], b[k][j]
                    b[k], b[i] = b[i], b[k]
                    break
        pivot = a[k][k]
        for j in range(k, n):
            a[k][j] /= pivot
            b[k][j] /= pivot
        for i in range(n):
            if i == k or a[i][k] == 0: continue
            factor = a[i][k]
            for j in range(k, n):
                a[i][j] -= factor * a[k][j]
                b[i][j] -= factor * b[k][j]
    return a, b

inverse(M, P)

输出不是逆矩阵,而是其他东西(尽管最后一列有正确的条目)。

([[1.0, 0.0, 0.0], [0, 1.0, 0.0], [0.0, 0.0, 1.0]],
 [[0.0, 0.25, 0.3333333333333333],
  [1, 0.0, 0.6666666666666666],
  [0.0, 0.25, -1.3333333333333333]])

我在调试时尝试使用 print 语句,但我认为我用数据中心划分行的那一行有一些问题。它在原始矩阵中工作正常,但不适用于单位矩阵。另外,请注意只有单位矩阵的最后一列被转换为逆矩阵的正确条目。

供参考的正确逆矩阵是

I = [[-1/3, 1/3, 1/3], [-1/6, 1/6, 2/3], [4/3, -1/3, -4/3]]

如有任何帮助,我们将不胜感激。 提前致谢!

虽然我找到了解决方法,但我无法找出我的代码中的问题,我将改为发布它。希望对其他人有帮助。

我决定将其作为 n x 2n 矩阵处理,而不是对我构成增广矩阵的两个矩阵执行相同的操作。这是完整的工作代码:

def inverse(a):
    n = len(a) #defining the range through which loops will run
    #constructing the n X 2n augmented matrix
    P = [[0.0 for i in range(len(a))] for j in range(len(a))]
    for i in range(3):
        for j in range(3):
            P[j][j] = 1.0
    for i in range(len(a)):
        a[i].extend(P[i])
    #main loop for gaussian elimination begins here
    for k in range(n):
        if abs(a[k][k]) < 1.0e-12:
            for i in range(k+1, n):
                if abs(a[i][k]) > abs(a[k][k]):
                    for j in range(k, 2*n):
                        a[k][j], a[i][j] = a[i][j], a[k][j] #swapping of rows
                    break
        pivot = a[k][k] #defining the pivot
        if pivot == 0: #checking if matrix is invertible
            print("This matrix is not invertible.")
            return
        else:
            for j in range(k, 2*n): #index of columns of the pivot row
                a[k][j] /= pivot
            for i in range(n): #index the subtracted rows
                if i == k or a[i][k] == 0: continue
                factor = a[i][k]
                for j in range(k, 2*n): #index the columns for subtraction
                    a[i][j] -= factor * a[k][j]
    for i in range(len(a)): #displaying the matrix
        for j in range(n, len(a[0])):
            print(a[i][j], end = " ")
        print()