数值分析:Python实现列主元高斯消去法与LU分解法求解线性方程组

Python实现列主元高斯消去法与LU分解法

数值分析:Python实现列主元高斯消去法与LU分解法求解线性方程组

一、矩阵形式的线性代数方程组

在这里插入图片描述

二、高斯消去法

在这里插入图片描述
在这里插入图片描述

三、高斯列主元消去法

在这里插入图片描述

四、矩阵三角分解法(LU分解)

这里只简单介绍Doolittle分解法。
在这里插入图片描述
在这里插入图片描述

题目:编写列主元高斯消去法与LU分解法解线性方程组Ax=b。

在这里插入图片描述
列主元消去法代码实现:

import math
import numpy as np
#目的:熟悉列主元消去法,以及三角分解法等直接求解线性方程组的算法
#列主元消元法
def CME(a,b,x):

    isdet0 = 0
    m, n = a.shape                  #矩阵a的行数和列数
    # j表示列
    for k in range(n - 1):          # k表示第一层循环,(0,n-1)行
            #在每次计算前,找到最大主元,进行换行
            ans = np.fabs(a[k][k])
            ik = k
            for i in range(k+1, n):
                if ans < np.fabs(a[i][k]):  # fabs是绝对值,将a中绝
对值最大的找出来
                    ik = i
                    ans = np.fabs(a[i][k])

            if np.fabs(ans) < 1e-10:
                isdet0 = 1
                break
            if ik != k :
                for i in range(k,m):
                    temp = a[k][i]
                    a[k][i] = a[ik][i]
                    a[ik][i] = temp
                temp = b[k]
                b[k] = b[ik]
                b[ik] = temp

            for i in range(k + 1, n):   # i表示第二层循环,(k+1,n)行,
计算该行消元的系数
                temp = a[i][k] / a[k][k]     #计算

                for j in range(k,m):      # j表示列,对每一列进行运算
                    a[i][j] = a[i][j] - temp * a[k][j]

                b[i] = b[i] - temp * b[k]
    # 回代求出方程解
    if np.fabs(a[n-1][n-1]) < 1e-10 :
        isdet0 = 1
    if isdet0 == 0:
           # x = np.zeros(n)
            x[n - 1] = b[n - 1] / a[n - 1][n - 1] #先算最后一位的x解
            for i in range(n - 2, -1, -1):    #依次回代倒着算每一个解
                temp = 0
                for j in range(n - 1, i,-1):
                    temp = temp + a[i][j]*x[j]

                x[i] = (b[i]-temp) / a[i][i]
            for i in range(n):
                print("x" + str(i + 1) + " = ", x[i])
            print("x" " = ", x)
if __name__ == '__main__':      #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
    a = np.array([[3.01, 6.03, 1.99], [1.27, 4.16, -1.23], [0.987, -4.81, 9.34]])
    b = np.array([1.0, 1.0, 1.0])
    m,n = a.shape
    x = np.zeros(n)
    B = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            B[i][j] = a[i][j]
    CME(a,b,x)
    #验证
    for i in range(0, n):
        temp = 0
        for j in range(0, n):
            temp = temp + B[i][j] * x[j]
        print("%f ", temp)

if __name__ == '__main__':
main()

LU分解法代码实现:

import math
import numpy as np
#目的:熟悉列主元消去法,以及三角分解法等直接求解线性方程组的算法
#列主元消元法
def CME(a,b,x):

    isdet0 = 0
    m, n = a.shape                  #矩阵a的行数和列数
    # j表示列
    for k in range(n - 1):          # k表示第一层循环,(0,n-1)行
            #在每次计算前,找到最大主元,进行换行
            ans = np.fabs(a[k][k])
            ik = k
            for i in range(k+1, n):
                if ans < np.fabs(a[i][k]):  # fabs是绝对值,将a中绝对值最大的找出来
                    ik = i
                    ans = np.fabs(a[i][k])

            if np.fabs(ans) < 1e-10:
                isdet0 = 1
                break
            if ik != k :
                for i in range(k,m):
                    temp = a[k][i]
                    a[k][i] = a[ik][i]
                    a[ik][i] = temp
                temp = b[k]
                b[k] = b[ik]
                b[ik] = temp

            for i in range(k + 1, n):   # i表示第二层循环,(k+1,n)行,计算该行消元的系数
                temp = a[i][k] / a[k][k]     #计算

                for j in range(k,m):      # j表示列,对每一列进行运算
                    a[i][j] = a[i][j] - temp * a[k][j]

                b[i] = b[i] - temp * b[k]
    # 回代求出方程解
    if np.fabs(a[n-1][n-1]) < 1e-10 :
        isdet0 = 1
    if isdet0 == 0:
           # x = np.zeros(n)
            x[n - 1] = b[n - 1] / a[n - 1][n - 1] #先算最后一位的x解
            for i in range(n - 2, -1, -1):      #依次回代倒着算每一个解
                temp = 0
                for j in range(n - 1, i,-1):
                    temp = temp + a[i][j]*x[j]

                x[i] = (b[i]-temp) / a[i][i]
            for i in range(n):
                print("x" + str(i + 1) + " = ", x[i])
            print("x" " = ", x)
#三角消元法
def LU(a,b,x):
    m, n = a.shape  # 矩阵a的行数和列数
    y = np.array([0.0, 0.0, 0.0])
    for j in range(1,n):# L的第0列
        a[j][0] = a[j][0] / a[0][0]
    for i in range(1,n-1):# 求U的第i行 L的第i行
        for j in range(i,n):#求U的第i行的第j个元素
            sum = 0.0 #求和
            for s in range(0,i):
                sum = sum +a[i][s] * a[s][j]
            a[i][j] = a[i][j] - sum
        #求L的第i列的第j个元素  在j行i列
        for j in range(i+1,n):
            sum = 0.0
            for s in range(0,i):
                sum = sum + a[j][s] * a[s][i]
            a[j][i] = ( a[j][i] - sum ) / a[i][i]
    #求U[n-1][n-1]
    sum = 0.0 #求和
    for s in range(0,n-1):
        sum = sum + a[n-1][s] * a[s][n-1]
    a[n-1][n-1] = a[n-1][n-1] - sum
    y[0] = b[0]
    for i in range(1,n):
        sum = 0.0
        for j in range(0,i):
            sum = sum + a[i][j] * y[j]
        y[i] = b[i] - sum
    x[n-1] = y[n-1] / a[n-1][n-1]
    for i in range(n-2,-1,-1):#求x[i]
        sum = 0.0
        for j in range(n-1,i,-1):
            sum = sum + a[i][j] * x[j]
        x[i] = ( y[i] - sum ) / a[i][i]
    for i in range(n):
        print("x" + str(i + 1) + " = ", x[i])
    print("x" " = ", x)

if __name__ == '__main__':      #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
    a = np.array([[3.01, 6.03, 1.99], [1.27, 4.16, -1.23], [0.987, -4.81, 9.34]])
    b = np.array([1.0, 1.0, 1.0])
    m,n = a.shape
    x = np.zeros(n)
    B = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            B[i][j] = a[i][j]
   # CME(a,b,x)
    LU(a,b,x)
    #验证
    for i in range(0, n):
        temp = 0
        for j in range(0, n):
            temp = temp + B[i][j] * x[j]
        print("%f ", temp)

  • 8
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱吹雪、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值