5 LU分解

5.1 LU分解による解の計算方法

係数行列 $ \boldsymbol{A}$が下三角行列 $ \boldsymbol{L}$と上三角行列 $ \boldsymbol{U}$の積に展開でき たとする.

$\displaystyle \boldsymbol{A}=\boldsymbol{L}\boldsymbol{U}$ (14)

下三角行列と上三角行列の要素を書き出すと

$\displaystyle \begin{bmatrix}\alpha_{11} & 0 & 0 & 0 \\ \alpha_{21} & \alpha_{2...
...1} & a_{32} & a_{33} & a_{34}\\ a_{41} & a_{42} & a_{43} & a_{44} \end{bmatrix}$ (15)

となる.

このようにLU分解できると,連立1次方程式は

$\displaystyle \boldsymbol{Ax}=(\boldsymbol{LU})\boldsymbol{x}=\boldsymbol{L}(\boldsymbol{Ux})=\boldsymbol{b}$ (16)

と書ける.これをさらに書き換えると,

$\displaystyle \boldsymbol{Ly}=\boldsymbol{b}$ (17)

$\displaystyle \boldsymbol{Ux}=\boldsymbol{y}$ (18)

となる.これらの連立方程式の解 $ \boldsymbol{y}$ $ \boldsymbol{x}$は,それぞれの係数 が三角行列なので容易に計算できる(ガウス消去法と後退代入の説明を見よ). $ y$の方は,係数が下三角行列なので$ 1$$ N$まで前進代入により解ける. 具体的には,

\begin{equation*}\begin{aligned}y_1&=\frac{1}{\alpha_{11}}b_1\\ y_i&=\frac{1}{\a...
...}^{i-1}\alpha_{ij} y_j\right) \qquad i=2,3,\cdots,N \end{aligned}\end{equation*}

である.この$ y$が求まったならば,今度は係数が上三角行列の式([*])の $ \boldsymbol{x}$を求める.これは,$ N$$ 1$の順序で計算する後 退代入を使う.

\begin{equation*}\begin{aligned}x_N&=\frac{1}{\beta_{NN}}y_N\\ x_i&=\frac{1}{\be...
...1}^N\beta_{ij} x_j\right) \qquad i=N-1,N-2,\cdots,1 \end{aligned}\end{equation*}

これらの前進代入と後退代入は,コンピューターにとって非常に簡単に計算できる.これ は,係数行列$ A$をLU分解できれば,連立方程式は簡単に解けると言っている.次節でLU 分解の方法を詳しく説明する.

いったんLU分解が出来てしまえば,式(1)の右辺 $ \boldsymbol{b}$が変わっ ても,そのLU分解の形を変える必要がない.右辺が変わっても,LU分解は1回で済む.こ れが,ガウスの消去法と後退代入を組み合わせた方法やガウス・ジョルダン法に比べて, 際立って優れている点である.

5.2 LU分解(クラウトのアルゴリズム)

LU分解するということは,式(15)の $ \alpha_{ij}$ $ \beta_{ij}$ を計算することにほかならない.この式の行列方程式は,$ N^2+N$の未知数と$ N^2$の式を 含む.未知数の数が方程式の数より多いので,$ N$個の未知数を勝手に決めて残りを計算 することが可能である.従って,LU分解は一意に決まらない,計算しやすいように$ N$個 の未知数を決めることができる.ここでは,LU分解のクラウト(Crout)のアルゴリズムに 従い,

$\displaystyle \alpha_{ii}=1 \qquad i=1,2,3,\cdots,N$ (21)

とする.

それでは,クラウトのアルゴリズムによるLU分解の手順を示すことにする.

  1. $ \alpha_{ii}=1\quad(i=1,\cdots,N)$とします.この操作により,解 くべき行列方程式(15)は


    と変形できる.
  2. この式を見ると, $ \beta_{ij}$ $ \alpha_{ij}$が次に示す順序で簡単に求められ ることが分かる.まずは式を見て分かるように, $ \beta_{11}$が直ちに計算できる. 次に $ \beta_{11}$を利用して, $ \alpha_{21},\alpha_{31},\alpha_{41}$を求める ことができる.これで,$ L$$ U$の第1列目が求められた.次に第2列目である.こ れも $ \beta_{12}$は直ちに計算できる.そうして,これまで分かっている $ \beta_{ij}$ $ \alpha_{ij}$を使うと, $ \beta_{22},\alpha_{32},\alpha_{42}$ を求めることができる.これで第2列目は終わりで,同じことを繰り返すと,全て の $ \beta_{ij}$ $ \alpha_{ij}$が計算できる.これをアルゴリズムにすると次の ようになる.
    $ j=1,2,3,\cdots,N$という順序で計算する. $ \boldsymbol{L}$ $ \boldsymbol{U}$$ j$列目を計算することになる.具体的には,以下のようにして,$ j$列目の $ \beta_{ij}$ $ \alpha_{ij}$を求める.
    • まず, $ i=1,2,\cdots,j$について,次式に従い $ \beta_{ij}$を 計算する.

      \begin{equation*}\begin{aligned}\beta_{1j}&=a_{1j}\\ \beta_{ij}&=a_{ij}-\sum_{k=1}^{i-1}\alpha_{ik}\beta_{kj} \end{aligned}\end{equation*}

    • 次に, $ i=j+1,j+2,\cdots,N$について, $ \alpha_{ij}$を計算する.

      \begin{equation*}\begin{aligned}\alpha_{ij}&=\frac{1}{\beta_{jj}}\left( a_{ij}-\sum_{k=1}^{j-1}\alpha_{ik}\beta_{kj} \right) \end{aligned}\end{equation*}

    • これで, $ \boldsymbol{L}$ $ \boldsymbol{U}$$ j$列目が完成したので,同じ操作を $ j+1$列目に行う.同じことを繰り返して,LU分解の行列を 完成させる.

この方法により,LU分解ができる.次に示すピボット選択をしなければ,アルゴリズムは 非常に単純である.

5.3 ピボット選択

ここでも,ピボット選択の問題が出てくる.式(24)の $ \beta_{jj}$ で割る部分である.安定な解を求めるためには,ピボット選択は必要不可欠ということで ある.完全ピボット選択は複雑なので,部分ピボット選択で十分であろう.

ではどうするかですが,これも途中($ j$列)まで分解した行列は崩したくない.そのため には,行列 $ \boldsymbol{L}$の行を交換し,それに対応した行列 $ \boldsymbol{A}$ の行を交換すれば問題 がもっとも少なくなる.当然,行列 $ \boldsymbol{U}$は行も列も変化しない.最終的には行を交換 した行列 $ \boldsymbol{A}^\prime$のLU分解が出来る.連立1次方程式を解くときには,同様に $ \boldsymbol{b}$の行も交換しておく.ただし,行の交換であるため,解 $ \boldsymbol{x}$の要素の順序は 入れ替わらない.

つぎに,どのようにして交換する行を決めるかである.一般的には, $ \beta_{jj}$が大き くなるように選択すれば良い結果が得られる.クラウト法のピボット選択は,次のように 進める.$ j$列目のピボットを選択する場合についてである.

  1. まずは,$ j-1$列目までの行列 $ \boldsymbol{L}$の各行の要素の最大値を1に規 格化する.同時に,対応する行列 $ \boldsymbol{A}$の行も同じ係数を掛ける.
  2. そうして,

    \begin{equation*}\begin{aligned}\gamma_{i}&=a_{ij}-\sum_{k=1}^{i-1}\alpha_{ik}\beta_{kj} \qquad (i=j,j+1,\cdots,N) \end{aligned}\end{equation*}

    を計算する.これは,式(23)と同じ, 式(24)と $ \beta_{jj}$で割ること以外は同じであ ることに注意が必要である.
  3. 最大の $ \gamma_{i}$となるものをピボットとして選択する.
  4. 最大のピボットとなる行が分かったので,後は元(規格化前)の $ \boldsymbol{L}$ $ \boldsymbol{A}$を用いて,式(24)と $ \beta_{jj}$を計算する.
これがピボット探索のルーチンである.実際には,ピボット作成用の関数を作成 して,計算をすることになる.
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年10月16日


no counter