高斯消元法可以求線性方程組。本質上是暴力模擬手算的過程。
3 x+2 y+z=10 \\ 5 x+y+6 z=25 \\ 2 x+3 y+4 z=20 \end\right.
⎩⎨⎧3x
+2y+
z=10
5x+y
+6z=
252x
+3y+
4z=2
0手算的過程為第乙個與第二個方程抵消,第二個與第三個抵消。得到乙個元二次方程組在經過類似步驟得到解。其中運用了三個小學性質
兩個方程互換解不變。
乙個方程乘以非零數解不變。
一方程加上另乙個方程,解不變。
至於高斯消元法,先將 n
nn 元一次方程寫成 n×(
n+1)
n \times (n + 1)
n×(n+1
) 的矩陣,可以任意交換它的行和左邊 n
nn 列,也將一行加到另一行,將一行乘上非零數。
\left\ 3 & 2 & 1 & 10 \\ 5 & 1 & 6 & 25 \\ 2 & 3 & 4 & 20 \end\right\}
⎩⎨⎧35
221
316
410
2520
⎭⎬⎫
高斯消元法將矩陣消成前 n
nn 列對角線上元素為 1
11 其它為 0
00 的單位矩陣。第 n+1
n + 1
n+1 列為方程的解。
\left\ 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 2 \\ 0 & 0 & 1 & 3 \end\right\}
⎩⎨⎧10
001
000
112
3⎭⎬
⎫x = 1 \\ y = 2 \\ z = 3 \end\right.
⎩⎨⎧x=
1y=2
z=3
從方程的意義上,乙個未知數的係數至少有乙個不為 0
00,那麼矩陣上為一列中至少乙個元素不為 0
00 否則方程無解,所以先判斷無解,並將每一列的非零數所在的行移動到對角線上。
for
(int i =
1; i <= n; i++
)for
(int j =
1; j <= n +
1; j++
)swap
(a[i]
[j], a[p]
[j])
;}
因為要讓對角線全為 1
11 所以對每一行除上乙個數,讓這一行對角線位的元素為 1
11。這樣會出現小數,所以陣列的型別是double
。
double x = a[i]
[i];
//a[i][i] 會被更新所以用變數儲存
for(
int j =
1; j <= n +
1; j++
) a[i]
[j]/
= x;
再將前 n
nn 列其它的元素搞成 0
00。ai,
ia_
ai,i
的係數消成了 1
11 要好好利用,將其它行的第 i
ii 個未知數通過 ai,
ja_
ai,j
消到 000。
#include
using
namespace std;
const
int n =
300, inf =
0x3f3f3f3f
;inline
intread()
double a[n]
[n];
intmain()
for(
int j =
1; j <= n +
1; j++
)swap
(a[i]
[j], a[p]
[j])
;double x = a[i]
[i];
for(
int j =
1; j <= n +
1; j++
) a[i]
[j]/
= x;
for(
int j =
1; j <= n; j++)if
(i != j)
}for
(int i =
1; i <= n; i++
)printf
("%.2lf\n"
, a[i]
[n +1]
);return0;
}
可以發現高斯消元法有點暴力的成分,時間複雜度為 o(n
3)
o(n^3)
o(n3)。
模板題 gym 100644h 配平化學方程式 cf113d museum。
Gauss 高斯消元
ans 直接用初中的解方程組的方法呀!沒錯,直接暴力加減消元。那什麼是 高斯消元 說白了,就是普通的加減消元罷了。本人再考場上打了乙個暴力解方程,大家都說要高斯消元,弄得我方極了,最後才發現我打的暴力就是高斯消元 選其中乙個方程 將其他方程的其中乙個元與選出的方程統一係數 將選出的方程與其他方程相減...
被學長教會的高斯消元法Gauss
昨天學長教了我高斯消元法。這裡用乙個栗子來模擬一下gauss的流程。真的通俗易懂!這裡是洛谷題目鏈結。這就是例子 x 2y 3z 6 4x 5y 6z 12 7x 8y 10z 21 先將它轉化為矩陣 1 236 4 5612 7 8 1021 解決這個方程組 我們會希望它變成如下形式 100 a0...
高斯消元法(二) 高斯消元法原理
高斯消去法是一種常用的求解線性方程組的方法,通過逐次消元後,在回代求解,實際計算中常用的一種方法。順序消去法 將ax b按照從上至下 從左至右的順序化為上三角方程組,中間過程不對矩陣進行交換,主要步驟如下。step1 將第2行至第n行,每行分別與第一行做運算,消掉每行第乙個引數。公式如 形成如下圖所...