浅谈高斯消元法

· · 算法·理论

高斯消元法

1.介绍

高斯消元,用于求解mn元一次方程组成的方程组。

2.操作

我们可以将一个线性方程组写成一个 mn+1 列的增广矩阵。

\begin{cases} & a_{1,1}x_1+a_{1,2}x_2+a_{1,3}x_3+ ... + a_{1,n}x_n=b_1 \\ & a_{2,1}x_1+a_{2,2}x_2+a_{2,3}x_3+ ... + a_{2,n}x_n=b_2\\ & a_{3,1}x_1+a_{3,2}x_2+a_{3,3}x_3+ ... + a_{3,n}x_n=b_3\\ & ...\\ & a_{m,1}x_1+a_{m,2}x_2+a_{m,3}x_3+ ... + a_{m,n}x_n=b_m\\ \end{cases} \Longrightarrow \begin{bmatrix} & a_{1,1}x_1& a_{1,2}x_2& a_{1,3}x_3 & ...& a_{1,n}x_n& b_1 \\ & a_{2,1}x_1& a_{2,2}x_2&a_{2,3}x_3 & ... & a_{2,n}x_n &b_2\\ & a_{3,1}x_1 &a_{3,2}x_2& a_{3,3}x_3& ...& a_{3,n}x_n &b_3\\ & ...\\ & a_{m,1}x_1& a_{m,2}x_2 &a_{m,3}x_3 &... & a_{m,n}x_n &b_m\\ \end{bmatrix} \\

同时,我们定义矩阵的初等行变换:

我们可以对增广矩阵进行若干次初等行变换来求解方程组:

\text{如} \begin{bmatrix} &1&2&−1&−6 \\ &2&1&−3&−9\\ &−1&−1&2&7\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1 &2 &−1 &−6\\ 0 &−3 &−1 &3\\ −1 &−1& 2&7\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1& 2& −1 &−6\\ 0 &−3 &−1 &3\\ 0 &1 &1 &1\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1& 2& −1&−6\\ 0 &2&1 &1 &1\\ 0 &−3& −1& 3\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1& 2 &−1& −6\\ 0 &1& 1& 1\\ 0 &0 &2 &6\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1 &2 &−1 &−6\\ 0 &1 &1& 1\\ 0 &0& 1 &3\\ \end{bmatrix}

实际上矩阵还可以继续化简:

\begin{bmatrix} 1 &2 &−1 &−6\\ 0 &1 &1& 1\\ 0 &0& 1 &3\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1 &2 &0 &−3\\ 0 &1 &0& -2\\ 0 &0& 1 &3\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1 &0 &0 &1\\ 0 &1 &0& -2\\ 0 &0& 1 &3\\ \end{bmatrix}

像这样通过初等行变换,把增广矩阵变为阶梯型矩阵就是高斯消 元算法。该算法的思想是,对于每一个未知量 x_i,找到一个 x_i 系数不 为零但是 x_1 ... x_{i−1} 系数都为零的方程,利用该方程通过初等行变换把其 它方程的 x_i 系数全部消成 0

高斯消元

其中,若把增广矩阵转化为行梯阵式,如

\begin{bmatrix} 1 &2 &−1 &−6\\ 0 &1 &1& 1\\ 0 &0& 1 &3\\ \end{bmatrix}$这样的形式,我们通常称之为**高斯消元**。 ### 高斯-约旦消元 而若把增广矩阵转化为简化行梯阵式,如

\begin{bmatrix} 1 &0 &0 &1\ 0 &1 &0& -2\ 0 &0& 1 &3\ \end{bmatrix}

### 不同之处 两者不同之处在于最终转化的形式不同,导致**高斯消元**最后还多了一步步骤——要将一个最后的解从下至上回代(把解的值代回上一个方程从而求解),如

\begin{bmatrix} 1 &2 &−1 &−6\ 0 &1 &1& 1\ 0 &0& 1 &3\ \end{bmatrix}的意义是\begin{cases} &x_1+2x_2+(-1)x_3=-6\ &x_2+x_3=1\ &x_3=3\ \end{cases},最后我们需要将x_3=6代回x_2+x_3=6这个方程,从而求解出x_2=-2,再把\begin{cases} &x_2=3\ &x_3=-2\ \end{cases}

代回$x_1=2x_2+(-1)x_3=-6$,进一步求解出$x_1=1

3. 有解、无解、无数个解

无解

在高斯消元的过程中,有可能会出现 0=d 这样的方程,其中 d 是一 个非零常量。出现这种情况则意味着方程无解

无数个解

其次,有可能找不到 x_i 系数不为零的方程。例如:

\begin{bmatrix} 1 &2& −1& 3\\ 2 &4& −8& 0\\ −1 &−2 &6& 2\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1 &2 &−1& 3\\ 0 &0& −6 &−6\\ 0 &0 &5 &5\\ \end{bmatrix} \Longrightarrow \begin{bmatrix} 1 &2 &0& 4\\ 0 &0 &1 &1\\ 0 &0& 0& 0\\ \end{bmatrix}

在这个例子中找不到 x_2 系数为 0 的方程,解可以写为

\begin{cases} & x_1=4-2x_2\\ & x_3=1\\ \end{cases}

不论x_2取任何值,都可以求出对应的 x_1,也就是方程组有无穷多的解。这种情况下,我们把 x_1, x_3 称为主元,把 x_2 称为自由元。

判断

可以发现,在最后的阶梯型系数矩阵中(即高斯-约旦消元后的简化行梯阵式),每个主元仅仅在一个位置上 的系数 (i,j) 非零,且第 i 行、第 j 列其他位置都为 0

注意,在判断此处的时候,一定是先判断是否无解再判断是否有无数个解,例如:

\begin{bmatrix} 1 & 0& 0 &5\\ 0 & 0 &0 &0\\ 0 &0 & 0 &2\\ \end{bmatrix}

我们如果先判断存在自由元为无数个解,那么我们极可能容易忽略接下来的线性方程自由元是否存在,即无解的情况。

4.代码实现

时间复杂度为O(N^3)

5.高斯消元法的拓展使用

异或方程组