高斯消去法

}}

高斯消去法（Gaussian Elimination）是線性代數中的一個演算法，可以把矩陣轉化為行階梯形矩陣。高斯消去法可用來為線性方程組求解，求出矩陣的秩，以及求出可逆方陣的逆矩陣。

歷史

高斯消去法最早出現在中國數學典籍《九章算術》第八章〈方陣〉中，儘管書中未對其提供正式的證明。該方法在十八道題目中有所應用，處理的聯立方程組數量介於二至五個之間。根據歷史記載，此書最早的確切引用可追溯至公元 179 年，但其中部分內容可能早在公元前 150 年左右便已撰寫完成。到了三世紀，劉徽為其作註解。

根據 Grcar 的研究，透過消去法求解線性方程組的概念在歐亞大陸的多個文化中獨立發展，最早可追溯至古代。在歐洲，文藝復興晚期（16 世紀 50 年代）便已有明確記載該方法的應用。當時，數學家可能已將其視為基礎知識，因此未特意加以說明，這也使得我們難以確切還原其詳細的發展歷程，僅能確定該方法在當時的歐洲多個地區已被廣泛使用。

在歐洲，高斯消去法的發展可追溯至艾薩克・牛頓的筆記。 1670 年，牛頓指出，他所知的代數書籍中皆缺少求解聯立方程組的相關內容，於是他親自補充了這一部分。劍橋大學最終於 1707 年出版了這些筆記，書名為《》，當時牛頓已經離開學術界。該書的內容被廣泛仿效，使得（現今所稱的）高斯消去法在 18 世紀末成為代數教科書中的標準課程。 1810 年，卡爾・高斯設計了一種用於對稱消去的記號，並在 19 世紀被專業計算員採用，以求解最小二乘問題的法方程。然而，直到 1950 年代，由於對該方法歷史的誤解，這一演演算法才被命名為「高斯消去法」。

部分學者將「高斯消去法」僅用於指將矩陣化為梯形（階梯）形式的過程，而將「高斯－約旦消去法」用於指將矩陣進一步化為簡化梯形（最簡）形式的完整過程。之所以使用這一名稱，是因為該方法是高斯消去法的變體，由於 1888 年加以描述。然而，同一年克拉森（Clasen）發表的文章中也提出了這種方法，因此喬丹與克拉森很可能是獨立發現高斯－約旦消去法的。

例子

高斯消去法可用來找出下列方程組的解或其解的限制：

這個演算法的原理是：

首先，要將以下的等式中的消除，然後再將以下的等式中的消除。這樣可使整個方程組變成一個三角形似的格式。之後再將已得出的答案一個個地代入已被簡化的等式中的未知數中，就可求出其餘的答案了。

在剛才的例子中，我們將和相加，就可以將中的消除了。然後再將和相加，就可以將中的消除。

我們可以這樣寫：

結果就是：

現在將和相加，就可將中的消除：

其結果是：

這樣就完成了整個演算法的初步，一個三角形的格式（指：變數的格式而言，上例中的變數各為 3,2,1 個）出現了。

第二步，就是由尾至頭地將已知的答案代入其他等式中的未知數。第一個答案就是：

然後就可以將代入中，立即就可得出第二個答案：

之後，將和代入之中，最後一個答案就出來了：

就是這樣，這個方程組就被高斯消去法解決了。

這種演算法可以用來解決所有線性方程組。即使一個方程組不能被化為一個三角形的格式，高斯消去法仍可找出它的解。例如，如果在第一步化簡後，及中沒有出現任何，沒有三角形的格式，照著高斯消去法而產生的格式仍是一個行階梯形矩陣。這情況之下，這個方程組會有超過一個解，當中會有至少一個變數作為答案。每當變數被鎖定，就會出現一個解。

通常人或電腦在應用高斯消去法的時候，不會直接寫出方程組的等式來消去未知數，反而會使用矩陣來計算。以下就是使用矩陣來計算的例子：

跟著以上的方法來運算，這個矩陣可以轉變為以下的樣子：

這矩陣叫做「行階梯形矩陣」。

