先來安利乙個部落格 高斯消元 & 線性基【學習筆記】
本文就講了最基礎的高斯消元,高斯消元的擴充套件應用可以看上面的那個呀w
高斯消元是用來解線性方程組的。所謂線性方程組,就是一次方程組。
對於解這個一般的線性方程組,求xi
:
a11 * x1 + a12 * x2 + ... + a1n * xn = b1
a21 * x1 + a22 * x2 + ... + a2n * xn = b2
...an1 * x1 + an2 * x2 + ... + ann * xn = bn
同時,我們順便定義一下矩陣乘法。設a
為m * p
的矩陣,b
為p * n
的矩陣,那麼稱m * n
的矩陣c
為矩陣a
與b
的乘積,那麼有 (a
×b)i
j=∑p
k=1a
ikbk
j 。
從這裡得到啟發,可以定義係數矩陣、未知數矩陣以及等式右邊的常數矩陣
a 、x和
b 。那麼根據矩陣乘法,我們可以將這一共 n 個等式極為簡單地描述為乙個等式,即 ax
我們將上述矩陣變為增廣矩陣:
我們需要乙個n
行n + 1
列的陣列來存
多出來那一列就是常數矩陣 b
–
for (int j = i + 1; j
<= n; j ++)
這是用第i
個方程去消第i + 1 ~ n
個方程,通過調整第i
個未知數的係數,來消掉後面那些方程中的這個第i
個未知數
所以double t = m[j][i] / m[i][i];
除的是m[i][i]
。
j
是要被消的方程,k
是被消的方程的第幾項
舉個例子比如n = 3
時:
a11 * x1 + a12 * x2 + a13 * x3 = b1
a22 * x2 + a23 * x3 = b2
a33 * x3 = b3
–消完以後,矩陣變成這樣的上三角矩陣:
(用最右邊應該還有一列常數項,注意常數項也要消元
然後直接回代即可。從下往上迴圈,每一次可以確定乙個變數,然後將其上面的所有行給代進去,將相應的係數變成 0,方程式右邊的常數項也相應地減去相應的量。
接著上面的那個例子:
a11 * x1 + a12 * x2 + a13 * x3 = b1
a22 * x2 + a23 * x3 = b2
a33 * x3 = b3
這時候可以解出x3
,然後帶到前面的每個方程裡,就變成:
a11 * x1 + a12 * x1 = b1 - x3 * a13
a22 * x2 = b2 - x3 * a23
然後解出x2
,繼續做下去
最終就全解出來了
for (int i = n; i >= 1; i --)
}
這就是帶回去的過程
最終m[i][n]
就是第i
個未知數的解,因為第i
個方程是xi = k
的形式
–
int k = i;
for (int j = i + 1; i
<= n; i ++)
if (fabs(m[j]
[i]) > fabs(m[k]
[i])) k = j;
if (k != i) for (int j = i; j
<= n + 1; j ++) swap(m[i]
[j], m[k]
[j]);
這段是找當前項(當前列)係數絕對值最大的乙個方程,並與當前行交換,可以保證精度,在消元的時候把浮點數的誤差降到最小。
–
這就是高斯消元法。其的時間複雜度其實是相當好估計的。每一次先選擇兩行,再將這兩行開始消元,於是每一次消元需要列舉每乙個矩陣中的變數,所以就是 o(
n2m)
,是立方級的。
inline
void gauss(int n)
}for (int i = n; i >= 1; i --) }}
高斯消元學習筆記
數學上,高斯消元法 英語 gaussian elimination 是線性代數中的乙個演算法,可用來為線性方程組求解,求出矩陣的秩,以及求出可逆方陣的逆矩陣。當用於乙個矩陣時,高斯消元法會產生出乙個行梯陣式。以上引自維基百科。我們可以把乙個 n 元 1 次方程表示成乙個 n 行 n 1 列的矩陣 矩...
高斯消元學習筆記
高斯消元是一種用來求解線性方程組 多元一次方程組 的演算法。假設我們現在需要求解乙個n元一次方程 begin a x 1 a x 2 a x n b 1 a x 1 a x 2 a x n b 2 vdots a x 1 a x 2 a x n b n end 把係數存下來。begina a cdo...
數論 高斯消元學習筆記
q 高斯消元是什麼?聽起來好高階啊?a 二元一次方程組解過嗎?那就是高斯消元。首先對高斯消元做一些準備 q 什麼是線性方程組?a 雞兔同籠方程組 由 m 個 n 元一次方程所構成的方程組。為了簡化表達,做出如下定義 example 假如現有一方程組 beginx 1 x 2 4x 3 17 5x 1...