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

連立方程式
$ \begin{array}{rcccc} 7 x_1&+ 4 x_2&+ 3 x_3&+ x_4 &=25\\ 2 x_1&+ 5 x_2&+ x_3&+ 4 x_4 &=12\\ 6 x_1&+ 9 x_2&+ 2 x_3&+ 5 x_4 &=103\\ x_1& &+ 8 x_3&+ 3 x_4 &=44 \end{array} $
は、行列を使って次のように書くことができます。

$ \left( \begin{array}{cccc} 7 & 4 & 3 & 1 \\ 2 & 5 & 1 & 4 \\ 6 & 9 & 2 & 5 \\ 1 & 0 & 8 & 3 \end{array} \right) \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ x_4 \end{array} \right) = \left( \begin{array}{c} 25\\ 12\\ 103\\ 44 \end{array} \right) $
線形代数では、逆行列を左からかければ $ \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ x_4 \end{array} \right) $が求まります、と習います。

ところで皆さん、上の問題と、次の問題の、どちらが楽ですか?
$ \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 2 & 1 & 0 & 0 \\ 6 & 9 & 1 & 0 \\ 1 & 0 & 8 & 1 \end{array} \right) \left( \begin{array}{c} x_1\\ x_2\\ x_3\\ x_4 \end{array} \right) = \left( \begin{array}{c} 25\\ 12\\ 103\\ 44 \end{array} \right) $

こっちのほうが簡単ですよね。
1行目を見れば$x_1$が$25$と分かり、
それを使えば$2x_1+x_2 =12$だから$x_2$もわかり、、、、
右上が全部0で、斜め1列が1というのがいいですね。
こういうのを「単位左下三角行列」というそうです。
下のほう(Lower)にしか数値がないので、これに$L$という名前を付けます。
$ \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}{c} x_1\\ x_2\\ x_3\\ :\\ x_n \end{array} \right) = \left( \begin{array}{c} b_1\\ b_2\\ b_3\\ :\\ b_n\\ \end{array} \right) $

1行目を見れば
$x_1=b_1$
それを使って、 $l_{21}x_1 + x_2=b_2 $ より
$x_2=b_2 - l_{21}x_1$
$x_2$もわかったから
$x_3=b_3 - l_{31}x_1 - l_{32}x_2$
$x_4=b_4 - l_{41}x_1 - l_{42}x_2- l_{43}x_3$
$x_5=b_5 - l_{51}x_1 - l_{52}x_2- l_{53}x_3- l_{54}x_4$
ひとつまえの$x_4$が求まってから次の$x_5$を計算するので、無理なくできます。

この$x_5$の式、c言語で小分けにして書くと
x[5] = b[5];
x[5] = x[5] - $l$[5][1] * x[1];
x[5] = x[5] - $l$[5][2] * x[2];
x[5] = x[5] - $l$[5][3] * x[3];
x[5] = x[5] - $l$[5][4] * x[4];
てことなので、1,2,3,4 と変わっていく数をkとすれば、
x[5] = b[5];
for(k=1; k<5; k++){
  x[5] = x[5] -$l$[5][k] * x[k];
}
とかけます。

$x_4$の式なら
x[4] = b[4];
for(k=1; k<4; k++){
  x[4] = x[4] -$l$[4][k] * x[k];
}
でいいですよね。

いま、4行目と5行目だけ書いてみましたが、これが1行目から$n$行目
$x_n = b_n - l_{n1}x_1 - l_{n2}x_2- l_{n3}x_3- l_{n4}x_4 ... - l_{n n-1}x_{n-1} $
まであるので、
4とか5のところをiに変えて、
i=1からi=n まですれば

for(i=1; i<=n; i++){
  x[i] = b[i];
  for(k=1; k < i ; k++){
    x[i] = x[i] -$l$[i][k] * x[k];
   }
 }

これで「単位左下三角行列」の連立方程式が解けます。

$ \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}{c} x_1\\ x_2\\ x_3\\ :\\ x_n \end{array} \right) = \left( \begin{array}{c} b_1\\ b_2\\ b_3\\ :\\ b_n\\ \end{array} \right) $


次へ