ガウスの消去法

**ガウスの消去法**（ガウスのしょうきょほう、）あるいは**掃き出し法**（はきだしほう、）とは、連立一次方程式を解くための多項式時間アルゴリズムであり、通常は問題となる連立一次方程式の係数からなる拡大係数行列に対して行われる一連の変形操作を意味する。
同様のアルゴリズムは歴史的には前漢に九章算術で初めて記述された。連立一次方程式の解法以外にも
* 行列の階数の計算
* 行列式の計算
* 正則行列の逆行列の計算
などに使われる。このアルゴリズムは、大きな方程式系を系統的な方法で小さな系へ分解する方法を与えるものと理解することができ、基本的には、**前進消去** (forward elimination) と**後退代入** (backward substitution) という2つのステップから成る。

行列に対して掃き出し法を行う為には、行に関する基本変形を行列に可能な限り繰り返し行って行列の左下部分の成分を全て 0 にする。行に関する基本変形には、
* 二つの行を入れ替えるもの
* ある行を0でない定数倍するもの
* ある行に他のある行の定数倍を加えるもの
の3種類の操作があり、必ず行列を上三角型に変形することができる。実際には、ゼロでない成分を持つ行が、ゼロしか成分に持たない行よりも上に位置し、主成分（行内の 0 でない成分のうち最も左にあるもの）が、その行の上にある行の主成分よりも、真に右側に位置する行階段形に変形される。
特に全ての主成分が 1 になり、主成分を含む列にある主成分以外の成分が 0 であるとき、この行列は行簡約階段形であると呼ばれる。この最終形は一意的であり、どのような行基本変形が行われたかには依存しない。例えば、次の様な行基本変形の繰り返し（各ステップで複数の基本変形を行っている）で、3番目と4番目は共に行階段形であるが、最後の4番目が一意に定まる行簡約階段形である。
:\left[\begin{array}{rrr|r}
1 &3  &1  &9 \\
1 &1  &-1 &1 \\
3 &11 &5  &35
\end{array}\right]\to
\left[\begin{array}{rrr|r}
1 &3  &1  &9 \\
0 &-2 &-2 &-8 \\
0 &2  &2  &8
\end{array}\right]\to
\left[\begin{array}{rrr|r}
1 &3  &1  &9 \\
0 &-2 &-2 &-8 \\
0 &0  &0  &0
\end{array}\right]\to
\left[\begin{array}{rrr|r}
1 &0 &-2 &-3 \\
0 &1 &1  &4 \\
0 &0 &0  &0
\end{array}\right]
行基本変形を用いて行列を行階段形に変形することを**ガウス・ジョルダンの消去法**（ガウス・ジョルダンのしょうきょほう、）という。ガウスの消去法という用語を上三角形または（簡約とは限らない）行階段形へ変換する手法を指すこともある。連立一次方程式の解を求める際に行基本変形を完全に簡約化する前に止めてしまう方が、計算上の理由から良いとされる場合もある。

