数値解析 連立方程式 LU分解

前のページ
LとUの掛け算
$ \left( \begin{array}{ccccc} a_{11} & a_{12} & a_{13} & ...& a_{1n} \\ a_{21} & a_{22} & a_{23} & ...& a_{2n} \\ a_{31} & a_{32} & a_{33} & ...& a_{3n} \\  : & : & : & & : \\ a_{n1} & a_{n2} & a_{n3} & ...& a_{nn} \end{array} \right) =$
$ \left( \begin{array}{ccccc} 1 & 0 & 0 & ... & 0 \\ l_{21} & 1 & 0 & ...& 0 \\ l_{31} & l_{32} & 1 & ... &0 \\  : & : & : & & : \\ l_{n1} & l_{n2} & l_{n3} & ...& 1 \end{array} \right) $
$ \left( \begin{array}{ccccc} u_{11} & u_{12} & u_{13} & ... & u_{1n} \\ 0 & u_{22} & u_{23} & ... & u_{2n} \\ 0 & 0 & u_{33} & ... & u_{3n} \\  : & : & : & & : \\ 0 & 0 & 0 & ... & u_{nn} \end{array} \right) $
を実行すると、
1行目、1列目は
$ \left( \begin{array}{ccccc} a_{11} & a_{12} & a_{13} & ...& a_{1n} \\ a_{21} & a_{22} & a_{23} & ...& a_{2n} \\ a_{31} & a_{32} & a_{33} & ...& a_{3n} \\  : & : & : & & : \\ a_{n1} & a_{n2} & a_{n3} & ...& a_{nn} \end{array} \right) =$
$ \left( \begin{array}{ccccc} u_{11} & u_{12} & u_{13} & ... & u_{1n} \\ l_{21} u_{11} & & & ...& \\ l_{31} u_{11} & & & ... & \\  : & : & : & & : \\ l_{n1} u_{11} & & & ...& \end{array} \right) $
となるので、
$u_{11} = a_{11}$
$u_{12} = a_{12}$
$u_{13} = a_{13}$
:
$u_{1n} = a_{1n}$ がわかり、
$u_{11}$ がわかったので
$l_{21} = a_{21}/u_{11}$
$l_{31} = a_{31}/u_{11}$
:
$l_{n1} = a_{n1}/u_{11}$
もわかる。

2行目も計算すると
$ \left( \begin{array}{ccccc} a_{11} & a_{12} & a_{13} & ...& a_{1n} \\ a_{21} & a_{22} & a_{23} & ...& a_{2n} \\ a_{31} & a_{32} & a_{33} & ...& a_{3n} \\  : & : & : & & : \\ a_{n1} & a_{n2} & a_{n3} & ...& a_{nn} \end{array} \right) =$
$ \left( \begin{array}{ccccc} u_{11} & u_{12} & u_{13} & ... & u_{1n} \\ l_{21} u_{11} & l_{21}u_{12}+u_{22} & l_{21}u_{13}+u_{23} & ...& l_{21}u_{1n}+u_{2n} \\ l_{31} u_{11} & & & ... & \\  : & : & : & & : \\ l_{n1} u_{11} & & & ...& \end{array} \right) $
となるので、
$a_{22} =l_{21} u_{12} +u{22} より、u_{22} = a_{22} - l_{21} u_{12}$
$a_{23} =l_{21} u_{13} +u{23} より、u_{23} = a_{23} - l_{21} u_{13}$
:
$a_{2n} =l_{21} u_{1n} +u{2n} より、u_{2n} = a_{2n} - l_{21} u_{1n}$
になります。
2列目も計算すると
$ \left( \begin{array}{ccccc} a_{11} & a_{12} & a_{13} & ...& a_{1n} \\ a_{21} & a_{22} & a_{23} & ...& a_{2n} \\ a_{31} & a_{32} & a_{33} & ...& a_{3n} \\  : & : & : & & : \\ a_{n1} & a_{n2} & a_{n3} & ...& a_{nn} \end{array} \right) =$
$ \left( \begin{array}{ccccc} u_{11} & u_{12} & u_{13} & ... & u_{1n} \\ l_{21} u_{11} & l_{21}u_{12}+u_{22} & l_{21}u_{13}+u_{23} & ...& l_{21}u_{1n}+u_{2n} \\ l_{31} u_{11} & l_{31}u_{12}+l_{32}u_{22} & & ... & \\  : & : & : & & : \\ l_{n1} u_{11} & l_{n1}u_{12}+l_{n2}u_{22} & & ...& \end{array} \right) $
となるので、
$a_{32} =l_{31} u_{12} +l_{32} u_{22} より、l_{32} =(a_{32} - l_{31} u_{12})/u_{22}$
$a_{n2} =l_{n1} u_{12} +l_{n2} u_{22} より、l_{n2} =(a_{n2} - l_{n1} u_{12})/u_{22}$

