高斯消元法詳解

文章目錄

  • 概念
  • 用法
    • 特殊情況
  • 我的奇怪方法

概念

什么是高斯消元?讓我們看一看 OI-Wiki 的解釋:

高斯消元法(Gauss–Jordan elimination)是求解線性方程組的經典算法,它在當代數學中有著重要的地位和價值,是線性代數課程教學的重要組成部分。

高斯消元法除了用于線性方程組求解外,還可以用于行列式計算、求矩陣的逆,以及其他計算機和工程方面。

通俗來講,就是解多元一次方程。

用法

高斯消元法的核心思想和它的名字一樣:消元。為了方便講解,現在讓我們寫出一個三元一次方程組:

{ x + y + z = 6 1 ? 5 x + 3 y + 2 z = 17 2 ? 3 x + 2 y + z = 10 3 ? \begin{cases}x+y+z=6\ \textcircled{1}\\5x+3y+2z=17\ \textcircled{2}\\3x+2y+z=10\ \textcircled{3}\end{cases} ? ? ??x+y+z=6?1?5x+3y+2z=17?2?3x+2y+z=10?3??

相信各位讀者一定一眼就看得出答案,但計算機不是人,不像各位讀者那么聰明(就我一個蒟蒻,嗚嗚嗚),于是請各位讀者跟隨我穿越時光,回到初二的課堂。

初中老師講過二元一次方程組的求解方法有兩種:代入消元法和加減消元法。代入消元就是指用一個未知數表示出另一個未知數,然后再代入到另一個方程里,而加減消元法則是通過兩個方程括倍再通過加減法消掉一個未知數。

相信各位讀者已經想到高斯消元到底是什么了。好的,本期講解完畢,我們下次再見!

開個玩笑,我們繼續。

剛才我們說到二元一次方程組的求解方式有加減消元和代入消元,那我們現在把它們擴展到 n n n 元一次方程組,結果會怎么樣呢?

答案:代入消元太復雜,加減消元得高消。

這里的高消就是指高斯消元。

很明顯,代入消元對計算機和程序員來講難度太大了,因此,一位偉大的數學家——高斯,便發明了高斯消元(不知他的初衷是啥)!

高斯消元的做法是這樣的:首先把每一項的系數和右邊的常數項提取出來構成矩陣,比如上面的那個方程就可以被轉化成這樣:

{ x + y + z = 6 5 x + 3 y + 2 z = 17 3 x + 2 y + z = 10 → [ 1 1 1 6 5 3 2 17 3 2 1 10 ] \begin{cases}x+y+z=6\\5x+3y+2z=17\\3x+2y+z=10\end{cases}\to\begin{bmatrix}1&1&1&6\\5&3&2&17\\3&2&1&10\end{bmatrix} ? ? ??x+y+z=65x+3y+2z=173x+2y+z=10? ?153?132?121?61710? ?

接著讓我們把第 i i i 行第 i i i 列的數變成 1 1 1,也就是給第 i i i 行的每個數除以 a i , i a_{i,i} ai,i?,在上面的矩陣中我們先處理第一行:

[ 1 1 1 6 5 3 2 17 3 2 1 10 ] → [ 1 1 1 6 5 3 2 17 3 2 1 10 ] \begin{bmatrix}1&1&1&6\\5&3&2&17\\3&2&1&10\end{bmatrix}\to\begin{bmatrix}1&1&1&6\\5&3&2&17\\3&2&1&10\end{bmatrix} ?153?132?121?61710? ? ?153?132?121?61710? ?

然后我們以第 i i i 行第 i i i 列的數為基準,把第 i i i 列第 i i i 行下面的所有數變成 0 0 0,這一步解釋起來有點復雜,大家自己看圖:

[ 1 1 1 6 5 3 2 17 3 2 1 10 ] ? [ 1 1 1 6 5 ? 5 × 1 3 ? 5 × 1 2 ? 5 × 1 17 ? 5 × 6 3 ? 3 × 1 2 ? 3 × 1 1 ? 3 × 1 10 ? 3 × 6 ] ? [ 1 1 1 6 0 ? 2 ? 3 ? 13 0 ? 1 ? 2 ? 8 ] \begin{aligned}&\begin{bmatrix}1&1&1&6\\5&3&2&17\\3&2&1&10\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\5-5\times1&3-5\times1&2-5\times1&17-5\times6\\3-3\times1&2-3\times1&1-3\times1&10-3\times6\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&-2&-3&-13\\0&-1&-2&-8\end{bmatrix}\end{aligned} ? ?153?132?121?61710? ?? ?15?5×13?3×1?13?5×12?3×1?12?5×11?3×1?617?5×610?3×6? ?? ?100?1?2?1?1?3?2?6?13?8? ??

最后重復上述操作,直到形成一個上三角結構,為了方便讀者理解,這里把全過程展示了出來:

[ 1 1 1 6 0 ? 2 ? 3 ? 13 0 ? 1 ? 2 ? 8 ] ? [ 1 1 1 6 0 ? 2 ÷ ( ? 2 ) ? 3 ÷ ( ? 2 ) ? 13 ÷ ( ? 2 ) 0 ? 1 ? 2 ? 8 ] ? [ 1 1 1 6 0 1 3 2 13 2 0 ? 1 ? 2 ? 8 ] ? [ 1 1 1 6 0 1 3 2 13 2 0 ? 1 ? 1 × ( ? 1 ) ? 2 ? 3 2 × ( ? 1 ) ? 8 ? 13 2 × ( ? 1 ) ] ? [ 1 1 1 6 0 1 3 2 13 2 0 0 ? 1 2 ? 3 2 ] ? [ 1 1 1 6 0 1 3 2 13 2 0 0 ? 1 2 ÷ ( ? 1 2 ) ? 3 2 ÷ ( ? 1 2 ) ] ? [ 1 1 1 6 0 1 3 2 13 2 0 0 1 3 ] \begin{aligned}&\begin{bmatrix}1&1&1&6\\0&-2&-3&-13\\0&-1&-2&-8\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&-2\div(-2)&-3\div(-2)&-13\div(-2)\\0&-1&-2&-8\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&1&\frac{3}{2}&\frac{13}{2}\\0&-1&-2&-8\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&1&\frac{3}{2}&\frac{13}{2}\\0&-1-1\times(-1)&-2-\frac{3}{2}\times(-1)&-8-\frac{13}{2}\times(-1)\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&1&\frac{3}{2}&\frac{13}{2}\\0&0&-\frac{1}{2}&-\frac{3}{2}\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&1&\frac{3}{2}&\frac{13}{2}\\0&0&-\frac{1}{2}\div(-\frac{1}{2})&-\frac{3}{2}\div(-\frac{1}{2})\end{bmatrix}\\&\Rightarrow\begin{bmatrix}1&1&1&6\\0&1&\frac{3}{2}&\frac{13}{2}\\0&0&1&3\end{bmatrix}\end{aligned} ? ?100?1?2?1?1?3?2?6?13?8? ?? ?100?1?2÷(?2)?1?1?3÷(?2)?2?6?13÷(?2)?8? ?? ?100?11?1?123??2?6213??8? ?? ?100?11?1?1×(?1)?123??2?23?×(?1)?6213??8?213?×(?1)? ?? ?100?110?123??21??6213??23?? ?? ?100?110?123??21?÷(?21?)?6213??23?÷(?21?)? ?? ?100?110?123?1?6213?3? ??

于是我們就得到了一個上三角結構的矩陣(即下半部分的三角形全是 0 0 0),而它的等效方程就是這個:

[ 1 1 1 6 0 1 3 2 13 2 0 0 1 3 ] ? { x + y + z = 6 y + 3 2 z = 13 2 z = 3 \begin{bmatrix}1&1&1&6\\0&1&\frac{3}{2}&\frac{13}{2}\\0&0&1&3\end{bmatrix}\Leftrightarrow\begin{cases}x+y+z=6\\y+\frac{3}{2}z=\frac{13}{2}\\z=3\end{cases} ?100?110?123?1?6213?3? ??? ? ??x+y+z=6y+23?z=213?z=3?

接下來就是最重要的一步了:代入消元。有人會問:坐著你前面不是說代入消元很麻煩嗎,怎么現在又要代入消元了?是不是玩不起啊?

其實不是的,因為通過觀察左邊的那個方程,我們會發現 z z z 的值實際上已經解開了,對應到矩陣上就是最后一行的倒數第二個是一個 1 1 1,而前面的數全是 0 0 0,這時最后一行的最后一個數就是最后的那個未知數的解,記錄下來。

然后回到倒數第二行,我們不難發現:除了倒數第二個數(注意:我這里沒寫第二個,而寫的是倒數第二個)是 1 1 1 之外,其他的不是 0 0 0 就是其他亂七八糟的數,在右邊的方程中,我們在把 z z z 解開后肯定是帶入到倒數第二個方程中,解開 y y y,而對應在左邊的矩陣里就是用最后一個數減去最后那個數乘以下面那個未知數的值,于是得到了 y = 2 y=2 y=2 這個解,記錄下來。

然后就不需要我講了吧。(不會有人不會舉一反三吧。)

特殊情況

上面的操作中,由于我們過分理想化的假設,導致我們沒遇到一種特殊情況:系數為 0 0 0!我們舉個例子看看會發生什么:

{ y + z = 3 x + z = 4 x + y = 5 \begin{cases}y+z=3\\x+z=4\\x+y=5\end{cases} ? ? ??y+z=3x+z=4x+y=5?

畫成矩陣:

[ 0 1 1 3 1 0 1 4 1 1 0 5 ] \begin{bmatrix}0&1&1&3\\1&0&1&4\\1&1&0&5\end{bmatrix} ?011?101?110?345? ?

然后按照上面的步驟:首先我們需要將 a 1 , 1 a_{1,1} a1,1? 變成 1 1 1。但我們發現個事: a 1 , 1 = 0 a_{1,1}=0 a1,1?=0!按照正常的做法只需要除以一個 a 1 , 1 a_{1,1} a1,1? 就行了,但是沒有除以 0 0 0 這個東西啊喂!于是你的程序會直接 R E \color{purple}{RE} RE 掉。

但是這個方程沒有解嗎?并不是。上過小學奧數或者初中的人都知道這個方程有解 { x = 3 y = 2 z = 1 \begin{cases}x=3\\y=2\\z=1\end{cases} ? ? ??x=3y=2z=1?(呀,一不小心說出答案了),那這是怎么一回事呢?

原因很簡單:只是因為這個方程剛好系數為 0 0 0。你看下一個方程系數不就又是 1 1 1 了嗎?因此我們可以適當把第二行和第一行的數換個位置,于是這個矩陣變成了這樣:

[ 1 0 1 4 0 1 1 3 1 1 0 5 ] \begin{bmatrix}1&0&1&4\\0&1&1&3\\1&1&0&5\end{bmatrix} ?101?011?110?435? ?

然后就可以快樂的解方程了。

總結一下: 規則就兩條:

  1. 能直接解的直接解。
  2. 不能直接解的換兩行再解。

最后說明一下判無解和無數解的辦法:無解就是存在某一行除了最后一列其他全是 0 0 0,無數解就是存在一行全是 0 0 0

淺淺算一下時間復雜度: O ( n 3 ) O(n^3) O(n3)

代碼太簡單,就不展示了。(我絕對不會告訴你是因為我不會寫。)

但是!


我的奇怪方法

由于本蒟蒻太菜,實在不會寫高消,于是我自己再高消的基礎上改了一下。

首先,我不需要換行,對于每一行我都遍歷一遍找一個主元,而不是一定以第 i i i 行的第 i i i 個為主元。

其次,我每次消是把這一列全消成 0 0 0(除這個主元之外),這樣最后就是一個 01 01 01 矩陣。

最后,我不需要還原,因為左邊是個 01 01 01 矩陣,所以系數只有可能是 0 0 0 1 1 1,所以直接輸出最后一列就行。

當然,我的解是隨機分布的,因此需要拿個標記數組標記每個解再第幾行再輸出。

時間復雜度: O ( n 3 ) O(n^3) O(n3)

代碼:

//洛谷P3389
#include<bits/stdc++.h>
#define int long long
#define code using
#define by namespace
#define plh std
code by plh;
int n,vis[106],h[106];
const double eps=1e-7;
double a[106][106],f[106];
void Gauss()
{for(int i=1;i<=n;i++){int id=0;for(int j=1;j<=n;j++){if(fabs(a[i][j])>eps&&!vis[j]){id=j;break;}}if(id){vis[id]=1;h[id]=i;for(int j=1;j<=n;j++){if(j!=id){a[i][j]/=a[i][id];}}f[i]/=a[i][id];a[i][id]=1;for(int j=1;j<=n;j++){if(j!=i){for(int k=1;k<=n;k++){if(k!=id){a[j][k]-=a[i][k]*a[j][id];}}f[j]-=f[i]*a[j][id];a[j][id]=0;}}}else{if(fabs(f[i])>eps){cout<<"No Solution";n=0;return;}}}
}
signed main()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}cin>>f[i];}Gauss();if(!n){return 0;}for(int i=1;i<=n;i++){if(!vis[i]){cout<<"No Solution";return 0;}}for(int i=1;i<=n;i++){printf("%0.2lf\n",f[h[i]]);}return 0;
}

說句實話,這篇文章制作非常不易(特別是 LateX 那一部分,真的是一個字一個字打出來的),希望讀者能點個贊,非常感謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87483.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

暴雨服務器成功中標華中科技大學集成電路學院服務器采購項目

近日&#xff0c;武漢暴雨信息發展有限公司在激烈的競爭中脫穎而出&#xff0c;成功中標華中科技大學集成電路學院的服務器采購項目。此次中標產品為暴雨旗下的塔式重裝AM400服務器&#xff0c;這一成果標志著暴雨信息在高性能計算領域的卓越實力得到了高校科研機構的高度認可。…

集群聊天服務器---MySQL數據庫的建立

數據庫的建立表格 user表 字段名稱字段類型字段說明約束idINT用戶idPRIMARY KEY, AUTO_INCREMENTnameVARCHAR(50)用戶名NOT NULL, UNIQUEpasswordVARCHAR(50)用戶密碼NOT NULLstateENUM(online, offline)當前登錄狀態DEFAULT offline friend表 字段名稱字段類型字段說明約束…

MongoDB 安裝使用教程

一、MongoDB 簡介 MongoDB 是一個高性能、開源的 NoSQL 文檔型數據庫&#xff0c;使用 BSON&#xff08;二進制 JSON&#xff09;格式存儲數據。適合存儲大規模、高并發的非結構化數據&#xff0c;常用于大數據、日志存儲、微服務架構中。 二、下載安裝 2.1 官網下載 訪問 …

FastAPI 小白教程:從入門級到實戰(源碼教程)

目錄 1. FastAPI 基本介紹 安裝 FastAPI 2. 簡單的 CRUD 示例 2.1 創建基本應用 2.2 添加 CRUD 操作??????? 3. 處理跨域請求 (CORS) 4. 普通案例&#xff1a;待辦事項 API??????? 5. 企業案例&#xff1a;認證和數據庫集成 5.1 使用 SQLAlchemy 和 JWT…

java中jasypt是用來做什么的?

思路&#xff1a; 簡要介紹Jasypt&#xff1a;一句話說明它的作用。配置解析&#xff1a;分別解釋password和algorithm的作用。工作流程&#xff1a;說明如何加密敏感數據并在配置文件中使用。安全提醒&#xff1a;強調密鑰管理的重要性。 最終回答&#xff1a; Jasypt&…

牛客周賽 Round 98

1.小紅與奇數 解題思路&#xff1a;如果給定的數是偶數, 由于1是任意正數的因子, 偶數1奇數 若給定的數是奇數, 1/自身, 都變成了偶數 #include <bits/stdc.h> using namespace std; void solve() {int x;cin >> x;if (x & 1)cout << "No" <…

(2)手摸手-學習 Vue3 之 變量聲明【ref 和 reactive】

手摸手-學習 Vue3 之 變量聲明【ref 和 reactive】 前言refreactive 前言 vue3 前端代碼開發過程中&#xff0c;必然會涉及變量聲明&#xff0c;會用到&#xff1a;ref、reactive 。本章節 進行講解說明。 演示的項目&#xff0c;經處理后的結構如下&#xff1a; ref 用途…

[Terence Tao訪談] 無限 | 關注模型 | 矢量場 | 策略性“作弊” | Lean

關注模型 改變視角真的很重要 無限&#xff1a;假設是球形的奶牛 陶哲軒&#xff1a;一個很好的例子是數學中的塞邁雷迪定理&#xff0c;于1970年代得以證明&#xff0c;它涉及在一組數字集合中尋找某種類型的模式&#xff0c;即等差數列&#xff0c;例如3、5、7或10、15、20。…

汽車v型推力桿總成三維5自由度性能及疲勞測試系統

V型推力桿總成裝置&#xff0c;通常設置在載重汽車中、后橋上&#xff0c;成對使用。其一端通過球面銷與車架鉸接&#xff0c;另一端則安裝在車橋上&#xff0c;通過關節軸承與車橋鉸接&#xff0c;其主要作用是穩定車橋&#xff0c;保持車橋的穩定位置&#xff0c;同時克服彈簧…

制動系統故障定義與診斷標準

核心定義&#xff1a; 制動不足 (Brake Insufficiency) 定義&#xff1a;制動系統產生的實際制動力低于預期制動力&#xff0c;但未完全喪失制動能力 關鍵特征&#xff1a; 制動距離增加20%以上 減速度低于預期值30%-50% 制動踏板行程異常增長 等效物理描述&#xff1a;&a…

server-rs

今天早上 看到有人 用cursor寫rust東西了 效果不錯遂嘗試寫一下web serverserver本身這個詞就不確指單單這一個東西在與cursor交流中,還是越來越明白了之前 沒有管過的一些"常識"一個業務服務之所以能“一直處理請求”&#xff0c;是因為有一個“東西”在背后做著持續…

python打卡day59@浙大疏錦行

知識點回顧&#xff1a; SARIMA模型的參數和用法&#xff1a;SARIMA(p, d, q)(P, D, Q)m模型結果的檢驗可視化&#xff08;昨天說的是摘要表怎么看&#xff0c;今天是對這個內容可視化&#xff09;多變量數據的理解&#xff1a;內生變量和外部變量多變量模型 統計模型&#xff…

Redisson的分布式鎖源碼分析2

文章目錄Redisson的讀寫鎖使用加鎖源碼分析釋放鎖源碼分析&#xff1a;Redisson一次加多個鎖RedissonMultiLock加鎖源碼分析&#xff1a;RedissonMultiLock釋放鎖源碼分析&#xff1a;RCountDownLatch介紹&#xff1a;RCountDownLatch源碼分析&#xff1a;RSemaphore分布式信號…

系統架構設計師論文分享-論軟件過程模型及應用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司通過了研發紗線MES系統的立項&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提升紗線工廠的數字化和智能化水平。我在該項目中擔任架構設計師&#xff0c;負責該項目的架構設計工作。本文結合我在該項目…

云原生Kubernetes系列 | etcd3.5集群部署和使用

云原生Kubernetes系列 | etcd3.5集群部署和使用 1. etcd集群部署2. etcd集群操作3. 新增etcd集群節點1. etcd集群部署 etcd3.5官網站點: ?? https://etcd.io/docs/v3.5/op-guide/clustering/ ?? https://etcd.io/docs/v3.5/tutorials/how-to-setup-cluster/ [root@localh…

helm安裝配置jenkins

1、k8s1.28.2、helm3.12.0&#xff0c;集群搭建 查看節點運行情況 kubectl get node -o wide openebs部署情況 kubectl get sc -n openebs 2、添加Jenkins Helm倉庫 helm repo add jenkins https://charts.jenkins.iohelm repo update# 查看版本 helm search repo -l jen…

Wagtail - Django 內容管理系統

文章目錄 一、關于 Wagtail1、項目概覽2、相關鏈接資源3、功能特性 二、安裝配置三、使用入門1、快速開始2、兼容性 四、其它社區與支持1、社區資源2、商業支持 開發貢獻參考項目參考文獻 一、關于 Wagtail 1、項目概覽 Wagtail 是一個基于 Django 構建的開源內容管理系統&am…

Spring AI Alibaba 來啦!!!

博客標題&#xff1a;Spring AI Alibaba&#xff1a;深度解析其優勢與阿里云生態的無縫集成 引言 隨著人工智能技術的快速發展&#xff0c;越來越多的企業和開發者開始關注如何將 AI 技術融入到現有的應用開發框架中。Spring AI 作為 Spring 框架在 AI 領域的擴展&#xff0c;…

【論文閱讀39】PINN求邊坡內時空變化的地震動響應(位移、速度、加速度)場分布

論文提出了一種基于物理信息神經網絡&#xff08;PINN&#xff09;和極限分析上界定理相結合的巖體邊坡地震穩定性分析框架&#xff0c;重點考慮了邊坡中的預存裂縫對穩定性的影響。 PINN用來求解巖質邊坡內隨時間和空間變化的地震動響應&#xff08;位移、速度、加速度&#…

驅動開發系列59- 再述如何處理硬件中斷

在本文中,我們將重點討論編寫設備驅動程序時一個非常關鍵的方面:什么是硬件中斷,更重要的是,作為驅動開發者,你該如何準確地處理它們。事實上,大量的外設(也就是你可能會為其編寫驅動的設備)在需要操作系統或驅動程序立即響應時,通常會通過觸發硬件中斷的方式發出請求…