|TOP Page|
行列を解くのに直接法の一種であるLU分解を使うことが多い.LU分解とは係数行列を下三角行列と上三角行列の積で表す方法である.LU分解の後は三角行列であることを利用して,前進・後退代入を使って高速に連立一次方程式を解くことができる.ここではLU分解の方法について簡単に述べる.LU分解を説明するにあたって,ブロックLU分解をまず説明する.LU分解はブロックLU分解の特殊な場合を何度も繰り返すことで得られる.
次のような行列を考えよう.
![\[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\] \[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\]](4C5520466163746F72697A6174696F6E_eq0001.gif)
この行列は次のように分解できることが簡単にわかる.
![\[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{E} - \b{C}\b{A}^{-1}\b{B}\end{array}\] \[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{E} - \b{C}\b{A}^{-1}\b{B}\end{array}\]](4C5520466163746F72697A6174696F6E_eq0002.gif)
これはブロックLU分解の一種(下行列の対角ブロックが単位行列となるもの)で,呼ぶ.ブロック上三角行列の右下に現れる項

をシュール補元(Shur Complement)と呼び,
と書くこともある.
![\[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{I} & 0\\ -\b{C}\b{A}^{-1} & \b{I}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ 0 & \b{I}\end{array}\] \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{I} & 0\\ -\b{C}\b{A}^{-1} & \b{I}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ 0 & \b{I}\end{array}\]](4C5520466163746F72697A6174696F6E_eq0005.gif)
が成り立つことから,
![\[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]^{-1} = \[\begin{array}{l}\b{I} & 0\\ -\b{C}\b{A}^{-1} & \b{I}\end{array}\] \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]^{-1} = \[\begin{array}{l}\b{I} & 0\\ -\b{C}\b{A}^{-1} & \b{I}\end{array}\]](4C5520466163746F72697A6174696F6E_eq0006.gif)
であることが分かる.
次のような連立一次方程式を考えよう.
![\[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\]\{x_A\\ x_B\} = \{y_A\\ y_B\} \[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\]\{x_A\\ x_B\} = \{y_A\\ y_B\}](4C5520466163746F72697A6174696F6E_eq0007.gif)
係数行列についてブロックLU分解をすると,次のようになる.但しShur Complementを
と書いた.
![\[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{S}\end{array}\]\{x_A\\ x_B\} = \{y_A\\ y_B\} \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{S}\end{array}\]\{x_A\\ x_B\} = \{y_A\\ y_B\}](4C5520466163746F72697A6174696F6E_eq0009.gif)
左から下三角行列の逆行列を掛けて,
![\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{S}\end{array}\]\{x_A\\ x_B\} = \[\begin{array}{l}\b{I} & 0\\ -\b{C}\b{A}^{-1} & I\end{array}\]\{y_A\\ y_B\} \[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{S}\end{array}\]\{x_A\\ x_B\} = \[\begin{array}{l}\b{I} & 0\\ -\b{C}\b{A}^{-1} & I\end{array}\]\{y_A\\ y_B\}](4C5520466163746F72697A6174696F6E_eq0010.gif)
よって,次のように解が求まる


