您的位置:首页 > 编程语言 > Python开发

高斯消元法的python实现

2018-01-13 10:26 330 查看
高斯消元法是解线性方程组的一种常见的方法,下面是高斯消元法的实现过程,下面的算法仅能解决各主元素不为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]))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: