高斯消元法的python实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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]))


猜你喜欢

转载自blog.csdn.net/deramer1/article/details/79049625