【线代&NumPy】第五章 – Vector课后练习 | 伴随矩阵求逆 | Cramer公式求联立方程 | 简述并提供代码

【线代&NumPy】第五章 - Vector课后练习 | 伴随矩阵求逆 | Cramer公式求联立方程 | 简述并提供代码

💬 例1:

import numpy as np
def getMinorMatrix(A,i,j): # 删除矩阵(matrix)A的i行和j列,并创建矩阵(matrix)
    n = len(A) 
    M = np.zeros((n-1, n-1))
    for a in range(0,n-1):
        k = a if (a < i) else a+1
        for b in range(0, n-1):
            l = b if (b < j) else b+1
            M[a, b] = A[k, l]
    return M
def determinant(M): # 计算
    if len(M) == 2: # 2x2
        return M[0,0]*M[1,1]-M[0,1]*M[1,0]
    detVal = 0
    for c in range(len(M)):
        detVal += ((-1)**c)*M[0,c]*determinant(getMinorMatrix(M,0,c))
    return detVal
A = np.array([[-4, 0, 2, -1, 0], [1, 3, -3, -1, 4], [2, 0, 1, 3, 0],
              [-2, 1, -3, -1, 5], [1, -5, 1, 0, 5]])
print("A = ", A)
print("det(A) = ", determinant(A))

🚩 运行结果:

A =  [[-4  0  2 -1  0]
 [ 1  3 -3 -1  4]
 [ 2  0  1  3  0]
 [-2  1 -3 -1  5]
 [ 1 -5  1  0  5]]
det(A) =  -997.0

💬 例2:

import numpy as np
def cofactor(A, i, j): # 辅助因子
    (n,m) = A.shape
    M = np.zeros((n-1, m-1))
    for a in range(0, n-1):
        k = a if (a < i) else a+1
        for b in range(0, m-1):
            l = b if (b < j) else b+1
            M[a,b] = A[k, l]
    return (-1)**(i+j)*np.linalg.det(M)
def inverseByAdjointMatrix(A): # 利用伴随矩阵(matrix)计算A的逆矩阵(matrix)
    detA = np.linalg.det(A) # A的矩阵(matrix)式计算
    (n,m) = A.shape
    adjA = np.zeros((n, m))
    for i in range(0,n): # 生成伴随矩阵(matrix)
        for j in range(0, m):
            adjA[j,i] = cofactor(A, i, j)
    if detA != 0.0:
        return (1./detA) * adjA
    else:
        return 0
A = np.array([[-4, 0, 2, -1, 0], [1, 3, -3, -1, 4], [2, 0, 1, 3, 0],
              [-2, 1, -3, -1, 5], [1, -5, 1, 0, 5]])
print("A = ", A)
Ainv = inverseByAdjointMatrix(A)
print("A inverse = ", Ainv)

🚩 运行结果:

A =  [[-4  0  2 -1  0]
 [ 1  3 -3 -1  4]
 [ 2  0  1  3  0]
 [-2  1 -3 -1  5]
 [ 1 -5  1  0  5]]
A inverse =  [[-0.07321966  0.2106319  -0.03610832 -0.24573721  0.0772317 ]       
 [ 0.16950853  0.26579739  0.09729188 -0.14343029 -0.06920762]
 [ 0.32397192  0.30090271  0.09127382 -0.35105316  0.11033099]
 [-0.05917753 -0.24072217  0.32698094  0.28084253 -0.08826479]
 [ 0.11935807  0.16349047  0.08625878 -0.02407222  0.09327984]]

import numpy as np
def solveByCramer(A, B): # # 利用Cramer公式求联立线性方程AX=B的解
    X = np.zeros(len(B))
    C = np.copy(A)
    for i in range(0, len(B)):
        for j in range(0, len(B)):
            C[j,i] = B[j]
            if i>0:
                C[j,i-1] = A[j,i-1]
        X[i] = np.linalg.det(C)/np.linalg.det(A)
    return X
# AX = B의 해
A = np.array([[2,-1,5,1], [3,2,2,-6], [1,3,3,-1], [5,-2,-3,3]])
B = np.array([[-3], [-32], [-47], [49]])
X = solveByCramer(A, B)
print("A = ", A)
print("B = ", B)
print("X = ", X)

🚩 运行结果:

A =  [[ 2 -1  5  1]
 [ 3  2  2 -6]
 [ 1  3  3 -1]
 [ 5 -2 -3  3]]
B =  [[ -3]
 [-32]
 [-47]
 [ 49]]
X =  [  2. -12.  -4.   1.]


参考文献

Introduction to Linear Algebra, International 4 th Edition by Gilbert Strang, Wellesley Cambridge Press.

百度百科[EB/OL]. []. https://baike.baidu.com/.

本篇完。

版权声明:本文为博主柠檬叶子C原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_50502862/article/details/121430140

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2021年11月22日 下午10:19
下一篇 2021年11月22日 下午10:50

相关推荐