高消一直是acm中高層次經常用到的演算法,雖然線性代數已經學過,但高消求解的問題模型及高消模板的應用變化是高消的最複雜之處。
先介紹一下高消的基本原理:引入網際網路czyuan的帖子:
高斯消元法,是線性代數中的乙個演算法,可用來求解線性方程組,並可以求出矩陣的秩,以及求出可逆方陣的逆矩陣。
高斯消元法的原理是:
若用初等行變換將增廣矩陣 化為 ,則ax = b與cx = d是同解方程組。
所以我們可以用初等行變換把增廣矩陣轉換為行階梯陣,然後回代求出方程的解。
以上是線性代數課的回顧,下面來說說高斯消元法在程式設計中的應用。
首先,先介紹程式中高斯消元法的步驟:
(我們設方程組中方程的個數為equ,變元的個數為var,注意:一般情況下是n個方程,n個變元,但是有些題目就故意讓方程數與變元數不同)
1. 把方程組轉換成增廣矩陣。
2. 利用初等行變換來把增廣矩陣轉換成行階梯陣。
列舉k從0到equ – 1,當前處理的列為col(初始為0) ,每次找第k行以下(包括第k行),col列中元素絕對值最大的列與第k行交換。如果col列中的元素全為0,那麼則處理col + 1列,k不變。
3. 轉換為行階梯陣,判斷解的情況。
① 無解
當方程中出現(0, 0, …, 0, a)的形式,且a != 0時,說明是無解的。
② 唯一解
條件是k = equ,即行階梯陣形成了嚴格的上三角陣。利用回代逐一求出解集。
③ 無窮解。
條件是k
< equ,即不能形成嚴格的上三角形,自由變元的個數即為equ – k,但有些題目要求判斷哪些變元是不缺定的。
這裡單獨介紹下這種解法:
首先,自由變元有var - k個,即不確定的變元至少有var - k個。我們先把所有的變元視為不確定的。在每個方程中判斷不確定變元的個數,如果大於1個,則該方程無法求解。如果只有1個變元,那麼該變元即可求出,即為確定變元。
以上介紹的是求解整數線性方程組的求法,複雜度是o(n3)。浮點數線性方程組的求法類似,但是要在判斷是否為0時,加入eps,以消除精度問題。
以上czyuan帖子的基本原理就介紹完了。
--------------------------我對上面的步驟做一下說明
-------------------------------------------
高斯消元求解的詳細步驟:
1) 不用說了,對增廣矩陣先消元,化為行階梯矩陣。
很多人認為這就行了,但有時存在如下情況:
1 2
3 4 30
1 2 3 3
0 0
0 1 20
0 0 0 0
消元後的矩陣化為行階梯,上面主對角線元素的主元並沒有連續,還應將第4
列和第3
列交換才行。
這是網路上很多的模板所沒有的,也是造成關鍵時候出錯的根源所在。
所以模板還要增加對列進行檢查的**。
2) 消元完成後,判斷是否有解,分三種,無解,有1
個解和有無窮多解。
3) 對於有唯一解和有無窮多解的時候,都要回帶。
啥是回帶? 詳細說明之。
1 2
3 4
3 1
2 4 3 3
0 1
2 3
3 0
1 3 2 3
0 0
0 1
2--------》
0 0
1 0
2 ------
》消元後的矩陣
------
發現有無窮解 0
0 0
0 0
0 0
0 0
0(行階梯)
(交換列)
因為4個變數,才3行,
4-3=1> 0
,有無窮多解啊。
如果第4
行不都是
0,回帶可以求出這個唯一解。如下:
x1 x2 x3
x4 b1
0 x2
x3 x4
b20
0 x3
x4 b3
0 0
0 x4
b4最後1
行,有x4=b4; 第3
行: x4+x3=b3,
已經求出
x4=b4
了,帶入第
3行,可求出
x3;同理,把
x4 x3
帶入第2
行,還可求出
x2;把
x4 x3
x2 帶入到第
1行,可求出
x1;
這就是回帶。
回帶總結:從最後1
行,逐一往回帶,從最後
1行代回到第1行。
最關鍵的時候到了:當無窮多解時,最後幾行都是0
;沒法回帶;而某些題目在無窮多解時還要你求最小或最優解,沒辦法,就得列舉最後行為
0的那幾個解; 如:
1 2 4 3 3
0 1
3 2 30
0 1
0 2 0
0 0 0 0
可見最後的x4
沒法解,如果題中給定
x4的範圍,那就列舉
x4,然後回帶;列舉1次
x4就回帶
1次得到一組(
x1 x2
x3 x4 );
然後根據題意找最優的,具體題目具體分析。
高斯消元法(二) 高斯消元法原理
高斯消去法是一種常用的求解線性方程組的方法,通過逐次消元後,在回代求解,實際計算中常用的一種方法。順序消去法 將ax b按照從上至下 從左至右的順序化為上三角方程組,中間過程不對矩陣進行交換,主要步驟如下。step1 將第2行至第n行,每行分別與第一行做運算,消掉每行第乙個引數。公式如 形成如下圖所...
高斯消元 浮點高斯消元
浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...
矩陣消元 高斯消元
安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 include define n 205 using...