高斯列主元消去法——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} ? ? ??a11?x1?+a12?x2?+?+a1n?xn?=b1?a21?x1?+a22?x2?+?+a2n?xn?=b2??an1?x1?+an2?x2?+?+ann?xn?=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} ?a11?a21??an1??a12?a22??an2???????a1n?a2n??ann??b1?b2??bn?? ?

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=argijmax?ai,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,j??mij??aj,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,k?bk??j=k+1n?ak,j?xj??

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} 10?15),認為矩陣奇異(可能無解或有無窮多解),直接返回 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,j?ai,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,k?bk??j=k+1n?ak,j?xj??
    計算每個未知數的值。
  • 使用 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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84306.shtml
英文地址,請注明出處:http://en.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等…