高斯列主元消去法——python实现

高斯列主元消去法

1. 高斯消去法

高斯消去法是一种求解线性方程组 A x = b A\mathbf{x} = \mathbf{b} Ax=b 的方法,通过逐步化简增广矩阵,将其变为上三角矩阵,从而方便求解未知数。

线性方程组的一般形式为:
{ a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋮ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n \begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2 \\ \vdots \\ a_{n1}x_1 + a_{n2}x_2 + \cdots + a_{nn}x_n = b_n \\ \end{cases} a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2an1x1+an2x2++annxn=bn
其增广矩阵形式为:
[ a 11 a 12 ⋯ a 1 n b 1 a 21 a 22 ⋯ a 2 n b 2 ⋮ ⋮ ⋱ ⋮ ⋮ a n 1 a n 2 ⋯ a n n b n ] \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\ a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} & b_n \\ \end{bmatrix} a11a21an1a12a22an2a1na2nannb1b2bn

2. 列主元消去法

在高斯消去法中,可能会遇到主元(当前行的对角线元素)过小,导致计算误差放大的问题。为了避免这种情况,引入列主元消去法。
列主元消去法的核心思想是:在每一步消元之前,选择当前列中绝对值最大的元素作为主元,并将含有该主元的行与当前行交换。通过行交换将其移到主对角线位置。这样做有两个主要目的:

  • 避免小主元造成的数值不稳定
  • 减少舍入误差的积累

在这里插入图片描述

3. 算法步骤

高斯列主元消去法的算法分为两个主要阶段:前向消元回代求解

(1) 前向消元
  • 步骤 1:从左到右逐列进行消元。

    • 在当前列中找到绝对值最大的元素(列主元)。
    • 将包含列主元的行与当前行交换。
    • 如果当前列主元为零,说明矩阵奇异(无唯一解),算法终止。
    • 用当前行的主元将当前列下方的所有元素变为零,即将矩阵变为上三角矩阵。
  • 数学表示

    • 对于第 j j j 列,找到主元 a k , j a_{k,j} ak,j,满足
      k = arg ⁡ max ⁡ i ≥ j ∣ a i , j ∣ k = \arg\max_{i \geq j} |a_{i,j}| k=argijmaxai,j
    • 交换第 j j j 行与第 k k k 行。
    • 消元操作:
      计算乘数 m i j = a i j / a j j m_{ij} = a_{ij}/a_{jj} mij=aij/ajj
      对第 k k k 行执行消元操作: a i , j = a i , j − m i j ⋅ a j , j a_{i,j} = a_{i,j} - m_{ij}\cdot a_{j,j} ai,j=ai,jmijaj,j
(2) 回代求解
  • 步骤 2:一旦矩阵变为上三角矩阵,从最后一行开始逐行求解未知数。
    • 对于第 k k k行(从下往上),计算
      x k = b k − ∑ j = k + 1 n a k , j x j a k , k x_k = \frac{b_k - \sum_{j=k+1}^n a_{k,j} x_j}{a_{k,k}} xk=ak,kbkj=k+1nak,jxj

4. 数值稳定性分析

  • 主元选择:选择列中绝对值最大的元素作为主元,避免除以接近零的小数
  • 误差控制:减少舍入误差的传播,提高计算精度
  • 适用性:对于绝大多数非奇异矩阵都能稳定求解

5. 时间复杂度

  • 前向消元: O ( n 3 ) O(n^3) O(n3)
  • 回代过程: O ( n 2 ) O(n^2) O(n2)
  • 总体复杂度: O ( n 3 ) O(n^3) O(n3)

二、代码实现与讲解

import numpy as npdef column_elimination(A):"""使用高斯列主元消去法求解线性方程组:param A: 增广矩阵(numpy数组),最后一列为常数向量:return: 解向量(numpy数组),或None(如果奇异)"""n = len(A)  # 获取矩阵行数(即方程个数)# 前向消元过程for j in range(n):# 步骤1: 寻找列主元(当前列中绝对值最大的元素)max_row = j  # 初始化主元行为当前行for k in range(j + 1, n):# 比较当前列中各元素的绝对值if abs(A[k, j]) > abs(A[max_row, j]):max_row = k  # 更新主元行# 步骤2: 交换当前行和主元行A[[j, max_row]] = A[[max_row, j]]# 步骤3: 检查主元是否为零(奇异矩阵)if abs(A[j, j]) < 1e-15:  # 设置一个小的阈值避免浮点误差return None  # 矩阵奇异,无唯一解# 步骤4: 消元操作for i in range(j + 1, n):# 计算乘数因子mij= A[i, j] / A[j, j]# 对第i行进行消元:A[i, j:] 表示从第j列开始到最后一列# 这里使用了向量化操作,提高计算效率A[i, j:] -= mij* A[j, j:]# 回代过程x = np.zeros(n)  # 初始化解向量# 从最后一行开始向上回代for k in range(n - 1, -1, -1):# 计算已知解的部分和:A[i, i+1:n] 与 x[i+1:n] 的点积# 然后从常数项中减去这个和# 最后除以主对角线元素x[k] = (A[k, -1] - np.dot(A[k, k + 1:n], x[k + 1:n])) / A[k, k]return x# 从文件读取矩阵数据
def read_file(filename):"""从文本文件读取矩阵数据:param filename: 文件名:return: NumPy数组表示的矩阵"""data = []  # 初始化数据列表with open(filename, 'r') as file:for line in file:# 处理行中的多个空格分隔# 分割每行数据并转换为浮点数row = [float(num) for num in line.split()]data.append(row)# 将列表转换为NumPy数组return np.array(data, dtype=float)# 主程序
if __name__ == "__main__":# 从文件读取数据filename = 'equation2.txt'  # 数据文件名data = read_file(filename)  # 读取数据print("增广矩阵:")print(data)# 执行高斯列主元消去法# 使用data.copy()避免修改原始数据solution = column_elimination(data.copy())if solution is None:print("\n矩阵奇异,无唯一解")else:print("\n方程组的解:")print(solution)

