Files
CalWay_Python/按方法整理/矩阵-列主元高斯消元法.py
2025-06-19 00:08:48 +08:00

99 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import math
# 列主元高斯消元法
def SovleRowMain(A,b):
ks = 0.00000001
n = len(A)
if len(A[0]) != n:
print("A要为方阵")
return None,None,None,None
if len(b) != n:
print("b与A的行数不匹配")
return None,None,None,None
p = list(range(n))
for i in range(n):
row_max = abs(A[i][i])
row_max_index = i
for j in range(i + 1, n):
if abs(A[j][i]) > row_max:
row_max = abs(A[j][i])
row_max_index = j
A[i], A[row_max_index] = A[row_max_index], A[i]
b[i], b[row_max_index] = b[row_max_index], b[i]
p[i], p[row_max_index] = p[row_max_index], p[i]
print(f"{i+1}次交换,交换行{i+1}和行{row_max_index+1}A矩阵为")
for row in A:
print(row)
print(f"b向量为{b}\n")
if abs(A[i][i]) < ks:
print("A矩阵奇异无法进行高斯消元")
return None,None,None,None
for j in range(i + 1, n):
m = A[j][i] / A[i][i]
A[j][i] = m
for k in range(i + 1, n):
A[j][k] -= m * A[i][k]
b[j] -= m * b[i]
print(f"系数为{-1*m}用加号")
print("消元后的A矩阵")
for row in A:
print(row)
print(f"消元后的b向量{b}\n")
if abs(A[n - 1][n - 1]) < ks:
print("A矩阵奇异无法进行高斯消元")
return None,None,None,None
# 回代求解
b[n - 1] /= A[n - 1][n - 1]
for i in range(n - 2, -1, -1):
for j in range(i + 1, n):
b[i] -= A[i][j] * b[j]
b[i] /= A[i][i]
# 得到L,U和P矩阵
L = [[0 for i in range(n)] for j in range(n)]
U = [[0 for i in range(n)] for j in range(n)]
P = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
for j in range(n):
if i == j:
L[i][j] = 1
U[i][j] = A[i][j]
elif i < j:
U[i][j] = A[i][j]
else:
L[i][j] = A[i][j]
P[i][p[i]] = 1
return P,L,U,b
#打印矩阵
def prettyPrintMatrix(matrix):
for row in matrix:
print(row)
if __name__ == "__main__":
##########################################################################
#把矩阵A和b改成题干要求的#####################################
A = [
[0, 3, 4],
[1, -1, 1],
[2, 1, 2]
]
b = [1, 2, 3]
P,L,U,x = SovleRowMain(A, b)
print("P:")
prettyPrintMatrix(P)
print("L:")
prettyPrintMatrix(L)
print("U:")
prettyPrintMatrix(U)
print("x:")
print(x)