1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #!/usr/bin/python3 #coding=utf-8
import numpy as np
## ======== 以下为高斯消元法的算法部分 ======== # 参考代码:https://blog.csdn.net/lzyws739307453/article/details/89816311
# 打印矩阵的内容 def printM(a): m = len(a) n = len(a[0]) for i in range(0,m): for j in range(0,n): print("%10f,\t"%a[i][j],end="") print()
# 选择列主元并消元 def SelectColE(a): #a:2-dimension matrix; n:int n = len(a) # 参数n应该代表的是矩阵的行数,也就是线性方程组的方程个数 for i in range(0,n): # 循环处理每一行的信息 r = i for j in range(i,n): if(abs(a[j][i])>abs(a[r][i])): r=j if(r!=i): # 当r!=i时,交换两行的内容。这里的操作基于以下逻辑: # 由于单纯的高斯消元法会将矩阵化为梯形矩阵,靠下方的行中系数为0的项更多 # 而非0项也会有很多分母,在除法运算中会导致精度降低 # 因此将系数大的项尽可能的往前移动,可以提高精度 tmp = a[r] a[r] = a[i] a[i] = tmp for j in range(i+1,n): # 消元 temp = a[j][i]/a[i][i] for k in range(i,n+1): a[j][k] -= a[i][k]*temp
# 高斯消元法 def Gauss(a): n = len(a) # 参数n应该代表的是矩阵的行数,也就是线性方程组的方程个数 SelectColE(a) for i in range(n-1,-1,-1): # 回代求解 # i 从 n-1递减循环到0,可以取到0 # 从第n-1行循环到第0行。由于前面已经对矩阵进行了变换,得到了一个倒三角矩阵 # 所以n-1行可以直接求得第n-1个未知数的值(未知数的下标从0开始) # 而前面的行则需要经过一些迭代 for j in range(i+1,n): # 对行矩阵进行回代 # 在此行的最后一个元素处存储回代后的值 # a[i][n]是行矩阵的最后一个元素,是存储回代后的数值的地方 # a[i][i]是本行对应的未知数的系数。一共i行,那么就是i个未知数 # 例如一个3*4的矩阵,有3个变量分别是x0,x1,x2,那么当i=1时, # 对应位置就是变量x1的系数 # 同样的,a[i][j]是本行第j个未知数的系数, # 而第j个未知数的值刚刚我们已经求过了,是a[j][n], # 所以a[i][n]减去他俩相乘的值就行 a[i][n] -= a[i][j]*a[j][n] # 回代结束后,对系数进行化简,使得第i个未知数的系数变为1,即可 # 于是第i个未知数的值就等于a[i][n]/a[i][i]。我们把它存储在a[i][n]的位置上 a[i][n] /= a[i][i]
## ======== 以上为高斯消元法的算法部分 ========
# 传入一个线性方程组的增广矩阵,这个函数将会调用高斯消元法的求解程序,并打印出求解结果。 def run(A): # 下面的内容是高斯消元法求解线性方程组的测试 # 最终的方程组的解为a[:,-1] a = A.copy() print('a=\n',np.array(a)) Gauss(a.copy()) print("求解结果:") printM(a) print("数据结构:") printM(a) for i in range(0,len(a)): print("X%d = %9f"%(i,a[i][3])) print(np.array(a)[:,-1]) print('\n\n')
# 主函数。此处展示了4个线性方程组的求解过程 if(__name__=='__main__'): print("Gauss_Elimination_Method.py") A1 =[[ 1,-1,-1, 2 ], [ 2,-1,-3, 1 ], [ 3, 2,-5, 0 ]] run(A1) A2= [[ 1, 2, 1, 8], [ 4, 0, 0,16], [ 0, 4, 0,12]] run(A2)
A3= [[ 1, 2, 0, 8], [ 4, 0, 1,16], [ 0, 4, 0,12]] run(A3)
A4= [[ 2, 0, 0, 8], [ 0, 1, 0,16], [ 4, 0, 1,12]] run(A4)
|