1. 函数定义:column_elimination(A)

def column_elimination(A):"""使用高斯列主元消去法求解线性方程组:param A: 增广矩阵(numpy数组):return: 解向量(numpy数组),或None(如果奇异)"""
  • 函数接受一个增广矩阵 ( A ),并通过高斯列主元消去法求解线性方程组。
  • 如果矩阵奇异(无唯一解),函数返回 None

2. 前向消元过程

# len(A)————矩阵的行数
n = len(A)# 前向消元过程
for j in range(n):# 寻找列主元(当前列中绝对值最大的元素)max_row = jfor k in range(j + 1, n):# A[i, j] 表示 A 的第 i 行第 j 列的元素if abs(A[k, j]) > abs(A[max_row, j]):max_row = k
  • 在每一步消元中,先找到当前列 j j j 中绝对值最大的元素作为主元,并记录其所在行 max_row
    # 交换当前行和主元行A[[j, max_row]] = A[[max_row, j]]
  • 将包含主元的行与当前行进行交换,确保当前列的主元在对角线位置。
    # 检查主元是否为零(奇异矩阵)if abs(A[j, j]) < 1e-15:return None
  • 如果主元的绝对值过小(小于阈值 10 − 15 10^{-15} 1015),认为矩阵奇异(可能无解或有无穷多解),直接返回 None
    # 消元操作(对当前行以下的所有行进行消元)# 通过消元将矩阵变为上三角矩阵for i in range(j + 1, n):mij = A[i, j] / A[j, j]A[i, j:] -= mij * A[j, j:]
  • 对当前列 j j j 下方的所有行进行消元操作。
  • 计算乘子 m i j = a i , j a j , j m_{ij} = \frac{a_{i,j}}{a_{j,j}} mij=aj,jai,j,并将当前行的 j j j 列及其右侧的元素减去主元行的对应元素乘以乘子 m i j m_{ij} mij,使当前列的下方元素变为零。

3. 回代求解过程

# 回代过程
x = np.zeros(n)   #x——[0. 0. 0.]
  • 初始化解向量 ( x ) 为零向量,长度为矩阵的行数 ( n )。
# 从最后一行向上逐行求解,计算每个未知数的值
for k in range(n - 1, -1, -1):x[k] = (A[k, -1] - np.dot(A[k, k + 1:n], x[k + 1:n])) / A[k, k]
  • 从最后一行开始,逐行计算未知数 x k x_k xk
  • 根据公式
    x k = b k − ∑ j = k + 1 n a k , j x j a k , k x_k = \frac{b_k - \sum_{j=k+1}^n a_{k,j} x_j}{a_{k,k}} xk=ak,kbkj=k+1nak,jxj
    计算每个未知数的值。
  • 使用 np.dot 计算当前行右侧未知数的线性组合。
return x
  • 返回解向量 ( x )。

4. 从文件读取矩阵数据

def read_file(filename):data = []with open(filename, 'r') as file:for line in file:# 处理行中的多个空格分隔row = [float(num) for num in line.split()]data.append(row)return np.array(data, dtype=float)
  • 从文件中逐行读取数据,并将其转换为浮点数存储为二维列表。
  • 最后,将数据转换为 numpy 数组以方便后续计算。

5. 主程序

if __name__ == "__main__":# 从文件读取数据filename = 'equation2.txt'data = read_file(filename)print(data)# 执行高斯列主元消去法# 深拷贝data.copy()————传入增广矩阵的副本,以避免修改原矩阵solution = column_elimination(data.copy())print("\n方程组的解:")print(solution)
  • 主程序从文件读取增广矩阵数据。
  • 调用 column_elimination 函数求解线性方程组。
  • 输出解向量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下安装elasticsearch及ik分词器