逆をとっているのは,
と
である.
の逆が簡単に取れるような状況(例えば
が対角行列)ではこのようなブロック分解における解法は解く行列の次数を減らすことができて効率が良い.
上のブロックLU分解の結果である,次のブロック上三角行列の固有値を求めてみよう.
![\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{S}\end{array}\]\phi = \lambda \phi \[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{S}\end{array}\]\phi = \lambda \phi](4C5520466163746F72697A6174696F6E_eq0017.gif)
特性方程式は次のとおり
![\det\[\begin{array}{l}\b{A}-\lambda\b{I} & \b{B}\\ 0 & \b{S}-\lambda\b{I}\end{array}\] = 0 \\ \Leftright \det(\b{A}-\lambda\b{I})\det(\b{S}-\lambda\b{I})=0 \det\[\begin{array}{l}\b{A}-\lambda\b{I} & \b{B}\\ 0 & \b{S}-\lambda\b{I}\end{array}\] = 0 \\ \Leftright \det(\b{A}-\lambda\b{I})\det(\b{S}-\lambda\b{I})=0](4C5520466163746F72697A6174696F6E_eq0018.gif)
よって,固有値
は
の固有値,
の固有値に等しくなる.ブロック三角行列の固有値は対角に位置する行列の固有値に等しいことが分かる.また,対角行列が単位行列であるブロック三角行列の固有値は1であることがわかる.以上から,もとの行列の固有値は
と,
の固有値に等しくなる,Shur Complement
は元の行列の性質を保持しているので非常に重要である.
LU分解のブロック上三角行列をさらに次のように分解してみよう.
![\[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{E} - \b{C}\b{A}^{-1}\b{B}\end{array}\] = \[\begin{array}{l}\b{A} & 0 \\ 0 & \b{E} - \b{C}\b{A}^{-1}\b{B}\end{array}\]\[\begin{array}{l}\b{I} & \b{A}^{-1}\b{B}\\ 0 & \b{I}\end{array}\] \[\begin{array}{l}\b{A} & \b{B}\\ 0 & \b{E} - \b{C}\b{A}^{-1}\b{B}\end{array}\] = \[\begin{array}{l}\b{A} & 0 \\ 0 & \b{E} - \b{C}\b{A}^{-1}\b{B}\end{array}\]\[\begin{array}{l}\b{I} & \b{A}^{-1}\b{B}\\ 0 & \b{I}\end{array}\]](4C5520466163746F72697A6174696F6E_eq0025.gif)
これを用いると次のように対称に書ける.
![\[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{A} & 0 \\ 0 & \b{S}\end{array}\]\[\begin{array}{l}\b{I} & \b{A}^{-1}\b{B}\\ 0 & \b{I}\end{array}\] \[\begin{array}{l}\b{A} & \b{B}\\ \b{C} & \b{E}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ \b{C}\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{A} & 0 \\ 0 & \b{S}\end{array}\]\[\begin{array}{l}\b{I} & \b{A}^{-1}\b{B}\\ 0 & \b{I}\end{array}\]](4C5520466163746F72697A6174696F6E_eq0026.gif)
もとの行列が正定値対称行列である場合を考える.つまり,



