用列主元高斯(Gauss)消元法求n阶线性方程组的解(python)

(一)目的

通过设计、编制、调试2~3个求n阶线性方程组数值解的程序,加深对其数值计算方法及有关的基础理论知识的理解。

(二)要求

    用编程语言实现用高斯(Gauss)消元法求n阶线性方程组的解、用列主元高斯(Gauss)消元法求n阶线性方程组的解、用库郎(Courant)列主直接分解法求n阶线性方程组的解的程序。

二、示例

1、问题

用高斯(Gauss)消元法求n阶线性方程组的解。

2、算法描述

(略)

3、程序中变量说明

    (略)

4、源程序清单及运行结果

(略)

5、按以上4点要求编写上机实验报告。

列主元高斯(Gauss)消元法基本原理:

用列主元高斯(Gauss)消元法求n阶线性方程组的解(python)_第1张图片

 python实现:

import numpy as np
import math  #|b|=math.fabs(b)

def gauss(a, b):
    m, n = a.shape  # 获取矩阵的行数和列数
    c = np.zeros(n)  # 根据矩阵的行数构建一个一维0数组
    #for i in range(n):
        # 限制条件
     #   if (a[i][i] == 0):  # 用高斯消去法解线性方程组时对角线元素不能为0
      #      print("no answer")

    # k表示第一层循环,(0,n-1)行
    # i表示第二层循环,(k+1,n)行,计算该行消元的系数
    # j表示列
    #biaoji 找出列最大元素的行号
    for k in range(n - 1):
        tem = 0.0
        for biaoji in range(k, n):
            if tem < np.fabs(a[biaoji][k]):  # fabs是绝对值,将a中绝对值最大的找出来
                ans = a[biaoji][k]
                maxn = biaoji
        a[[k, maxn], :] = a[[maxn, k], :]  # 行交换
        b[k], b[maxn] = b[maxn], b[k]

        for i in range(k + 1, n):
            c[i] = a[i][k] / a[k][k]  # 计算出系数

            for j in range(k,m):  # 从K开始,减少不必要的计算
                a[i][j] = a[i][j] - c[i] * a[k][j]  # 对矩阵进行高斯消去
            b[i] = b[i] - c[i] * b[k]

        print(a)
        #print(b)
    x = np.zeros(n)

    x[n - 1] = b[n - 1] / a[n - 1][n - 1]  # 解出x[n-1],为回代作准备

    # 回代求出方程解
    for i in range(n-2, -1, -1):
        sum= 0.0
        for j in range(n-1, -1, -1):
            sum= sum + a[i][j] * x[j]
        x[i] = (b[i]-sum) / a[i][i]
        #print(sum)

    for i in range(n):
        print("x" + str(i + 1) + " = ","%.2f" % x[i])  # 输出结果


if __name__ == '__main__':
    a = np.array([[2.0, -1.0, 3.0, 2.0], [3.0, -3.0, 3.0, 2.0], [3.0, -1.0, -1.0, 2.0], [3.0, -1.0, 3.0, -1.0]])
    b = np.array([6.0, 5.0, 3.0, 4.0])
    gauss(a, b)
    #结果 [1,1,1,1]

#相较于Guass算法列主元算法主要是多了找列中最大元素所在行,并换行这一步。

结果如下:

列主元Guass消去法输出解果:

E:\shuzhifenxishiyan\liezhuyuangGauss\venv\Scripts\python.exe E:/shuzhifenxishiyan/liezhuyuangGauss/main.py

[[ 3.         -1.          3.         -1.        ]

 [ 0.         -2.          0.          3.        ]

 [ 0.          0.         -4.          3.        ]

 [ 0.         -0.33333333  1.          2.66666667]]

[[  3.          -1.           3.          -1.        ]

 [  0.          -0.33333333   1.           2.66666667]

 [  0.           0.          -4.           3.        ]

 [  0.           0.          -6.         -13.        ]]

[[  3.          -1.           3.          -1.        ]

 [  0.          -0.33333333   1.           2.66666667]

 [  0.           0.          -6.         -13.        ]

 [  0.           0.           0.          11.66666667]]

x1 =  1.00

x2 =  1.00

x3 =  1.00

x4 =  1.00

Process finished with exit code 0

你可能感兴趣的:(数值分析,python,开发语言,算法)