コンテンツにスキップ

「ガウスの消去法」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Geomcat (会話 | 投稿記録)
書き過ぎの部分を消去
 
(14人の利用者による、間の28版が非表示)
1行目: 1行目:
{{脚注の不足|date=2022-07}}
'''ガウスの消去法'''(ガウスのしょうきょほう、{{lang-en-short|Gaussian elimination}})あるいは'''掃き出し法'''(はきだしほう、{{lang-en-short|row reduction}})とは、[[連立一次方程式]]を解くための[[多項式時間]][[アルゴリズム]]であり、通常は問題となる連立一次方程式の係数からなる[[拡大係数行列]]に対して行われる一連の変形操作を意味する。
'''ガウスの消去法'''(ガウスのしょうきょほう、{{lang-en-short|Gaussian elimination}})あるいは'''掃き出し法'''(はきだしほう、{{lang-en-short|row reduction}})とは、[[連立一次方程式]]を解くための[[多項式時間]][[アルゴリズム]]であり、通常は問題となる連立一次方程式の係数からなる[[拡大係数行列]]に対して行われる一連の変形操作を意味する。
同様のアルゴリズムは歴史的には[[前漢]]に[[九章算術]]で初めて記述された{{sfn|Schrijver|1998|p=38}}。連立一次方程式の解法以外にも[[行列]]の[[行列の階数|階数]]を求めること、[[行列式]]の計算あるいは、正則行列の[[逆行列]]の計算などに使われる{{sfn|コルテ|フィーゲン|2009|p=95}}{{sfn|Schrijver|1998|p=33}}。このアルゴリズムは、大きな方程式系を系統的な方法で小さな系へ分解する方法を与えるものと理解することができ<ref name=Ferziger>{{cite|和書 |title=コンピュータによる流体力学 |author=Joel H. Ferziger |author2=Milovan Peri&#x107; |translator=小林敏雄、谷口伸行、坪倉誠 |publisher=シュプリンガー・フェアラーク東京 |year=2003 |isbn=4-431-70842-1 |page=88}}</ref>、基本的には、前進消去と後退代入という2つのステップから成る。
同様のアルゴリズムは歴史的には[[前漢]]に[[九章算術]]で初めて記述された{{sfn|Schrijver|1998|p=38}}。連立一次方程式の解法以外にも
* [[行列 (数学)|行列]]の[[行列の階数|階数]]の計算
* [[行列式]]の計算
* 正則行列の[[逆行列]]の計算
などに使われる{{sfn|コルテ|フィーゲン|2009|p=95}}{{sfn|Schrijver|1998|p=33}}。このアルゴリズムは、大きな方程式系を系統的な方法で小さな系へ分解する方法を与えるものと理解することができ<ref name=Ferziger>{{Cite|和書 |title=コンピュータによる流体力学 |author=Joel H. Ferziger |author2=Milovan Peri&#x107; |translator=小林敏雄、谷口伸行、坪倉誠 |publisher=シュプリンガー・フェアラーク東京 |year=2003 |isbn=4-431-70842-1 |page=88}}</ref>、基本的には、'''前進消去''' (forward elimination) '''後退代入''' (backward substitution) という2つのステップから成る。

行列に対して掃き出し法を行う為には、[[行列の基本変形|行に関する基本変形]]を行列に可能な限り繰り返し行って行列の左下部分の成分を全て 0 にする。行に関する基本変形には、1) 二つの行を入れ替えるもの、2) ある行を0でない定数倍するもの、3) ある行に、他のある行の定数倍を加えるもの、の三種類の操作あるいは変形があり、これらの変形を行うことで、常に行列は上三角型に変形することができ、実際には、ゼロでない成分を持つ行が、ゼロしか成分に持たない行よりも上に位置し、主成分(行の最も左にある 0 でない成分)が、その行の上にある行の主成分よりも、真に右側に位置する[[行階段形]]に変形される。
さらにすべての主成分が 1 になり、主成分を含む列にある主成分以外の成分が 0 であるとき、この行列は[[行階段形|行簡約階段形]]であると呼ばれる。この最終形は一意的であり、別の言葉で言えば、いかなる行基本変形が施されたかには依存しない。例えば、次の様な行基本変形の繰り返し(各ステップで複数の基本変形を行っている)で、三番目と四番目は共に行階段形であるが、最後の四番目が一意に定まる行簡約階段形である。


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


== 基本的な考え方 ==
行基本変形を用いて行列を行階段形に変形することを'''ガウス・ジョルダンの消去法'''(ガウス・ジョルダンのしょうきょほう、{{lang-en-short|Gauss–Jordan elimination}})と呼ぶことがある。教科書によっては、ガウスの消去法という用語を上三角形または(簡約とは限らない)行階段形へ変換する手法を指すこともある。実のところ、連立一次方程式の解を求める際に行基本変形を完全に簡約化する前に止めてしまう方が、計算上の理由から良いとされる場合もある。
次の ''n'' 元''m''連立一次方程式を考察する。右側にある行列がその拡大係数行列である。

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


==例==
==例==
次のような連立一次方程式の解を求める。
次の連立一次方程式の解を拡大係数行列を用いずにガウスの消去法のアルゴリズムで求めてみる。
式の本数が固定されていること、式の入れ替えもまた一つの操作であることに注意すべきである。
: <math>\begin{align}
: <math>\begin{align}
&2x_1 &+& 4x_2 &+& 2x_3 &+& 2x_4 &&= 8 \\
&2x_1 &+ &4x_2 &+ &2x_3 &+ &2x_4 & &=8 \\
&4x_1 &+& 10x_2 &+& 3x_3 &+& 3x_4 &&= 17 \\
&4x_1 &+ &10x_2 &+ &3x_3 &+ &3x_4 & &=17 \\
&2x_1 &+& 6x_2 &+& x_3 &+& x_4 &&= 9 \\
&2x_1 &+ &6x_2 &+ &x_3 &+ & x_4 & &=9 \\
&3x_1 &+& 7x_2 &+& x_3 &+& 4x_4 &&= 11
&3x_1 &+ &7x_2 &+ &x_3 &+ &4x_4 & &=11
\end{align}</math>
\end{align}</math>
# まず'''前進消去'''をする。
# まず'''前進消去'''をする。
## 1 番目の方程式を 1/2 倍する。
## 1 番目の方程式を {{sfrac|1|2}} 倍する。
##: <math>\begin{align}
##: <math>\begin{align}
& x_1 &+& 2x_2 &+& x_3 &+& x_4 &&= 4 \\
& x_1 &+ & 2x_2 &+ & x_3 &+ & x_4 & &=4 \\
&4x_1 &+& 10x_2 &+& 3x_3 &+& 3x_4 &&= 17 \\
&4x_1 &+ &10x_2 &+ &3x_3 &+ &3x_4 & &=17 \\
&2x_1 &+& 6x_2 &+& x_3 &+& x_4 &&= 9 \\
&2x_1 &+ & 6x_2 &+ & x_3 &+ & x_4 & &=9 \\
&3x_1 &+& 7x_2 &+& x_3 &+& 4x_4 &&= 11
&3x_1 &+ & 7x_2 &+ & x_3 &+ &4x_4 & &=11
\end{align}</math>
\end{align}</math>
## 2 番目の方程式に 1 番目の方程式の -4 倍を足す。3 番目の方程式に 1 番目の方程式の -2 倍を足す。4 番目の方程式に 1 番目の方程式の -3 倍を足す。
## 2 番目の方程式に 1 番目の方程式の &minus;4 倍を足す。3 番目の方程式に 1 番目の方程式の &minus;2 倍を足す。4 番目の方程式に 1 番目の方程式の &minus;3 倍を足す。
##: <math>\begin{align}
##: <math>\begin{align}
&x_1 &+& 2x_2 &+& x_3 &+& x_4 &&= 4 \\
&x_1 &+ &2x_2 &+ & x_3 &+ &x_4 & &=4 \\
& && 2x_2 &-& x_3 &-& x_4 &&= 1 \\
& & &2x_2 &- & x_3 &- &x_4 & &=1 \\
& && 2x_2 &-& x_3 &-& x_4 &&= 1 \\
& & &2x_2 &- & x_3 &- &x_4 & &=1 \\
& && x_2 &-& 2x_3 &+& x_4 &&= -1
& & & x_2 &- &2x_3 &+ &x_4 & &=-1
\end{align}</math>
\end{align}</math>
## 2 番目の方程式を 1/2 倍する。
## 2 番目の方程式を 1/2 倍する。
##: <math>\begin{align}
##: <math>\begin{align}
&x_1 &+& 2x_2 &+& x_3 &+& x_4 &&= 4 \\
&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_2 &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 & &=\frac{1}{2} \\
& && 2x_2 &-& x_3 &-& x_4 &&= 1 \\
& & &2x_2 &- & x_3 &- &x_4 & &=1 \\
& && x_2 &-& 2x_3 &+& x_4 &&= -1
& & & x_2 &- &2x_3 &+ &x_4 & &=-1
\end{align}</math>
\end{align}</math>
## 3 番目の方程式に 2 番目の方程式の -2 倍を足す。4 番目の方程式に 2 番目の方程式の -1 倍を足す。
## 3 番目の方程式に 2 番目の方程式の -2 倍を足す。4 番目の方程式に 2 番目の方程式の -1 倍を足す。
##: <math>\begin{align}
##: <math>\begin{align}
&x_1 &+& 2x_2 &+& x_3 &+& x_4 &&= 4 \\
&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_2 &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 & &=\frac{1}{2} \\
& && && && 0 &&= 0 \\
& & & & & & &0 & &=0 \\
& && &-& \frac{3}{2}x_3 &+& \frac{3}{2}x_4 &&= -\frac{3}{2}
& & & &- &\frac{3}{2}x_3 &+ &\frac{3}{2}x_4 & &=-\frac{3}{2}
\end{align}</math>
\end{align}</math>
## 3 番目の方程式と 4 番目の方程式を入れ替える。
## 3 番目の方程式と 4 番目の方程式を入れ替える。
##: <math>\begin{align}
##: <math>\begin{align}
&x_1 &+& 2x_2 &+& x_3 &+& x_4 &&= 4 \\
&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_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} \\
& & & &- &\frac{3}{2}x_3 &+ &\frac{3}{2}x_4 & &=-\frac{3}{2} \\
& && && && 0 &&= 0
& & & & & & &0 & &=0
\end{align}</math>
\end{align}</math>
# 次に'''後退代入'''をする。
# 次に'''後退代入'''をする。
## 3 番目の方程式を <math>-\frac{2}{3}</math> 倍する
## 3 番目の方程式を <math>-\frac{2}{3}</math> 倍する
##: <math>\begin{align}
##: <math>\begin{align}
&x_1 &+& 2x_2 &+& x_3 &+& x_4 &= 4 \\
&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_2 &- &\frac{1}{2}x_3 &- &\frac{1}{2}x_4 &=\frac{1}{2} \\
& && && x_3 &-& x_4 &= 1 \\
& & & & &x_3 &- &x_4 &=1 \\
& && && && 0 &= 0
& & & & & & &0 &=0
\end{align}</math>
\end{align}</math>
## <math>x_3 = 1 + x_4</math> を 2 番目の方程式に代入する。
## <math>x_3 = 1 + x_4</math> を 2 番目の方程式に代入する。
##: <math>\begin{align}
##: <math>\begin{align}
&x_1 &+& 2x_2 &+& x_3 &+& x_4 &= 4 \\
&x_1 &+ &2x_2 &+ &x_3 &+ &x_4 &=4 \\
& && x_2 && &-& x_4 &= 1 \\
& & & x_2 & & &- &x_4 &=1 \\
& && && x_3 &-& x_4 &= 1 \\
& & & & &x_3 &- &x_4 &=1 \\
& && && && 0 &= 0
& & & & & & &0 &=0
\end{align}</math>
\end{align}</math>
## <math>x_3 = 1 + x_4</math> と <math>x_2 = 1 + x_4</math> を 1 番目の方程式に代入する。
## <math>x_3 = 1 + x_4</math> と <math>x_2 = 1 + x_4</math> を 1 番目の方程式に代入する。
##: <math>\begin{align}
##: <math>\begin{align}
x_1 + 4x_4 &= 1 \\
x_1 + 4x_4 &=1 \\
x_2 - x_4 &= 1 \\
x_2 - x_4 &=1 \\
x_3 - x_4 &= 1 \\
x_3 - x_4 &=1 \\
0 &= 0
0 &=0
\end{align}</math>
\end{align}</math>
そこで、<math>x_4=c</math>("c" は任意定数)とおくと、
そこで、<math>x_4=c</math>("c" は任意定数)とおくと、
: <math>\begin{align}
: <math>\begin{align}
x_1 &=-4c + 1 \\
x_1 &=-4c+1 \\
x_2 &= c + 1 \\
x_2 &= c+1 \\
x_3 &= c + 1 \\
x_3 &= c+1 \\
x_4 &= c
x_4 &= c
\end{align}</math>
\end{align}</math>
これで解が全て求まった。
これで解が全て求まった。
128行目: 177行目:
一般的なアルゴリズムについては、たとえば{{harv|コルテ|フィーゲン|2009|p=96}}を見よ。
一般的なアルゴリズムについては、たとえば{{harv|コルテ|フィーゲン|2009|p=96}}を見よ。


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