もとの行列の固有値は
と
の固有値に等しいので,もとの行列が正定値であるということは
も
も正定値ということである.このとき次のような実行列
,
による分解が可能である.
, 
これを使うとLDU分解の対角ブロック行列は次のように分解できる.
![\[\begin{array}{l}\b{A} & 0 \\ 0 & \b{S}\end{array}\] = \[\begin{array}{l}\b{L}_A & 0 \\ 0 & \b{L}_S\end{array}\]\[\begin{array}{l}L_A^T & 0 \\ 0 & L_S^T\end{array}\] \[\begin{array}{l}\b{A} & 0 \\ 0 & \b{S}\end{array}\] = \[\begin{array}{l}\b{L}_A & 0 \\ 0 & \b{L}_S\end{array}\]\[\begin{array}{l}L_A^T & 0 \\ 0 & L_S^T\end{array}\]](4C5520466163746F72697A6174696F6E_eq0038.gif)
これを上に代入して,
![\[\begin{array}{l}\b{A} & \b{B}\\ \b{B}^T & \b{D}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ \b{B}^T\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{L}_A & 0 \\ 0 & \b{L}_S\end{array}\]\[\begin{array}{l}L_A^T & 0 \\ 0 & L_S^T\end{array}\]\[\begin{array}{l}\b{I} & \b{A}^{-1}\b{B}\\ 0 & \b{I}\end{array}\]\\ \;\;\;\;\;\;\; = \[\begin{array}{l}\b{L}_A & 0\\ \b{B}^T\b{L}_A^{-T} & \b{L}_S\end{array}\] \[\begin{array}{l}\b{L}_A^T & \b{L}_A^{-T}\b{B} \\ 0 & \b{L}_S^T\end{array}\]\\ \;\;\;\;\;\;\; = \[\begin{array}{l}\b{L}_A & 0\\ \b{B}^T\b{L}_A^{-T} & \b{L}_S\end{array}\] \[\begin{array}{l}\b{L}_A & 0\\ \b{B}^T\b{L}_A^{-T} & \b{L}_S\end{array}\]^T \[\begin{array}{l}\b{A} & \b{B}\\ \b{B}^T & \b{D}\end{array}\] = \[\begin{array}{l}\b{I} & 0\\ \b{B}^T\b{A}^{-1} & I\end{array}\]\[\begin{array}{l}\b{L}_A & 0 \\ 0 & \b{L}_S\end{array}\]\[\begin{array}{l}L_A^T & 0 \\ 0 & L_S^T\end{array}\]\[\begin{array}{l}\b{I} & \b{A}^{-1}\b{B}\\ 0 & \b{I}\end{array}\]\\ \;\;\;\;\;\;\; = \[\begin{array}{l}\b{L}_A & 0\\ \b{B}^T\b{L}_A^{-T} & \b{L}_S\end{array}\] \[\begin{array}{l}\b{L}_A^T & \b{L}_A^{-T}\b{B} \\ 0 & \b{L}_S^T\end{array}\]\\ \;\;\;\;\;\;\; = \[\begin{array}{l}\b{L}_A & 0\\ \b{B}^T\b{L}_A^{-T} & \b{L}_S\end{array}\] \[\begin{array}{l}\b{L}_A & 0\\ \b{B}^T\b{L}_A^{-T} & \b{L}_S\end{array}\]^T](4C5520466163746F72697A6174696F6E_eq0039.gif)
よって,もとの行列を下三角行列とその転置の形で表すことができた.
前節ではブロックLU分解について解説した.ここではそれを用いてLU分解を説明する.LU分解を説明するためにまず,LDU分解について解説する.LDU分解は処理に対称性があるので,理解しやすい.LDU分解した後にDをUにかけたり,DをLにかけたりすることで,LU分解が得られる.LDU分解はブロックLDU分解の特殊な場合を繰り返した物として考えることができるので,ここではそれを使って解説する.
LDU分解は行列を下三角行列,対角行列,上三角行列の積に分けることである.ブロックLDU分解は,もとの行列を大きくブロックに分けて,ブロックごとの計算で全体の分解を行った.ブロックの分け方を代えて,サイズが1のブロックと,n-1のブロックに分けるようなブロックLDU分解を考える.これを繰り返すことでLDU分解が得られる.
![\b{S}_0=\[\begin{array}{l}a_0 & \b{b}^T_0\\ \b{c}_0 & \b{E}_0\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \b{I}\end{array}\]\[\begin{array}{l}a_0 & 0\\ 0 & \b{E}_0 - \frac{1}{a}\b{c}_0\b{b}_0^T\end{array}\]\[\begin{array}{l}1 & \frac{1}{a_0}\b{b}_0^T\\ 0 & \b{I}\end{array}\] = \b{L}_1 \b{D}_1 \b{U}_1 \b{S}_0=\[\begin{array}{l}a_0 & \b{b}^T_0\\ \b{c}_0 & \b{E}_0\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \b{I}\end{array}\]\[\begin{array}{l}a_0 & 0\\ 0 & \b{E}_0 - \frac{1}{a}\b{c}_0\b{b}_0^T\end{array}\]\[\begin{array}{l}1 & \frac{1}{a_0}\b{b}_0^T\\ 0 & \b{I}\end{array}\] = \b{L}_1 \b{D}_1 \b{U}_1](4C5520466163746F72697A6174696F6E_eq0040.gif)
さて,
![\b{D}_1 = \[\begin{array}{l}a_0 & 0\\ 0 & \b{S}_1\end{array}\],\;\;\;\b{S}_1 = \b{E}_0 - \frac{1}{a_0}\b{c_0}\b{b_0}^T \b{D}_1 = \[\begin{array}{l}a_0 & 0\\ 0 & \b{S}_1\end{array}\],\;\;\;\b{S}_1 = \b{E}_0 - \frac{1}{a_0}\b{c_0}\b{b_0}^T](4C5520466163746F72697A6174696F6E_eq0041.gif)
であった.この右下の(n-1)次の正方行列である
が次のようにLDU分解されるとする.
![\b{S}_1=\[\begin{array}{l}a_1 & \b{b}^T_1\\ \b{c}_1 & \b{E}_1\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_1}\b{c}_1 & \b{I}\end{array}\]\[\begin{array}{l}a_1 & 0\\ 0 & \b{E}_1 - \frac{1}{a_1}\b{c}_1\b{b}_1^T\end{array}\]\[\begin{array}{l}1 & \frac{1}{a_1}\b{b}_1^T\\ 0 & \b{I}\end{array}\] = \bar{\b{L}}_2 \bar{\b{D}}_2 \bar{\b{U}}_2 \b{S}_1=\[\begin{array}{l}a_1 & \b{b}^T_1\\ \b{c}_1 & \b{E}_1\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_1}\b{c}_1 & \b{I}\end{array}\]\[\begin{array}{l}a_1 & 0\\ 0 & \b{E}_1 - \frac{1}{a_1}\b{c}_1\b{b}_1^T\end{array}\]\[\begin{array}{l}1 & \frac{1}{a_1}\b{b}_1^T\\ 0 & \b{I}\end{array}\] = \bar{\b{L}}_2 \bar{\b{D}}_2 \bar{\b{U}}_2](4C5520466163746F72697A6174696F6E_eq0043.gif)
これを使うと,もとの行列
は次のように書ける.
![\b{D}_1 = \[\begin{array}{l}a_0 & 0\\ 0 & \bar{\b{L}}_2\bar{\b{D}}_2\bar{\b{U}}_2\end{array}\] = \[\begin{array}{l}1 & 0\\ 0 & \bar{\b{L}}_2\end{array}\]\[\begin{array}{l}a_0 & 0\\ 0 & \bar{\b{D}}_2\end{array}\]\[\begin{array}{l}1 & 0\\ 0 & \bar{\b{U}}_2\end{array}\] = \tilde{\b{L}}_2\b{D}_2\tilde{\b{U}}_2 \b{D}_1 = \[\begin{array}{l}a_0 & 0\\ 0 & \bar{\b{L}}_2\bar{\b{D}}_2\bar{\b{U}}_2\end{array}\] = \[\begin{array}{l}1 & 0\\ 0 & \bar{\b{L}}_2\end{array}\]\[\begin{array}{l}a_0 & 0\\ 0 & \bar{\b{D}}_2\end{array}\]\[\begin{array}{l}1 & 0\\ 0 & \bar{\b{U}}_2\end{array}\] = \tilde{\b{L}}_2\b{D}_2\tilde{\b{U}}_2](4C5520466163746F72697A6174696F6E_eq0045.gif)
これを代入すると,もとの行列
は次のように書ける

