当前位置: 首页 > news >正文

【计算方法】python实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组

文章目录

  • 题目
  • 方法一:高斯消去法
        • 结果截图
  • 方法二:列主元素高斯消元法
        • 结果截图
  • 方法三:LU分解
  • 结果截图
      • 结果总结

题目

实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组
在这里插入图片描述

方法一:高斯消去法

消去过程:
l i k = a i k ( k − 1 ) / a k k ( k − 1 ) ( i = k + 1 , k + 2 , . . . , n ) l_{ik} = a_{ik}^{(k-1)}/a_{kk}^{(k-1)} (i=k+1,k+2,...,n) lik=aik(k1)/akk(k1)(i=k+1,k+2,...,n)
a i j ( k ) = a i j ( k − 1 ) − l i k a j k ( k − 1 ) ( i , j = k + 1 , k + 2 , . . . , n ) a_{ij}^{(k)} = a_{ij}^{(k-1)}-l_{ik}a_{jk}^{(k-1)}(i,j=k+1,k+2,...,n) aij(k)=aij(k1)likajk(k1)(i,j=k+1,k+2,...,n)
b i ( k ) = b i ( k − 1 ) − l i k b k ( k − 1 ) ( i = k + 1 , k + 2 , . . . , n ) b_{i}^{(k)} = b_{i}^{(k-1)}-l_{ik}b_{k}^{(k-1)}(i=k+1,k+2,...,n) bi(k)=bi(k1)likbk(k1)(i=k+1,k+2,...,n)
回代过程:
x n = b n ( n − 1 ) / a n n ( n − 1 ) x_{n}= b_{n}^{(n-1)}/a_{nn}^{(n-1)} xn=bn(n1)/ann(n1)
x k = ( b k ( k − 1 ) − ∑ j = k + 1 n a k j ( k − 1 ) x j ) / a k k ( k − 1 ) x_{k}= (b_{k}^{(k-1)}-\sum_{j=k+1}^{n}a_{kj}^{(k-1)}x_j )/a_{kk}^{(k-1)} xk=(bk(k1)j=k+1nakj(k1)xj)/akk(k1)
在消元法第k次迭代时,首先 ,寻找第k列中从k到n处的绝对值最大的一个,然后互换该行和第k行的所有位置。 然后再消元。这样的好处是能控制舍入误差的扩大和传播。 基本算法如下:

import numpy as np
A = np.array([[10,-7,0,1],[-3, 2.099999,6,2 ],[5,-1,5,-1],[2,1,0,2]])
b = np.array([[8],[5.900001],[5],[1]])
def guass(A,b):
    n = b.shape[0]
    A=A.astype('float')
    b=b.astype('float')
    #消元
    for k in range(n-1):    #k第一层循环,第(0~n-1)行
#         print('第',k+1,'次的初值')
#         print(A)
#         print(b)
        for i in range(k+1,n):    #i第二层循环,第(k+1,n)行
            mik = A[i,k]/A[k,k]
            for j in range(k+1,n):    
                A[i,j] = A[i,j] - mik*A[k,j]
            b[i] = b[i] - mik*b[k]
#         print('第',k+1,'次消元后的值')
#         print(A)
#         print(b)
    #回代
    solution = np.zeros(n)
    solution[n-1] = b[n-1]/A[n-1,n-1]    #改为n-1
    for i in range(n-2,-1,-1):
        for j in range(i+1,n):
            solution[i] = solution[i] + A[i,j]*solution[j]
        solution[i] = (b[i] - solution[i])/A[i,i]
    return solution

guass(A,b)

结果截图

在这里插入图片描述


方法二:列主元素高斯消元法

def guass_zhuyuan(A,b):
    n = b.shape[0]
    A=A.astype('float')
    b=b.astype('float')
    #寻找列主元素
    for k in range(n-1):     #k第一层循环,第(0~n-2)行
#         print('第',k+1,'次的初值')
#         print(A)
#         print(b)
        arr = abs(A[k:n,k])  #每一列最大值的数组
        value = max(arr)     #最大值
        position = np.argmax(arr)    #最大值索引
        
        #print(position)
        if position != 0:
#             A[k,k:n-1],A[position+k,k:n-1] = A[position+k,k:n-1],A[k,k:n-1] 
#             b[k],b[position+k] = b[position+k],b[k]
            A[[k,position+k],k:n] = A[[position+k,k],k:n]
            b[[k,position+k],:] = b[[position+k,k],:] 
#         print('第',k+1,'次交换后的值')
#         print(A)
#         print(b)
        #消元
        for i in range(k+1,n):    #i第二层循环,第(k+1,n-1)行
            mik = A[i,k]/A[k,k]
            for j in range(k+1,n):    #j从k开始循环,不是k+1
                A[i,j] -= mik*A[k,j]
            b[i] = b[i] - mik*b[k]