linux下安装elasticsearch及ik分词器 安装版本 linux版本&#xff1a;centos7.5 es版本&#xff1a;elasticsearch-7.14.0-linux-x86_64.tar.gz 下载地址&#xff1a;https://www.elastic.co/downloads/past-releases#elasticsearch Ik版本&#xff1a;elasticsearch-analysi…

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…

【配置篇】告别硬编码:多环境配置、@ConfigurationProperties与配置中心初探

摘要 本文是《Spring Boot 实战派》系列的第五篇&#xff0c;聚焦于企业级应用开发中至关重要的配置管理。文章将首先解决开发、测试、生产环境配置不同的痛点&#xff0c;详细介绍 Spring Boot 的 Profile&#xff08;多环境配置&#xff09; 机制。接着&#xff0c;我们将深…

代码随想录算法训练营第60期第六十三天打卡

大家好&#xff0c;我们昨天讲解的是拓扑排序与Dijkstra算法的朴素版&#xff0c;其实我们大致了解了两种算法的代码实现&#xff0c;我们通过上次博客了解到拓扑排序其实是可以判断图里是否存在环&#xff0c;而Dijkstra算法则使用于非负边权最短路的求解&#xff0c;今天我们…

linux中如何在日志里面检索nowStage不等于1的数据的指令

你想在 Linux 中查找日志文件中 nowStage 不等于 1 的所有 JSON 行&#xff0c;当前你已经使用了&#xff1a; Bash 深色版本 grep -rn "nowStage" ./ 这个命令可以找到包含 "nowStage" 字样的所有行及其所在的文件名和行号&#xff0c;但还不能筛选出 no…

【习题】DevEco Studio的使用

判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发&#xff0c;均可使用预览器进行预览。 正确(True) 错误(False) 正确答案: 错误(False) 知识点 预览器的使用。解析&#xff1a;预览器只支持对页面的预览&#xff0c;如果代码中涉及到一些网络、数据库、…

SpringBoot实现简易直播

当下直播技术已经成为各类应用不可或缺的一部分&#xff0c;从社交媒体到在线教育&#xff0c;再到电子商务和游戏领域&#xff0c;直播功能正在被广泛应用。 本文将介绍如何使用SpringBoot框架构建一个直播流推拉系统。 一、直播技术基础 1.1 推流与拉流概念 直播系统的核心…

xcode 各版本真机调试包下载

下载地址 https://github.com/filsv/iOSDeviceSupport 使用方法&#xff1a; 添加到下面路径中&#xff0c;然后退出重启xcode /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集

基于深度学习YOLOv11的盲人障碍物目标检测&#xff1a;开启盲人出行新纪元 在全球范围内&#xff0c;盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步&#xff0c;许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中&#xff…

Python 训练 day46

知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力后的特征图和热力图 作…

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…

yolo模型精度提升策略

总结与行动建议 立即行动&#xff1a; 显著增加6种相似BGA的高质量、多样化训练数据&#xff08;2倍以上是合理起点&#xff09;。 实施针对性数据增强&#xff1a; 设计模拟BGA实际成像挑战&#xff08;反光、模糊、视角变化&#xff09;的增强方案。 升级模型与损失函数&am…

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …

使用Docker部署MySQLRedis容器与常见命令

目录 1. 检查WSL配置2. 设置WSL版本3. 拉取MySQL镜像4. 验证镜像5. 运行MySQL容器在WSL环境中使用以下命令启动MySQL容器查看容器/镜像的完整信息显式指定宿主机挂载路径可选&#xff1a;在Windows的cmd中使用以下命令启动MySQL容器 6. 管理容器启动已创建的容器查看运行中的容…

01__C++入门

一、C的语法框架 首先学习一门语言&#xff0c;我们需要了解语言的基本框架&#xff0c;这一小节&#xff0c;我们学习C的历史应用&#xff0c;c和c的区别和c的标准 二、认识C 1、C的历史 所有的主流C编译器都支持这个版本的C&#xff08;1998年的版本&#xff09;。 2、C的应…

2024 CKA题库+详尽解析| 15、备份还原Etcd

目录 免费获取题库配套 CKA_v1.31_模拟系统 15、 备份还原Etcd 题目&#xff1a; 开始操作: 1&#xff09;、切换集群 2&#xff09;、登录master并提权 3&#xff09;、备份Etcd现有数据 4&#xff09;、验证备份数据快照 5&#xff09;、查看节点和Pod状态 6&am…

Flotherm许可的并发用户数限制

在电子产品热设计领域&#xff0c;Flotherm软件以其卓越的性能和精确的仿真能力而受到广大用户的青睐。然而&#xff0c;在使用Flotherm软件时&#xff0c;了解其许可的并发用户数限制对于优化资源配置和提升工作效率至关重要。本文将详细介绍Flotherm软件许可的并发用户数限制…

读取宝塔方法,查找容别名存放位置

可以查到对应方法 根据参数名可知 查找到 得到位置

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…