diff --git a/按方法整理/矩阵-G-S得G.py b/按方法整理/矩阵-G-S得G.py new file mode 100644 index 0000000..1d3074d --- /dev/null +++ b/按方法整理/矩阵-G-S得G.py @@ -0,0 +1,91 @@ +#模 范数 +def Norm(x,v): + if len(x[0]) == 1: + if v == 1: + return sum([abs(i[0]) for i in x]) + elif v == 2: + return (sum([i[0]**2 for i in x]))**0.5 + elif v == float("inf"): + return max([abs(i[0]) for i in x]) + else: + if v == 1: + return max([sum([abs(x[i][j]) for i in range(len(x))]) for j in range(len(x[0]))]) + elif v == float("inf"): + return max([sum([abs(i) for i in x[j]]) for j in range(len(x))]) + return None + +# 计算矩阵的点积 +def Dot(A,B): + if len(A[0]) != len(B): + return None + return [[sum([A[i][j] * B[j][k] for j in range(len(A[0]))]) for k in range(len(B[0]))] for i in range(len(A))] + +# 计算矩阵的行列式 +def Det(A): + if len(A) == 2: + return A[0][0] * A[1][1] - A[0][1] * A[1][0] + det = 0 + for c in range(len(A)): + sub_matrix = [row[:c] + row[c+1:] for row in A[1:]] + det += ((-1) ** c) * A[0][c] * Det(sub_matrix) + return det + +# 计算矩阵的逆矩阵 +def Inverse(A): + n = len(A) + # 计算代数余子式矩阵 + B = [[0 for i in range(n)] for j in range(n)] + for i in range(n): + for j in range(n): + minor = [row[:j] + row[j+1:] for row in (A[:i] + A[i+1:])] + B[j][i] = ((-1) ** (i + j)) * sum(minor[k][l] * (-1) ** (k + l) for k in range(n - 1) for l in range(n - 1)) + det = Det(A) + print("det(A):",det) + if det == 0: + print("矩阵不可逆") + return None + A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)] + return A_inv + +def FixInv(A): + n = len(A) + B = [[0 for i in range(n)] for j in range(n)] + for i in range(n): + for j in range(n): + t = [row[:j] + row[j+1:] for row in (A[:i] + A[i+1:])] + B[j][i] = ((-1) ** (i + j)) * Det(t) + det = Det(A) + if det == 0: + print("矩阵不可逆") + return None + A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)] + return A_inv + + + +if __name__ == "__main__": + ########################################################################## + # 把矩阵换成题干的矩阵 ######################### + A = [ + [1,2,-2], + [1,1,1], + [2,2,1] + ] + + DL = [[0 for _ in range(len(A))] for __ in range(len(A))] + U = [[0 for _ in range(len(A))] for __ in range(len(A))] + for i in range(len(A)): + for j in range(len(A[0])): + if i >= j: + DL[i][j] = A[i][j] + else: + U[i][j] = -A[i][j] + + + + print(f"LU分解的D-L矩阵为: {DL}") + print(f"LU分解的U矩阵的逆矩阵为: {U}") + ID = FixInv(DL) + G = Dot(ID, U) + print(f"LU分解的G矩阵为: {G}") + diff --git a/按方法整理/矩阵-逆矩阵-条件数.py b/按方法整理/矩阵-逆矩阵-条件数.py index 84d2c3e..4ea87ec 100644 --- a/按方法整理/矩阵-逆矩阵-条件数.py +++ b/按方法整理/矩阵-逆矩阵-条件数.py @@ -42,9 +42,27 @@ def Inverse(A): A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)] return A_inv +def FixInv(A): + n = len(A) + if n == 2: + return [[A[1][1] / Det(A), -A[0][1] / Det(A)], + [-A[1][0] / Det(A), A[0][0] / Det(A)]] + B = [[0 for i in range(n)] for j in range(n)] + for i in range(n): + for j in range(n): + t = [row[:j] + row[j+1:] for row in (A[:i] + A[i+1:])] + B[j][i] = ((-1) ** (i + j)) * Det(t) + det = Det(A) + if det == 0: + print("矩阵不可逆") + return None + A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)] + return A_inv + # 计算矩阵的条件数 def Cond(A,v): - inv_A = Inverse(A) + # inv_A = Inverse(A) + inv_A = FixInv(A) print(f"inv_A: {inv_A}, Norm(A, v): {Norm(A, v)}, Norm(inv_A, v): {Norm(inv_A, v)}") # print(inv_A,Norm(A, v), Norm(inv_A, v)) return Norm(A, v) * Norm(inv_A, v)