3行目も計算すると
$ \left( \begin{array}{ccccc} a_{11} & a_{12} & a_{13} & ...& a_{1n} \\ a_{21} & a_{22} & a_{23} & ...& a_{2n} \\ a_{31} & a_{32} & a_{33} & ...& a_{3n} \\  : & : & : & & : \\ a_{n1} & a_{n2} & a_{n3} & ...& a_{nn} \end{array} \right) =$
$ \left( \begin{array}{ccccc} u_{11} & u_{12}     & u_{13} & ... & u_{1n} \\ l_{21} u_{11} & l_{21}u_{12}+u_{22}    & l_{21}u_{13}+u_{23} & ...& l_{21}u_{1n}+u_{2n} \\ l_{31} u_{11} & l_{31}u_{12}+l_{32}u_{22} & l_{31}u_{13}+l_{32}u_{23}+u_{33} & ... & l_{31}u_{1n}+l_{32}u_{2n}+u_{3n}\\  : & : & : & & : \\ l_{n1} u_{11} & l_{n1}u_{12}+l_{n2}u_{22} & & ...& \end{array} \right) $
となるので、
$u_{33} = a_{33} - l_{31} u_{13}- l_{32} u_{23}$
$u_{3n} = a_{3n} - l_{31} u_{1n}- l_{32} u_{2n}$

3列目も計算すると
$ \left( \begin{array}{ccccc} a_{11} & a_{12} & a_{13} & ...& a_{1n} \\ a_{21} & a_{22} & a_{23} & ...& a_{2n} \\ a_{31} & a_{32} & a_{33} & ...& a_{3n} \\  : & : & : & & : \\ a_{n1} & a_{n2} & a_{n3} & ...& a_{nn} \end{array} \right) =$
$ \left( \begin{array}{ccccc} u_{11} & u_{12}     & u_{13} & ... & u_{1n} \\ l_{21} u_{11} & l_{21}u_{12}+u_{22}    & l_{21}u_{13}+u_{23} & ...& l_{21}u_{1n}+u_{2n} \\ l_{31} u_{11} & l_{31}u_{12}+l_{32}u_{22} & l_{31}u_{13}+l_{32}u_{23}+u_{33} & ... & l_{31}u_{1n}+l_{32}u_{2n}+u_{3n}\\  : & : & : & & : \\ l_{n1} u_{11} & l_{n1}u_{12}+l_{n2}u_{22} & l_{n1}u_{13}+l_{n2}u_{23}+l_{n3}u_{33} & ...& \end{array} \right) $
となるので、
$l_{n3} =(a_{n3} - l_{n1} u_{13}- l_{n2} u_{23})/u_{33}$

さいごまでやると
$a_{nn}=l_{n1}u_{1n}+l_{n2}u_{2n}+l_{n3}u_{3n}+ ...+l_{n,n-1}u_{n-1, n}+u_{nn}$
となるので、
$u_{nn} = a_{nn}- l_{n1} u_{1n}- l_{n2} u_{2n} ... - l_{n,n-1} u_{n-1,n}$
のようにできる。

以上をまとめると
$u_{kj} = a_{kj}- l_{k1} u_{1j}- l_{k2} u_{2j} ... - l_{k,k-1} u_{k-1,j}$
ただしjはk以上nまでの番号

$l_{jk} = ( a_{jk}- l_{j1} u_{1k}- l_{j2} u_{2k} ... - l_{j,k-1} u_{k-1,i} )/u_{kk}$
ただしjはk以上nまでの番号
($l_{kk}$は1と決まっているので、ここは飛ばして k+1からにしてもいいです)


c言語風に書くと

  u[k][j] = a[k][j];
  for( m=1; m < k; m++){
   u[k][j] = u[k][j] - $l$[k][m]*u[m][j];
  }

  $l$[j][k] = a[j][k];
  for( m=1; m < k; m++){
    $l$[j][k] = $l$[j][k] - $l$[j][m]*u[m][k];
    }
  $l$[j][k] = $l$[j][k]/u[k][k];
}
u[][]を求めるのに直前の$l$[][]を使うので、
u[][]だけ先に全部計算することはできません。
u[][]と$l$[][]を交互に求めていく感じにします。

for(k=1; k <=n; k++){
for( j = k; j<=n; j++){
u[k][j] = a[k][j];
for( m=1; m < k; m++){
u[k][j] = u[k][j] - $l$[k][m]*u[m][j];
}

$l$[j][k] = a[j][k];
for( m=1; m < k; m++){
$l$[j][k] = $l$[j][k] - $l$[j][m]*u[m][k];
}
$l$[j][k] = $l$[j][k]/u[k][k];
}
}
でくるんでみると、このページ最初からの式と同じことができるね
k=1;
k=2;
とか入れてみて、たしかめてください

これで、行列 A = ( a[][] )から、
単位下方三角行列 L= ( $l$[][] ) と
上方三角行列 U = ( u[][] ) を求めるプログラム(関数)を
つくることができます。

プログラムを書くとき