当前位置: 首页 > 知识库问答 >
问题:

使用Python中的高斯-乔丹消去法查找矩阵的逆

汪臻
2023-03-14

所以我试图通过高斯-乔丹消除找到矩阵的逆矩阵(使用 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语句,我认为我用pivot划分行的行有一些问题。它在原始矩阵中工作良好,但在恒等矩阵中不工作。此外,请注意,只有单位矩阵的最后一列被转换为逆矩阵的正确条目。

供参考的正确逆矩阵是

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

任何帮助将不胜感激。提前感谢!

共有1个答案

杜海
2023-03-14

我无法解决我的代码中的问题,尽管我找到了一个解决方法,我将改为发布它。希望这可能会帮助其他人。

我决定把它作为一个nx2n矩阵来处理,而不是对我形成增广矩阵的两个矩阵进行同样的操作。下面是完整的工作代码

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()
 类似资料:
  • 现在,我想我明白了这个概念。但是当我把它们都放入代码中时,它就不起作用了…… 首先,我试图将矩阵转换为上三角矩阵,但由于某种原因,在第2列之后,它停止工作。。 我输入的数组是: [1.00][5.00][4.00][4.00][1.00] [5.00] [7.00] [7.00] [4.00] [8.00] [7.00] [4.00] [8.00] [4.00] [7.00] [10.00][12

  • 我正在编写代码以在python中消除高斯 - 乔丹。我的指示如下: 到目前为止,我已经: 这是正确的开始吗?我对下一步该去哪里感到很迷茫。输入将是一个 Numpy 数组。任何想法都非常感谢!

  • 我知道我听起来很蠢,但我真的需要理解高斯-乔丹消去c程序。我已经试图理解编码,但逐行阅读代码仍然令人困惑。尤其是for(j = 1;英语字母表中第十个字母

  • 问题解决了。请看一下我自己在这个StackOverflow问题中的答案,了解如何。 但是,这是新的(并且正确工作的)代码: 显示器与下面相同。 我试图实现Gauss-Jordan消去法的Scala版本来反转矩阵(注意:可变集合和命令式范例用于简化实现——我试图不使用它们来编写算法,但这几乎是不可能的,因为算法包含嵌套步骤)。 单位矩阵不能很好地转换为反演的结果。换句话说:单位矩阵变换为倒矩阵(这是

  • 我现在正在研究一个 c 代码库,它使用矩阵库来计算各种东西。其中一件事是计算矩阵的逆。它使用高斯消除来实现这一点。但结果非常不准确。如此之多,以至于将逆矩阵与原始矩阵相乘甚至不会接近单位矩阵。 下面是用于计算逆矩阵的代码,矩阵以数字类型以及行和列为模板: 现在我已经做了一个单元测试,使用预先计算的值来测试逆是否正确。我尝试了两个矩阵,一个3x3,一个4x4。我用这个网站来计算逆:https://m

  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准