gai
This commit is contained in:
91
按方法整理/矩阵-G-S得G.py
Normal file
91
按方法整理/矩阵-G-S得G.py
Normal file
@@ -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}")
|
||||||
|
|
||||||
@@ -42,9 +42,27 @@ def Inverse(A):
|
|||||||
A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)]
|
A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)]
|
||||||
return A_inv
|
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):
|
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(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))
|
# print(inv_A,Norm(A, v), Norm(inv_A, v))
|
||||||
return Norm(A, v) * Norm(inv_A, v)
|
return Norm(A, v) * Norm(inv_A, v)
|
||||||
|
|||||||
Reference in New Issue
Block a user