## 基本的な考え方
次の *n* 元*m*連立一次方程式を考察する。右側にある行列がその拡大係数行列である。
:\begin{align}
&a_{11}x_1 + a_{12}x_2 +\cdots+ a_{1n}x_n = b_1 \\
&a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2 \\
&\qquad\vdots \\
&a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n= b_m
\end{align} \qquad \left[\begin{array}{cccc|c}
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{array}\right]
この方程式が x_1 = c_1+d_{11}\lambda_1+\cdots+d_{1s}\lambda_s, x_2=c_2+d_{21}\lambda_1+\cdots+d_{2s}\lambda_s, \cdots, x_r=c_r+d_{r1}\lambda_1+\cdots+d_{rs}\lambda_s, x_{r+1}=\lambda_1,\ldots, x_n=\lambda_s（n=r{+}s かつ \lambda_1,..., \lambda_s は任意の定数）という解を持つとすると、これらの式は次の連立一次方程式を略記したものであると見なせる。ただし、下段に並んでいる、左辺の全ての係数が *0* である式は m{-}r 本ある。
同様に右側にある行列がその拡大係数行列である。
:\begin{align}
&1x_1 + 0x_2 + \cdots + 0x_r - d_{11}x_{r+1} -\cdots- d_{1s}x_n = c_1\\
&0x_1 + 1x_2 + \cdots + 0x_r - d_{21}x_{r+1} -\cdots- d_{2s}x_n = c_2\\
&\qquad\vdots \\
&0x_1 + 0x_2 + \cdots + 1x_r - d_{r1}x_{r+1} -\cdots- d_{rs}x_n= c_r \\
&0x_1 + 0x_2 + \cdots + 0x_r + 0x_{r+1} +\cdots+ 0x_n = 0 \\
&\qquad\vdots \\
&0x_1 + 0x_2 + \cdots + 0x_r + 0x_{r+1} +\cdots+ 0x_n = 0
\end{align} \qquad \left[ \begin{array}{ccccccc|c}
1      &0      &\cdots &0      &-d_{11} &\cdots &-d_{1s} &c_1 \\
0      &1      &\cdots &0      &-d_{21} &\cdots &-d_{2s} &c_2 \\
\vdots &\vdots &\ddots &\vdots &\vdots  &       &\vdots  &\vdots \\
0      &0      &\cdots &1      &-d_{r1} &\cdots &-d_{rs} &c_r \\
0      &0      &\cdots &0      &0       &\cdots &0       &0 \\
\vdots &\vdots &       &\vdots &\vdots  &\ddots &\vdots  &\vdots \\
0      &0      &\cdots &0      &0       &\cdots &0       &0
\end{array} \right]
始めの拡大係数行列から上の拡大係数行列の形に変形する為には、対角成分に注目して行基本変形を行って行簡約階段形に変形する。ただし簡単のため、変数の番号を付け替えることなしに主成分がすべて対角線にあるものと仮定する。しかし一般的には、このような仮定の下で作業を行っても次の形の行簡約階段形にしか変形できない。（最も右の列の  番目の成分以下はすべて '0'）
:\left[ \begin{array}{ccccccc|c}
1      &0      &\cdots  &0      &-d_{11} &\cdots  &-d_{1s} &c_1 \\
0      &1      &\cdots  &0      &-d_{21} &\cdots  &-d_{2s} &c_2 \\
\vdots &\vdots &\ddots  &\vdots &\vdots  &        &\vdots  &\vdots \\
0      &0      &\cdots  &1      &-d_{r1} &\cdots  &-d_{rs} &c_r \\
0      &0      &\cdots  &0      &0       &\cdots  &0       &c_{r+1} \\
\vdots &\vdots &        &\vdots &\vdots  &\ddots  &\vdots  &\vdots \\
0      &0      &\cdots  &0      &0       &\cdots  &0       &0
\end{array} \right]
この時点で、与えられた連立一次方程式が解を持つ必要条件が c_{r+1}=0 であることが分かり、これは十分条件でもある。実際、c_{r+1}=0 とすると、上記の形の解が逆に得られていることは明らかである。より現実的な解法としては、未知数が *k* 個定まった時点で残り *k* + 1 個の未知数を含む式が解けるため、x_1 から x_r までの全ての変数を孤立させる必要はない。
これを行列の言葉で言えば、拡大係数行列を行簡約階段形にまで変形せずに途中で止めてしまう方がより現実的であるということになる。つまり、拡大係数行列が次の形の行階段形に変形された時点で、それ以上の簡約化を止めるのである。このとき、対応する連立一次方程式がその右の形に表せる：
:\left[ \begin{array}{ccccccc|c}
1      &m_{12} &\cdots &m_{1r} &-d'_{11} &\cdots &-d'_{1s} &c'_1 \\
0      &1      &\cdots &m_{2r} &-d'_{21} &\cdots &-d'_{2s} &c'_2 \\
\vdots &\vdots &\ddots &\vdots &\vdots   &       &\vdots   &\vdots \\
0      &0      &\cdots &1      &-d'_{r1} &\cdots &-d'_{rs} &c'_r \\
0      &0      &\cdots &0      &0        &\cdots &0        &0 \\
\vdots &\vdots &       &\vdots &\vdots   &\ddots &\vdots   &\vdots \\
0      &0      &\cdots &0      &0        &\cdots &0        &0
\end{array}\right]\qquad
\begin{align}
&1x_1 + m_{12}x_2 +\cdots+ m_{1r}x_r - d'_{11}x_{r+1} -\cdots- d'_{1s}x_{n} = c'_1 \\
&0x_1 + 1x_2 + \cdots + m_{2r}x_r - d'_{21}x_{r+1} -\cdots- d'_{2s}x_{n} = c'_2 \\
&\qquad\vdots \\
&0x_1 + 0x_2 + \cdots + 1x_r - d'_{r1}x_{r+1} -\cdots- d'_{rs}x_{n} = c'_r \\
&0x_1 + 0x_2 + \cdots + 0x_r + 0x_{r+1} +\cdots+ 0x_{n} = 0 \\
&\qquad\vdots \\
&0x_1 + 0x_2 + \cdots + 0x_r + 0x_{r+1} +\cdots+ 0x_{n} = 0
\end{align}
従って、任意定数 \lambda_1, \ldots, \lambda_s を用いて  番目以後の *s* 個の変数をx_{r+1}=\lambda_1, x_{r+2}=\lambda_2,..., x_{n}=\lambda_s と置き、右辺に移項して下から順に値を代入していくことで全ての解を確定できる。