ここで,
について具体的に計算してみよう.
![\b{L}_2 = \tilde{\b{L}}_1\tilde{\b{L}}_2 = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \b{I}\end{array}\]\[\begin{array}{l}1 & 0\\ 0 & \bar{\b{L}}_2\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \bar{\b{L}}_2\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \[\begin{array}{l}1 & 0\\ \frac{1}{a_1}\b{c}_1 & \b{I}\end{array}\] \end{array}\] \b{L}_2 = \tilde{\b{L}}_1\tilde{\b{L}}_2 = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \b{I}\end{array}\]\[\begin{array}{l}1 & 0\\ 0 & \bar{\b{L}}_2\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \bar{\b{L}}_2\end{array}\] = \[\begin{array}{l}1 & 0\\ \frac{1}{a_0}\b{c}_0 & \[\begin{array}{l}1 & 0\\ \frac{1}{a_1}\b{c}_1 & \b{I}\end{array}\] \end{array}\]](4C5520466163746F72697A6174696F6E_eq0049.gif)
これは単位行列の前2列の対角より下が埋まった下三角行列になっていることがわかる.同様にして,
について具体的に書くと次のとおり,
![\b{U}_2 = \tilde{\b{U}}_2\tilde{\b{U}}_1 = \[\begin{array}{l}1 & \frac{1}{a_0}\b{b}^T_0\\ 0 & \[\begin{array}{l}1 & \frac{1}{a_1}\b{b}^T_1\\ 0 & \b{I}\end{array}\] \end{array}\] \b{U}_2 = \tilde{\b{U}}_2\tilde{\b{U}}_1 = \[\begin{array}{l}1 & \frac{1}{a_0}\b{b}^T_0\\ 0 & \[\begin{array}{l}1 & \frac{1}{a_1}\b{b}^T_1\\ 0 & \b{I}\end{array}\] \end{array}\]](4C5520466163746F72697A6174696F6E_eq0053.gif)
は対角ブロック行列で,始めの2つは対角行列で,以降はブロック行列となっている.
については単位行列の前2行の対角より右がうまった上三角行列になっていることがわかる.
これらの作業をもとの行列の次数であるn回繰り返せば,
が対角行列になる.n回繰り返した時にLDU分解が得られる.
もとの行列を
とするとき,順番にこれらを求めるアルゴリズムは次のとおり
は(n-i)次の正方行列である.
の1行1列目の成分を
とする.
の1行目で2列目以降の成分をベクトル表記して
とする.同様に
の1列で2行目以降の成分をベクトル表記して
とする.
は(n-i-1)次のベクトルである.また
の2行目以降,2列目以降からなる(n-i-1)次の正方行列を
とする.
とする.
を
のi番目の対角に代入.
を
のi列目の対角の下に並べる.
を
のi行目の対角から右に並べる
これを図示すると下の図のようになる.元の行列
から始まり,右下へ向けて逐次的に計算を進めていく.
上のアルゴリズムを成分毎に書いてみよう.元の行列
として,LDU分解した行列の成分は次のようになる.
但し,
のij成分をそれぞれ
のように書くとする.



