1. 程式人生 > 其它 >數學/數論專題-學習筆記:線性方程組解法(高斯消元/高斯-約旦消元)

數學/數論專題-學習筆記:線性方程組解法(高斯消元/高斯-約旦消元)

目錄

1. 前言

高斯消元/高斯-約旦消元法,常常在 \(O(n^3)\) 的複雜度內用於解線性方程組問題。

前置知識:解多元方程組的解法——加減消元,帶入消元。

模板題:P2455 [SDOI2006]線性方程組

別信洛谷上面的官方模板題,那道題沒這道題模板。

2. 高斯消元法

以下討論的所有方程組均預設只有唯一解。

首先我們回顧一下正常的方程組解法:

例子:解方程組:

\[\begin{cases}2x+3y=8&(1)\\3x+4y=11&(2)\end{cases} \]

解:\((2) \times 2-(1) \times 3\)

,得方程 \(-y=-2\),解得 \(y=2\)

帶回 \((1)\),得 \(2x+6=8\),解得 \(x=1\)

所以原方程組的解是 \(\begin{cases}x=1\\y=2\end{cases}\)

顯然上述過程利用了加減消元法則以及我們的智慧解出了這個方程組正確的解。

但是很遺憾的是我們的計算機沒有我們的智慧,我們需要制定一個法則來消元。

初中老師和高中老師應該都強調過,解方程組很重要的一步是消元,高斯正是基於消元提出了高斯消元法。

那麼看一下一般的高斯消元法的步驟:

\(n\) 元線性方程組:

\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=a_{1,n+1}\\a_{2,1}x_1+a_{2,2}x_2+\dots+a_{2,n}x_n=a_{2,n+1}\\\dots\\a_{n,1}x_1+a_{n,2}x_2+\dots+a_{n,n}x_n=a_{n,n+1}\end{cases} \]

考慮將上述方程組記成矩陣形式(不懂沒事,就是一個符號):

\[\begin{bmatrix}a_{1,1}&a_{1,2}&\dots&a_{1,n}&\mid&a_{1,n+1}\\a_{2,1}&a_{2,2}&\dots&a_{2,n}&\mid&a_{2,n+1}\\\vdots&\vdots&\ddots&\vdots&\mid&\vdots\\a_{n,1}&a_{n,2}&\dots&a_{n,n}&\mid&a_{n,n+1}\end{bmatrix} \]

實際上就是把各項係數和常數項拎出來而已。

接下來我們需要一個消元的方法。

首先考慮消掉第一元。

將第二行的所有數跟第一行的所有數進行加減消元,將後面行的第一個主元係數化為 0。

這樣就變成了這樣:

\[\begin{bmatrix}?&?&\dots&?&\mid&?\\0&?&\dots&?&\mid&?\\\vdots&\vdots&\ddots&\vdots&\mid&?\\0&?&\dots&?&\mid&?\end{bmatrix} \]

如果 \(n=4\),那就是這樣的:

\[\begin{bmatrix}?&?&?&?&|&?\\0&?&?&?&|&?\\0&?&?&?&|&?\\0&?&?&?&|&?\end{bmatrix} \]

然後考慮在後面 3 行裡面加減消元消掉第二個主元,保留 3,4 兩行,這樣方程組就變成了這樣:

\[\begin{bmatrix}?&?&?&?&|&?\\0&?&?&?&|&?\\0&0&?&?&|&?\\0&0&?&?&|&?\end{bmatrix} \]

最後消掉第 3 個主元,就是這樣的:

\[\begin{bmatrix}?&?&?&?&|&?\\0&?&?&?&|&?\\0&0&?&?&|&?\\0&0&0&?&|&?\end{bmatrix} \]

此時我們發現最後一行已經可以解出最後一個主元的解了,那麼解出來。

然後不斷向上反代即可。

這個圖很像三角形對不對?

3. 高斯-約旦消元法

高斯消元法中我們採用瞭解出最後一個主元然後向上反代的過程解方程組。

但是實際上還有一種更加簡潔的不用反代的方法,叫做高斯-約旦消元法。

首先還是看最後這個方程組:

\[\begin{bmatrix}?&?&?&?&|&?\\0&?&?&?&|&?\\0&0&?&?&|&?\\0&0&0&?&|&?\end{bmatrix} \]

這個時候我們發現,實際上對於第一行的後面 3 個主元,其可以跟第 2 行的主元加減消元消掉。

因此方程組就變成了這樣:

\[\begin{bmatrix}?&0&0&0&|&?\\0&?&?&?&|&?\\0&0&?&?&|&?\\0&0&0&?&|&?\end{bmatrix} \]

不斷消元,最後就變成了這樣:

\[\begin{bmatrix}?&0&0&0&|&?\\0&?&0&0&|&?\\0&0&?&0&|&?\\0&0&0&?&|&?\end{bmatrix} \]

直接解就可以了。

這個圖就是一條對角線。


上面考慮的都是有唯一解的情況,那麼沒有唯一解的情況呢?

沒有唯一解分兩種:無限多組解和根本沒有解。

考慮一個一元一次方程 \(ax=b\) 的解的幾種情況:

  • 根本沒有解:\(a=0,b \ne 0\)
  • 無限多組解:\(a=b=0\)
  • 只有唯一解:\(a \ne 0\)

因此我們可以根據這幾個情況來判斷方程組到底有沒有解,有幾組解。

在採用高斯-約旦消元法後,我們得到了 \(n\) 個一元一次方程,根據上述法則判斷即可。

特別提醒:無解情況一定要在無限多組解之前算完!

模板題的程式碼(高斯-約旦消元法):GitHub CodeBase-of-Plozia P2455 [SDOI2006]線性方程組.cpp

4. 總結

  • 高斯消元法:將方程組消元成三角形形式。
  • 高斯-約旦消元法:將方程組消元成對角線形式。