## 例
次の連立一次方程式の解を拡大係数行列を用いずにガウスの消去法のアルゴリズムで求めてみる。
式の本数が固定されていること、式の入れ替えもまた一つの操作であることに注意すべきである。
: \begin{align}
&2x_1 &+ &4x_2  &+ &2x_3 &+ &2x_4 & &=8 \\
&4x_1 &+ &10x_2 &+ &3x_3 &+ &3x_4 & &=17 \\
&2x_1 &+ &6x_2  &+ &x_3  &+ & x_4 & &=9 \\
&3x_1 &+ &7x_2  &+ &x_3  &+ &4x_4 & &=11
\end{align}
# まず**前進消去**をする。
## 1 番目の方程式を  倍する。
##: \begin{align}
& x_1 &+ & 2x_2 &+ & x_3 &+ & x_4 & &=4 \\
&4x_1 &+ &10x_2 &+ &3x_3 &+ &3x_4 & &=17 \\
&2x_1 &+ & 6x_2 &+ & x_3 &+ & x_4 & &=9 \\
&3x_1 &+ & 7x_2 &+ & x_3 &+ &4x_4 & &=11
\end{align}
## 2 番目の方程式に 1 番目の方程式の &minus;4 倍を足す。3 番目の方程式に 1 番目の方程式の &minus;2 倍を足す。4 番目の方程式に 1 番目の方程式の &minus;3 倍を足す。
##: \begin{align}
&x_1 &+ &2x_2 &+ & x_3 &+ &x_4 & &=4  \\
&    &  &2x_2 &- & x_3 &- &x_4 & &=1  \\
&    &  &2x_2 &- & x_3 &- &x_4 & &=1  \\
&    &  & x_2 &- &2x_3 &+ &x_4 & &=-1
\end{align}
## 2 番目の方程式を 1/2 倍する。
##: \begin{align}
&x_1 &+ &2x_2 &+ & x_3           &+ &x_4            & &=4 \\
&    &  & x_2 &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 & &=\frac{1}{2} \\
&    &  &2x_2 &- & x_3           &- &x_4            & &=1 \\
&    &  & x_2 &- &2x_3           &+ &x_4            & &=-1
\end{align}
## 3 番目の方程式に 2 番目の方程式の -2 倍を足す。4 番目の方程式に 2 番目の方程式の -1 倍を足す。
##: \begin{align}
&x_1 &+ &2x_2 &+ &x_3            &+ &x_4            & &=4 \\
&    &  &x_2  &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 & &=\frac{1}{2} \\
&    &  &     &  &               &  &0              & &=0 \\
&    &  &     &- &\frac{3}{2}x_3 &+ &\frac{3}{2}x_4 & &=-\frac{3}{2}
\end{align}
## 3 番目の方程式と 4 番目の方程式を入れ替える。
##: \begin{align}
&x_1 &+ &2x_2 &+ &x_3            &+ &x_4            & &=4 \\
&    &  & x_2 &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 & &=\frac{1}{2} \\
&    &  &     &- &\frac{3}{2}x_3 &+ &\frac{3}{2}x_4 & &=-\frac{3}{2} \\
&    &  &     &  &               &  &0              & &=0
\end{align}
# 次に**後退代入**をする。
## 3 番目の方程式を -\frac{2}{3} 倍する
##: \begin{align}
&x_1 &+ &2x_2 &+ &x_3            &+ &x_4            &=4 \\
&    &  & x_2 &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 &=\frac{1}{2} \\
&    &  &     &  &x_3            &- &x_4            &=1 \\
&    &  &     &  &               &  &0              &=0
\end{align}
## x_3 = 1 + x_4 を 2 番目の方程式に代入する。
##: \begin{align}
&x_1 &+ &2x_2 &+ &x_3 &+ &x_4 &=4 \\
&    &  & x_2 &  &    &- &x_4 &=1 \\
&    &  &     &  &x_3 &- &x_4 &=1 \\
&    &  &     &  &    &  &0   &=0
\end{align}
## x_3 = 1 + x_4 と x_2 = 1 + x_4 を 1 番目の方程式に代入する。
##: \begin{align}
x_1 + 4x_4 &=1 \\
x_2 -  x_4 &=1 \\
x_3 -  x_4 &=1 \\
0          &=0
\end{align}
そこで、x_4=c（"c" は任意定数）とおくと、
: \begin{align}
x_1 &=-4c+1 \\
x_2 &=  c+1 \\
x_3 &=  c+1 \\
x_4 &=  c
\end{align}
これで解が全て求まった。

