版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/deramer1/article/details/79049625
高斯消元法是解线性方程组的一种常见的方法,下面是高斯消元法的实现过程,下面的算法仅能解决各主元素不为0的情况。
下面是算法的实现思路:
1.算法总共分为两大步骤,第一个步骤是将增广矩阵消元形成上三角矩阵,第二个步骤是从下向上进行回带完成解方程的步骤。
2.在第一个步骤里总共有三重循环
1>第一重循环是要控制一共要有多少次消元。如下图要将左边的矩阵变成右边的矩阵要进行2次消元。
2>第二重循环是要将当前消元的主元素变成一,同时该主元素所在的行同时缩小相应的倍数。例如:将a11这一行的元素同时除以a11,这行元素变为1,a12/a11,a13/a11,b1/a11
3>第三重循环将主元素所在的列,完成消元归零的操作。将a11所在的列都变成0,a21-a21*1 ,a22-a21*a12/a11,a23-a21*a13/a11,b32-a21*b1/a11
3.回带
import matplotlib.pyplot as plt
from pylab import mpl
import math
"""
利用高斯消元法,求解方程组的解。
方程组如下:
6x1+15x2+55x3=152.6
15x1+55x2+225x3=585.6
55x1+225x2+979x3=2488.8
"""
def calculate_parameter(data):
# i用来控制列元素,line是一行元素,j用来控制循环次数,datas用来存储局部变量。保存修改后的值
i = 0;
j = 0;
line_size = len(data)
# 将行列式变换为上三角行列式
while j < line_size - 1:
line = data[j]
temp = line[j]
templete = []
for x in line:
x = x / temp
templete.append(x)
data[j] = templete
# flag标志应该进行消元的行数
flag = j + 1
while flag < line_size:
templete1 = []
temp1 = data[flag][j]
i = 0
for x1 in data[flag]:
if x1 != 0:
x1 = x1 - (temp1 * templete[i])
templete1.append(x1)
else:
templete1.append(0)
i += 1
data[flag] = templete1
flag += 1
j += 1
# 求相应的参数值
parameters = []
i = line_size - 1
# j标识减去元素个数
# flag_rol标识除那一列
flag_j = 0
rol_size = len(data[0])
flag_rol = rol_size - 2
# 获得解的个数
while i >= 0:
operate_line = data[i]
if i == line_size - 1:
parameter = operate_line[rol_size - 1] / operate_line[flag_rol]
parameters.append(parameter)
else:
flag_j = (rol_size - flag_rol - 2)
temp2 = operate_line[rol_size - 1]
# result_flag为访问已求出解的标志
result_flag = 0
while flag_j > 0:
temp2 -= operate_line[flag_rol + flag_j] * parameters[result_flag]
result_flag += 1
flag_j -= 1
parameter = temp2 / operate_line[flag_rol]
parameters.append(parameter)
flag_rol -= 1
i -= 1
return parameters
paremeters=[[6,15, 55,152.6], [15, 55, 225, 585.6], [55,225,979,2488.8]]
results=calculate_parameter(paremeters)
print(" x1="+str(results[2])+"\n x2="+str(results[1])+"\n x3="+str(results[0]))