高斯消元法(Gaussian Elimination)是求解线性方程组最基本的方法,通过初等行变换将增广矩阵化为行阶梯形或行最简形,从而求出方程组的解。
线性方程组 A x = b Ax = b A x = b 的增广矩阵为:
( A ∣ b ) = ( a 11 a 12 ⋯ a 1 n b 1 a 21 a 22 ⋯ a 2 n b 2 ⋮ ⋮ ⋱ ⋮ ⋮ a m 1 a m 2 ⋯ a m n b m ) (A | b) = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\ a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} & b_m \end{pmatrix} ( A ∣ b ) = a 11 a 21 ⋮ a m 1 a 12 a 22 ⋮ a m 2 ⋯ ⋯ ⋱ ⋯ a 1 n a 2 n ⋮ a mn b 1 b 2 ⋮ b m
对增广矩阵施行初等行变换,不改变方程组的解集。
矩阵称为行阶梯形 (Row Echelon Form, REF),若满足:
零行(元素全为零的行)位于矩阵底部
每个非零行的首非零元(主元)的列标严格递增
主元下方的元素全为零
示例 :
( 2 3 1 4 0 1 2 5 0 0 3 6 0 0 0 0 ) \begin{pmatrix} \boxed{2} & 3 & 1 & 4 \\ 0 & \boxed{1} & 2 & 5 \\ 0 & 0 & \boxed{3} & 6 \\ 0 & 0 & 0 & 0 \end{pmatrix} 2 0 0 0 3 1 0 0 1 2 3 0 4 5 6 0
其中 \boxed{} 标记的是主元。
行阶梯形进一步满足:
每个主元为 1 1 1
每个主元所在列的其他元素全为 0 0 0
称为行最简形 (Reduced Row Echelon Form, RREF)。
示例 :
( 1 0 0 1 0 1 0 1 0 0 1 2 0 0 0 0 ) \begin{pmatrix} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 2 \\ 0 & 0 & 0 & 0 \end{pmatrix} 1 0 0 0 0 1 0 0 0 0 1 0 1 1 2 0
步骤 :
选取第一列中非零元素作为主元(若第一列全为零,则看第二列)
若需要,交换行使主元位于第一行
用主元消去其下方所有元素
对右下角的子矩阵重复上述过程
示例 :解方程组 { x 1 + 2 x 2 + x 3 = 2 2 x 1 + 5 x 2 + 3 x 3 = 7 x 1 + 3 x 2 + 3 x 3 = 5 \begin{cases} x_1 + 2x_2 + x_3 = 2 \\ 2x_1 + 5x_2 + 3x_3 = 7 \\ x_1 + 3x_2 + 3x_3 = 5 \end{cases} ⎩ ⎨ ⎧ x 1 + 2 x 2 + x 3 = 2 2 x 1 + 5 x 2 + 3 x 3 = 7 x 1 + 3 x 2 + 3 x 3 = 5
增广矩阵:
( 1 2 1 2 2 5 3 7 1 3 3 5 ) \begin{pmatrix} 1 & 2 & 1 & 2 \\ 2 & 5 & 3 & 7 \\ 1 & 3 & 3 & 5 \end{pmatrix} 1 2 1 2 5 3 1 3 3 2 7 5
→ r 2 − 2 r 1 , r 3 − r 1 ( 1 2 1 2 0 1 1 3 0 1 2 3 ) \xrightarrow{r_2 - 2r_1, r_3 - r_1} \begin{pmatrix} 1 & 2 & 1 & 2 \\ 0 & 1 & 1 & 3 \\ 0 & 1 & 2 & 3 \end{pmatrix} r 2 − 2 r 1 , r 3 − r 1 1 0 0 2 1 1 1 1 2 2 3 3
→ r 3 − r 2 ( 1 2 1 2 0 1 1 3 0 0 1 0 ) \xrightarrow{r_3 - r_2} \begin{pmatrix} 1 & 2 & 1 & 2 \\ 0 & 1 & 1 & 3 \\ 0 & 0 & 1 & 0 \end{pmatrix} r 3 − r 2 1 0 0 2 1 0 1 1 1 2 3 0
从最后一个非零行开始,逐步回代求出各未知量。
由行阶梯形:
{ x 1 + 2 x 2 + x 3 = 2 x 2 + x 3 = 3 x 3 = 0 \begin{cases} x_1 + 2x_2 + x_3 = 2 \\ x_2 + x_3 = 3 \\ x_3 = 0 \end{cases} ⎩ ⎨ ⎧ x 1 + 2 x 2 + x 3 = 2 x 2 + x 3 = 3 x 3 = 0
回代:x 3 = 0 x_3 = 0 x 3 = 0 ,x 2 = 3 − 0 = 3 x_2 = 3 - 0 = 3 x 2 = 3 − 0 = 3 ,x 1 = 2 − 6 − 0 = − 4 x_1 = 2 - 6 - 0 = -4 x 1 = 2 − 6 − 0 = − 4 。
解为 x 1 = − 4 , x 2 = 3 , x 3 = 0 x_1 = -4, x_2 = 3, x_3 = 0 x 1 = − 4 , x 2 = 3 , x 3 = 0 。
继续消元,将主元上方的元素也消为零:
( 1 2 1 2 0 1 1 3 0 0 1 0 ) → r 2 − r 3 , r 1 − r 3 ( 1 2 0 2 0 1 0 3 0 0 1 0 ) → r 1 − 2 r 2 ( 1 0 0 − 4 0 1 0 3 0 0 1 0 ) \begin{pmatrix} 1 & 2 & 1 & 2 \\ 0 & 1 & 1 & 3 \\ 0 & 0 & 1 & 0 \end{pmatrix} \xrightarrow{r_2 - r_3, r_1 - r_3} \begin{pmatrix} 1 & 2 & 0 & 2 \\ 0 & 1 & 0 & 3 \\ 0 & 0 & 1 & 0 \end{pmatrix} \xrightarrow{r_1 - 2r_2} \begin{pmatrix} 1 & 0 & 0 & -4 \\ 0 & 1 & 0 & 3 \\ 0 & 0 & 1 & 0 \end{pmatrix} 1 0 0 2 1 0 1 1 1 2 3 0 r 2 − r 3 , r 1 − r 3 1 0 0 2 1 0 0 0 1 2 3 0 r 1 − 2 r 2 1 0 0 0 1 0 0 0 1 − 4 3 0
直接读出解:x 1 = − 4 , x 2 = 3 , x 3 = 0 x_1 = -4, x_2 = 3, x_3 = 0 x 1 = − 4 , x 2 = 3 , x 3 = 0 。
在每一步消元中,选取当前列中绝对值最大的元素作为主元,交换行使之到达主元位置。
目的 :减少舍入误差的传播,提高数值稳定性。
在剩余子矩阵中选取绝对值最大的元素作为主元,可能需要同时交换行和列。
优点 :数值稳定性最好。
缺点 :计算量增大,且列交换需要记录未知量的顺序。
不选主元时,若主元非常小,消元过程中会产生大数,导致严重的舍入误差。
示例 :
{ 0.001 x 1 + x 2 = 1 x 1 + x 2 = 2 \begin{cases} 0.001x_1 + x_2 = 1 \\ x_1 + x_2 = 2 \end{cases} { 0.001 x 1 + x 2 = 1 x 1 + x 2 = 2
不选主元:r 2 − 1000 r 1 r_2 - 1000r_1 r 2 − 1000 r 1 ,会产生大系数,增大误差。
选主元:交换两行后消元,数值更稳定。
前向消元:O ( n 3 / 3 ) O(n^3/3) O ( n 3 /3 ) 次乘除法
回代过程:O ( n 2 / 2 ) O(n^2/2) O ( n 2 /2 ) 次乘除法
总计:O ( n 3 ) O(n^3) O ( n 3 )
方法 计算量 克莱姆法则 O ( n ⋅ n ! ) O(n \cdot n!) O ( n ⋅ n !) 高斯消元法 O ( n 3 ) O(n^3) O ( n 3 )
高斯消元法远比克莱姆法则高效。
for k = 1 to n-1:
// 选主元
找到第k列中 |a_{ik}| 最大的行 i_max (i >= k)
交换第k行和第i_max行
// 消元
for i = k+1 to m:
factor = a_{ik} / a_{kk}
for j = k to n+1:
a_{ij} = a_{ij} - factor * a_{kj}
主元为零或接近零时需要特殊处理
浮点运算中要注意数值稳定性
稀疏矩阵可以使用特殊存储格式加速