一般的なアルゴリズムについては、たとえばを見よ。

## 注意
* 対角成分が 0 になる場合には、枢軸選択（ピボット選択）という式の交換を行う必要がある。
** 対角成分が 0 になる場合以外でも、対角成分が絶対値が最大の係数になるように枢軸選択を行ったほうが、解の丸め誤差が少なくなる。ただし、これは行列要素の絶対値が同程度の大きさの場合のみ成り立ち、スケーリング（=前処理として方程式に適当な正則対角行列を掛け等価な方程式へ変換すること）を行わずに枢軸選択を行うとむしろ精度が悪化する場合もあるため、注意が必要である。
** 枢軸選択には部分選択法と完全選択法がある。絶対値が最大の係数を探索する範囲が、部分選択法は掃出し列（下方向）のみであるのに対し、完全選択法ではすべての項目（右および下方向）である。完全選択の方が計算精度は高いが計算速度およびアルゴリズムの複雑化の面で不利であるため、完全選択法の採用は現実には少ない。
* 疎行列に対してガウスの消去法のステップを行うと疎性を損なう（フィルイン fill-in）。
* 前進消去の段階において対角化を目指して、後退代入を行わずに *x* を直接計算する方法は**ガウス・ジョルダンの消去法**（）と呼ぶ。アルゴリズムは単純になるが、計算量は多くなる（変数が多い場合、ほぼ 1.5 倍になる）。
* 計算量（乗算の回数）は、変数の個数を *n* とすると、ほぼ *n* になる。大部分は前進消去にかかっており、後退代入にはそれより少ない *n* 程度である。ランダウの記号では、計算量は O(n^{3}) となる。

## 脚注

## 参考文献
* 
* 
* https://www.nct9.ne.jp/m_hiroi/light/juliaa20.html

## 関連項目
* LU分解
* アルゴリズム
* 三角行列
* Bareiss algorithm

## 外部リンク
* 
* Nicholas J. Higham:''How Accurate is Gaussian Elimination?'', (2023）
* 渡部善隆：「連立1次方程式の基礎知識 : およびGaussの消去法の安定性について」、九州大学大型計算機センター広報. 28 (4), pp.291-349,（1995年12月）