最後，可以利用同樣的演算法產生以下的矩陣，便可把所得出的解或其限制簡明地表示出來：

最後這矩陣叫做「簡化行階梯形矩陣」，亦是高斯 - 若爾當消元法指定的步驟。

分析

高斯消去法的演算法複雜度是 O (n3)；這就是說，如果系數矩陣的是 n × n，那麼高斯消去法所需要的計算量大約與 n3 成比例。

高斯消去法可以用在電腦中來解決數千條等式及未知數。不過，如果有過百萬條等式時，這個演算法會十分費時。一些極大的方程組通常會用迭代法來解決。亦有一些方法特地用來解決一些有特別排列的係數的方程組。

高斯消去法可用在任何域中。

高斯消去法對於一些矩陣來說是穩定的。對於普遍的矩陣來說，高斯消去法在應用上通常也是穩定的，不過亦有例外。

虛擬碼

高斯消去法的其中一種虛擬碼：

i = 1

j = 1

while (i ≤ m and j ≤ n) do

Find pivot in column j, starting in row i // 從第 i 行 (row) 開始，找出第 j 列 (column) 中的最大值（i、j 值應保持不變） #臺灣與大陸的列、行定義相反。臺灣列為 row 行為 column，大陸列為 column 行為 row。

maxi = i

for k = i+1 to m do

if abs (Ak,j) > abs (Amaxi,j) then

maxi = k // 使用交換法找出最大值（絕對值最大）

end if

end for

if Amaxi,j ≠ 0 then // 判定找到的絕對值最大值是否為零：若不為零就進行以下操作；若為零則說明該列第 (i+1) 列以下（包括第 (i+1) 列）均為零，不需要再處理，直接跳轉至第 (j+1) 行第 (i+1) 列

swap rows i and maxi, but do not change the value of i // 將第 i 行與找到的最大值所在行做交換，保持 i 值不變（i 值記錄了本次操作的起始行）

Now Ai,j will contain the old value of Amaxi,j.

divide each entry in row i by Ai,j // 將交換後的第 i 列歸一化（第 i 列所有元素分別除以 Ai,j）

Now Ai,j will have the value 1.

for u = i+1 to m do // 第 j 行中，第 (i+1) 列以下（包括第 (i+1) 列）所有元素都減去 Ai,j，直到第 j 行的 i+1 列以後元素均為零

subtract Au,j * row i from row u

Now Au,j will be 0, since Au,j - Ai,j Au,j = Au,j - 1 Au,j = 0.

end for

i = i + 1

end if

j = j + 1 // 第 j 行中，第 (i+1) 列以下（包括第 (i+1) 列）所有元素均為零。移至第 (j+1) 行，從第 (i+1) 列開始重複上述步驟。

end while

這個演算法和之前談到的有點不同，它由絕對值最大的部分開始做起，這樣可以改善演算法的穩定性。本演算法由左至右地計算，每作出以下三個步驟，才跳到下一行和下一列：

定出每行的絕對值最大的一個非 0 的數，將第一列的值與該列交換，使得第一列擁有這一行的最大值；
將第一行的數字除以該數，使得該列的第一個數成為 1；
對每一列減去第一列乘以每一列的第一個數，使得每一列的第一個數變為 0。

所有步驟完成後，這個矩陣會變成一個行階梯形矩陣，再用代入法就可以求解該方程組。

隨著多核處理器的日益普及，現在的程式設計師可以利用執行緒級並行高斯消元演算法來提高計算的速度。記憶體共享模式（而不是訊息交換模式）的虛擬碼如下所示：

void parallel (int numthreads,int matrixdimension)

{

	int i;

	for (i=0; ibarrier_mutex));

	mybarrier->cur_count++;

	if (mybarrier->curcount!=numthread)

		pthreadcondwait (&(mybarrier->barriercond),&(mybarrier->barriermutex));

	else

	{mybarrier->cur_count=0;

		pthreadcondbroadcast (&(mybarrier->barrier_cond));

	}

	pthreadmutexunlock (&(mybarrier->barrier_mutex));

}