== 脚注 ==
== 脚注 ==
{{reflist}}
{{脚注ヘルプ}}
{{Reflist}}


== 参考文献 ==
== 参考文献 ==
* {{Cite book|和書 |last1=コルテ |first1=B. |last2=フィーゲン |first2=J. |year=2009 |title=組合せ最適化:理論とアルゴリズム |edition=第2版 |url={{google books|7OfUJPqwyKwC|組合せ最適化:理論とアルゴリズム|page=95|plainurl=yes}} |publisher=シュプリンガー・ジャパン |isbn=978-4-431-10021-8 |ref=harv}}
* {{cite book
* {{Cite book |last1=Schrijver |first1=Alexander |year=1998 |title=Theory of Linear and Integral Programming |series=Wiley-Interscience series in discrete mathematics and optimization |url={{google books|zEzW5mhppB8C|Theory of Linear and Integral Programming|page=31|plainurl=yes}} |publisher=Wiley |isbn=0-471-98232-6
|和書
|ref=harv}}
|last1 = コルテ
* [http://www.nct9.ne.jp/m_hiroi/light/juliaa20.html]
|first1 = B.
|last2 = フィーゲン
|first2 = J.
|year = 2009
|title = 組合せ最適化:理論とアルゴリズム
|edition = 第2版
|url = {{google books|7OfUJPqwyKwC|組合せ最適化:理論とアルゴリズム|page=95|plainurl=yes}}
|publisher = シュプリンガー・ジャパン
|isbn = 978-4-431-10021-8
|ref = harv
}}
* {{cite book
|last1 = Schrijver
|first1 = Alexander
|year = 1998
|title = Theory of Linear and Integral Programming
|series = Wiley-Interscience series in discrete mathematics and optimization
|url = {{google books|zEzW5mhppB8C|Theory of Linear and Integral Programming|page=31|plainurl=yes}}
|publisher = Wiley
|isbn = 0-471-98232-6
|ref = harv
}}


==関連項目==
== 関連項目 ==
* [[LU分解]]
* [[アルゴリズム]]
* [[アルゴリズム]]
* [[三角行列]]
* [[三角行列]]
* [[:en:Bareiss algorithm|Bareiss algorithm]]

== 外部リンク ==
* {{高校数学の美しい物語|1170|ガウスの消去法による連立一次方程式の解き方}}
* [https://nhigham.com/wp-content/uploads/2023/08/high90g.pdf Nicholas J. Higham:''How Accurate is Gaussian Elimination?'', (2023)]

{{線形代数}}


{{DEFAULTSORT:かうすのしようきよほう}}
{{DEFAULTSORT:かうすのしようきよほう}}
[[Category:数値線形代数]]
[[Category:数値線形代数]]
[[Category:カール・フリードリヒ・ガウス]]
[[Category:数学のエポニム]]
[[Category:数学に関する記事]]
[[Category:数学に関する記事]]

2024年10月14日 (月) 11:03時点における最新版

ガウスの消去法(ガウスのしょうきょほう、: Gaussian elimination)あるいは掃き出し法(はきだしほう、: row reduction)とは、連立一次方程式を解くための多項式時間アルゴリズムであり、通常は問題となる連立一次方程式の係数からなる拡大係数行列に対して行われる一連の変形操作を意味する。 同様のアルゴリズムは歴史的には前漢九章算術で初めて記述された[1]。連立一次方程式の解法以外にも

などに使われる[2][3]。このアルゴリズムは、大きな方程式系を系統的な方法で小さな系へ分解する方法を与えるものと理解することができ[4]、基本的には、前進消去 (forward elimination) と後退代入 (backward substitution) という2つのステップから成る。

行列に対して掃き出し法を行う為には、行に関する基本変形を行列に可能な限り繰り返し行って行列の左下部分の成分を全て 0 にする。行に関する基本変形には、

  • 二つの行を入れ替えるもの
  • ある行を0でない定数倍するもの
  • ある行に他のある行の定数倍を加えるもの

の3種類の操作があり、必ず行列を上三角型に変形することができる。実際には、ゼロでない成分を持つ行が、ゼロしか成分に持たない行よりも上に位置し、主成分(行内の 0 でない成分のうち最も左にあるもの)が、その行の上にある行の主成分よりも、真に右側に位置する行階段形に変形される。 特に全ての主成分が 1 になり、主成分を含む列にある主成分以外の成分が 0 であるとき、この行列は行簡約階段形であると呼ばれる。この最終形は一意的であり、どのような行基本変形が行われたかには依存しない。例えば、次の様な行基本変形の繰り返し(各ステップで複数の基本変形を行っている)で、3番目と4番目は共に行階段形であるが、最後の4番目が一意に定まる行簡約階段形である。

行基本変形を用いて行列を行階段形に変形することをガウス・ジョルダンの消去法(ガウス・ジョルダンのしょうきょほう、: Gauss–Jordan elimination)という。ガウスの消去法という用語を上三角形または(簡約とは限らない)行階段形へ変換する手法を指すこともある。連立一次方程式の解を求める際に行基本変形を完全に簡約化する前に止めてしまう方が、計算上の理由から良いとされる場合もある。

基本的な考え方

[編集]

次の nm連立一次方程式を考察する。右側にある行列がその拡大係数行列である。

この方程式が かつ は任意の定数)という解を持つとすると、これらの式は次の連立一次方程式を略記したものであると見なせる。ただし、下段に並んでいる、左辺の全ての係数が 0 である式は 本ある。 同様に右側にある行列がその拡大係数行列である。

始めの拡大係数行列から上の拡大係数行列の形に変形する為には、対角成分に注目して行基本変形を行って行簡約階段形に変形する。ただし簡単のため、変数の番号を付け替えることなしに主成分がすべて対角線にあるものと仮定する。しかし一般的には、このような仮定の下で作業を行っても次の形の行簡約階段形にしか変形できない。(最も右の列の r + 2 番目の成分以下はすべて '0')

この時点で、与えられた連立一次方程式が解を持つ必要条件が であることが分かり、これは十分条件でもある。実際、 とすると、上記の形の解が逆に得られていることは明らかである。より現実的な解法としては、未知数が k 個定まった時点で残り k + 1 個の未知数を含む式が解けるため、 から までの全ての変数を孤立させる必要はない。 これを行列の言葉で言えば、拡大係数行列を行簡約階段形にまで変形せずに途中で止めてしまう方がより現実的であるということになる。つまり、拡大係数行列が次の形の行階段形に変形された時点で、それ以上の簡約化を止めるのである。このとき、対応する連立一次方程式がその右の形に表せる:

従って、任意定数 を用いて >r+1 番目以後の s 個の変数を と置き、右辺に移項して下から順に値を代入していくことで全ての解を確定できる。

[編集]

次の連立一次方程式の解を拡大係数行列を用いずにガウスの消去法のアルゴリズムで求めてみる。 式の本数が固定されていること、式の入れ替えもまた一つの操作であることに注意すべきである。

  1. まず前進消去をする。
    1. 1 番目の方程式を 1/2 倍する。
    2. 2 番目の方程式に 1 番目の方程式の −4 倍を足す。3 番目の方程式に 1 番目の方程式の −2 倍を足す。4 番目の方程式に 1 番目の方程式の −3 倍を足す。
    3. 2 番目の方程式を 1/2 倍する。
    4. 3 番目の方程式に 2 番目の方程式の -2 倍を足す。4 番目の方程式に 2 番目の方程式の -1 倍を足す。
    5. 3 番目の方程式と 4 番目の方程式を入れ替える。
  2. 次に後退代入をする。
    1. 3 番目の方程式を 倍する
    2. を 2 番目の方程式に代入する。
    3. を 1 番目の方程式に代入する。

そこで、("c" は任意定数)とおくと、

これで解が全て求まった。

一般的なアルゴリズムについては、たとえば(コルテ & フィーゲン 2009, p. 96)を見よ。

注意

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

脚注

[編集]
  1. ^ Schrijver 1998, p. 38.
  2. ^ コルテ & フィーゲン 2009, p. 95.
  3. ^ Schrijver 1998, p. 33.
  4. ^ a b Joel H. Ferziger; Milovan Perić 著、小林敏雄、谷口伸行、坪倉誠 訳『コンピュータによる流体力学』シュプリンガー・フェアラーク東京、2003年、88頁。ISBN 4-431-70842-1 

参考文献

[編集]

関連項目

[編集]

外部リンク

[編集]