#         print('第',k+1,'次消元后的值')
#         print(A)
#         print(b)

    #回代
    solution = np.zeros(n)
    solution[n-1] = b[n-1]/A[n-1,n-1]    #改为n-1
    for i in range(n-2,-1,-1):
        for j in range(i+1,n):
            solution[i] = solution[i] + A[i,j]*solution[j]
        solution[i] = (b[i] - solution[i])/A[i,i]
    return solution                     
        

结果截图

在这里插入图片描述


方法三:LU分解

def LUfenjie(A,b):
    n = b.shape[0]
    A = A.astype('float')
    b = b.astype('float')
    U = np.zeros(A.shape)
    L = np.zeros(A.shape)
    U[0,:] = A[0,:]    #U的第一行元素和A的第一行元素相等
    L[1:n,0] = A[1:n,0]/U[0,0]    #L的每一行的第一列元素和U第一个元素相乘=A的对应元素
    #分解
    #U为上三角元素 k=1~n-1行 j=k~n-1列 r=0~k-2行 i=k+1~n-1行
#     for k in range(1,n):    
#         for j in range(k,n):
#             U[k,j] = A[k,j] - L[k,0:k-1] * U[0:k-1,j]
#         for i in range(k+1,n):
#             L[i,k] = (A[i,k]-L[i,0:k-1] * U[0:k-1,k])/U[k,k]
    #分解
    #U为上三角元素 k=1~n-1行 j=k~n-1列 r=0~k-2行 i=k+1~n-1行
    for k in range(1,n):    
        for j in range(k,n):
            delta = 0
            for r in range(0,k):
                delta += L[k,r] * U[r,j]
            U[k,j] = A[k,j] - delta
        for i in range(k+1,n):
            theta = 0
            for r in range(0,k):
                theta += L[i,r] * U[r,k]
            L[i,k] = (A[i,k] - theta)/U[k,k]
    #求解y
    y = np.zeros(b.shape[0])
    #忘了初始化……
    y[0] = b[0]
    for i in range(1,n):
        alpha = 0
        for j in range(0,i):
            alpha += L[i,j]*y[j].T
        y[i] = b[i] - alpha

        
    #求解x
    x = np.zeros(b.shape[0])
    x[n-1] = y[n-1]/U[n-1,n-1]
    for i in range(n-2,-1,-1):
        gama = 0 
        for j in range(i+1,n):
            gama += U[i,j]*x[j].T
        x[i] = (y[i] - gama )/U[i,i]
    return (x)           

结果截图

在这里插入图片描述


结果总结

方法结果
高斯迭代法[-6.03391825e-10, -1.00000000e+00, 1.00000000e+00, 1.00000000e+00]
列主元素高斯[ 2.66453526e-16, -1.00000000e+00, 1.00000000e+00, 1.00000000e+00]
LU分解[-6.03391825e-10, -1.00000000e+00, 1.00000000e+00, 1.00000000e+00]

相关文章:

  • 回归预测 | MATLAB实现GA-BP多输入单输出回归预测
  • Nmap的API和库文件
  • Linux命令 -文件权限配置的深入(chown/chmod/setfacl)
  • ubuntu安装selenium
  • React脚手架工具创建项目的详细介绍
  • 26_TokenMongodb
  • 【工具】使用 sealos 部署 k8s 集群
  • LeetCode 每日一题 2022/9/19-2022/9/25
  • T1046判断一个数能否同时被3和5整除 (信息学一本通C++)
  • Canal + MySQL + Zookeeper + Kafka 数据实时同步
  • 我们如何一键将录音转换成文字?
  • 给计算机专业新生的一些学习建议
  • Java处理时间格式CST和GMT转换
  • VUE之组合式API
  • WebMagic
  • 「译」Node.js Streams 基础
  • 【RocksDB】TransactionDB源码分析
  • crontab执行失败的多种原因
  • gops —— Go 程序诊断分析工具
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript 一些 DOM 的知识点
  • JavaScript-Array类型
  • java正则表式的使用
  • Less 日常用法
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • React Transition Group -- Transition 组件
  • tweak 支持第三方库
  • Web标准制定过程
  • XForms - 更强大的Form
  • 初识 webpack
  • 缓存与缓冲
  • 漂亮刷新控件-iOS
  • 深入浅出webpack学习(1)--核心概念
  • 思维导图—你不知道的JavaScript中卷
  • 通过几道题目学习二叉搜索树
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #Linux(make工具和makefile文件以及makefile语法)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (Python) SOAP Web Service (HTTP POST)
  • (八)Spring源码解析:Spring MVC
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (独孤九剑)--文件系统
  • (附源码)springboot教学评价 毕业设计 641310
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Sql Server 保留几位小数的两种做法
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .htaccess配置常用技巧
  • .NET 服务 ServiceController
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET企业级应用架构设计系列之结尾篇
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • [android]-如何在向服务器发送request时附加已保存的cookie数据