と下三角行列と上三角行列の積になる.これをLU分解という.
が非対称な場合はクラウト分解,対称の場合はコレスキー分解と呼ばれる.
前節でLDU分解を用いて分解した行列を
とする.

とすると,
は上三角行列となるので,

LDU分解を参考にして上のアルゴリズムを成分毎に書いてみよう.元の行列
として,LDU分解した行列の成分は次のようになる.
から成分ごとに得られる次の関係式
, 
を代入して,次が得られる.


前節でLDU分解を用いて分解した行列を
とする.

とすると,
は上三角行列となるので,

LDU分解を参考にして上のアルゴリズムを成分毎に書いてみよう.元の行列
として,LDU分解した行列の成分は次のようになる.
から成分ごとに得られる次の関係式
, 
を代入して,次が得られる.


これは行列のデータ構造として,CRSデータ形式を用いる場合に良く使われる.
次のような連立一次方程式を解くとする.

ここで係数が次のようにLU分解されているとすると,

これを解く際には,次のようにベクトル
を導入して,まず下三角行列について解き,次に上三角行列について順番に解くことで得られる.下三角行列や,上三角行列について解くときには,後に述べるように前進代入,後退代入によって解が得られる.


前進代入を用いてできる





後退消去を用いて求めることができる.

xの最後の要素から,順番に最初の要素に向けて求めていく




分解する前のもとの行列
に加え,LとUを表現するためのメモリを別に確保することは効率が悪い.Lは下三角行列で,上半分は0であるし,Uは下三角行列で下半分は0である.もとの行列を変形して,上半分がUになるようにして,下半分がLになるようにすると,これらを1つの行列の中に表示することができる.
いまここで,Uの対角が1になるようにLU分解を行う場合を考える.つまり
このとき
を変形して次のような行列
になるようにする.但し,
のij成分をそれぞれ
,
,
とする.

の対角成分が
の対角成分の逆になっていることに注目されたい.これは
の対角成分はLU分解や対角成分は前進代入の際に使われるが,常に逆の値として使われるので,逆の値を保存しておくことで高速化が期待できる.さて,Uの対角が1になるようなLU分解は行ごとの分解に向いている.これはCRSのような行ごとのデータ構造にとって,最も適した分解方法だと言える.このような行列
を求めるアルゴリズムは次のとおりとなる.




(下三角行列の対角成分の逆数を計算して格納)
(下三角行列の対角成分を掛けて上三角行列を作る)

さて,このように変形した行列に対する前進消去,後退代入は次のようになる.


図2は,圧縮表示をした場合のLU分解アルゴリズムを示している.LU分解の種類や分解の手順に依存せず,だいたい次のような図のとおりになる.つまり,分解する要素
があった場合に,対角要素
と
が四角形を作れるように,その上
や左
の分解が終わった要素全てを参照する.
| 行列計算ソフトウェア―WS、スーパーコン、並列計算機 |
小国 力 (著) |