Python 如何求矩阵的逆?(逐步解决)

Python 如何求矩阵的逆?(逐步解决),python,matrix,inverse,inversion,Python,Matrix,Inverse,Inversion,如何在Python中手工求矩阵的逆 您可能希望执行此操作的原因: 我需要学习如何为学校项目反演矩阵。 我对使用编程语言计算矩阵的逆很感兴趣。我最近编写了一段代码,用Python查找矩阵的逆。 它在您运行代码时提供了一个逐步的解释。它还确定是否存在反向。我希望你喜欢 此代码用于教育目的。这可能不是最有效的方法 # Import packages from numpy import * from random import * 结果可能是: Matrix A: [[1. 1. 6.] [1. 1

如何在Python中手工求矩阵的逆

您可能希望执行此操作的原因: 我需要学习如何为学校项目反演矩阵。
我对使用编程语言计算矩阵的逆很感兴趣。

我最近编写了一段代码,用Python查找矩阵的逆。 它在您运行代码时提供了一个逐步的解释。它还确定是否存在反向。我希望你喜欢

此代码用于教育目的。这可能不是最有效的方法

# Import packages
from numpy import *
from random import *
结果可能是:

Matrix A:
[[1. 1. 6.]
 [1. 1. 5.]
 [4. 2. 4.]]

Inverse A (starting point):
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

--- Gauss elimination: row 2 - 1.0 * row 1 ---

[[ 1.  1.  6.]
 [ 0.  0. -1.]
 [ 4.  2.  4.]]

[[ 1.  0.  0.]
 [-1.  1.  0.]
 [ 0.  0.  1.]]

--- Gauss elimination: row 3 - 4.0 * row 1 ---

[[  1.   1.   6.]
 [  0.   0.  -1.]
 [  0.  -2. -20.]]

[[ 1.  0.  0.]
 [-1.  1.  0.]
 [-4.  0.  1.]]

--- Switch rows 2 and 3 ---

[[  1.   1.   6.]
 [  0.  -2. -20.]
 [  0.   0.  -1.]]

[[ 1.  0.  0.]
 [-4.  0.  1.]
 [-1.  1.  0.]]

--- Gauss elimination (up): row 2 - 20.0 * row 3 ---

[[ 1.  1.  6.]
 [ 0. -2.  0.]
 [ 0.  0. -1.]]

[[  1.   0.   0.]
 [ 16. -20.   1.]
 [ -1.   1.   0.]]

--- Gauss elimination (up): row 1 + 6.0 * row 3 ---

[[ 1.  1.  0.]
 [ 0. -2.  0.]
 [ 0.  0. -1.]]

[[ -5.   6.   0.]
 [ 16. -20.   1.]
 [ -1.   1.   0.]]

--- Gauss elimination (up): row 1 + 0.5 * row 2 ---

[[ 1.  0.  0.]
 [ 0. -2.  0.]
 [ 0.  0. -1.]]

[[  3.   -4.    0.5]
 [ 16.  -20.    1. ]
 [ -1.    1.    0. ]]

--- Divide row 2 by -2.0 ---

[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0. -1.]]

[[ 3.  -4.   0.5]
 [-8.  10.  -0.5]
 [-1.   1.   0. ]]

--- Divide row 3 by -1.0 ---

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

[[ 3.  -4.   0.5]
 [-8.  10.  -0.5]
 [ 1.  -1.  -0. ]]
# Choose a random seed to generate a matrix
seed(28)

# Interesting examples:
# Seed 4 is not invertable (det=0)
# Seed 28 uses the switch rows operator (zero value on diagonal)

# Generate a matrix A with random input
A_len=3
A=zeros((A_len,A_len))
for i in range(A_len):
    for j in range(A_len):
        A[i][j]=int(random()*11)
A_0=A.copy()
        
print('Matrix A:')
print(A)

# Generate the identity tensor (starting point for the inverse)
A_inv=eye(len(A))
print()
print('Inverse A (starting point):')
print(A_inv)

# Start solving for the inverse
# All operations are performed on the matrix A, as well as the identity tensor to find its inverse. 
# While det=1 the inverse exists, if det=0 the operation is aborted. (note: this function does not find the determinant)
det=1

for i in range(len(A)):
    
    # If the number on the diagonal is nonzero, apply Gauss elimination to triangualize the matrix. 
    if (A[i][i]): 
        Gauss_explain()
        
    # If the number on the diagonal is zero, check for nonzero terms below in the same column.
    # In that case switch the rows and perform the Gauss elimination nonetheless. 
    elif (Switch_explain()):
        Gauss_explain()
        
    # If all numbers below the diagonal are also zero, the determinant = 0, and the inverse doesn't exist.
    # The operation is aborted.
    else:
        det=0
        print()
        print('--- Det = 0, not invertable. ---')    
        break

if (det):
    # Now we know the inverse exists
    # We apply again Gauss elimination, this time to diagonalize the matrix.
    for i in range(len(A)-1,0,-1):
        for j in range(i-1,-1,-1):
            Gauss_up_explain()
    
    # Divide the rows of the matrix, so that we find the Identity tensor.
    # This results also in the inverse for the second matrix. 
    for i in range(len(A)):
        Divide_explain()

# Check if the matrix times its inverse gives the identity tensor
A_0@A_inv
Matrix A:
[[1. 1. 6.]
 [1. 1. 5.]
 [4. 2. 4.]]

Inverse A (starting point):
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

--- Gauss elimination: row 2 - 1.0 * row 1 ---

[[ 1.  1.  6.]
 [ 0.  0. -1.]
 [ 4.  2.  4.]]

[[ 1.  0.  0.]
 [-1.  1.  0.]
 [ 0.  0.  1.]]

--- Gauss elimination: row 3 - 4.0 * row 1 ---

[[  1.   1.   6.]
 [  0.   0.  -1.]
 [  0.  -2. -20.]]

[[ 1.  0.  0.]
 [-1.  1.  0.]
 [-4.  0.  1.]]

--- Switch rows 2 and 3 ---

[[  1.   1.   6.]
 [  0.  -2. -20.]
 [  0.   0.  -1.]]

[[ 1.  0.  0.]
 [-4.  0.  1.]
 [-1.  1.  0.]]

--- Gauss elimination (up): row 2 - 20.0 * row 3 ---

[[ 1.  1.  6.]
 [ 0. -2.  0.]
 [ 0.  0. -1.]]

[[  1.   0.   0.]
 [ 16. -20.   1.]
 [ -1.   1.   0.]]

--- Gauss elimination (up): row 1 + 6.0 * row 3 ---

[[ 1.  1.  0.]
 [ 0. -2.  0.]
 [ 0.  0. -1.]]

[[ -5.   6.   0.]
 [ 16. -20.   1.]
 [ -1.   1.   0.]]

--- Gauss elimination (up): row 1 + 0.5 * row 2 ---

[[ 1.  0.  0.]
 [ 0. -2.  0.]
 [ 0.  0. -1.]]

[[  3.   -4.    0.5]
 [ 16.  -20.    1. ]
 [ -1.    1.    0. ]]

--- Divide row 2 by -2.0 ---

[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0. -1.]]

[[ 3.  -4.   0.5]
 [-8.  10.  -0.5]
 [-1.   1.   0. ]]

--- Divide row 3 by -1.0 ---

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

[[ 3.  -4.   0.5]
 [-8.  10.  -0.5]
 [ 1.  -1.  -0. ]]