LU 分解とは|求め方と連立方程式への使い方
正方行列 を、下三角行列 と上三角行列 の積に書き直すのが LU 分解です。
新しい手法というより、掃き出し法で消去した記録をそのまま行列にしたものです。消去のたびに使った倍率が に、変形後の行列が に残ります。
いちど分解しておけば、同じ係数行列に対する連立方程式が代入だけで解けます。行列式も対角成分を掛けるだけで求まります。
<svg viewBox="0 0 460 210" width="100%" style="max-width:460px;display:block;margin:0 auto">
<rect x="30" y="45" width="100" height="100" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
<text x="80" y="100" font-size="15" fill="#1f1f1f" text-anchor="middle">A</text>
<text x="80" y="34" font-size="11" fill="#9a9a9a" text-anchor="middle">もとの行列</text>
<text x="150" y="102" font-size="15" fill="#9a9a9a" text-anchor="middle">=</text>
<polygon points="175,45 175,145 275,145" fill="#1b81e0" fill-opacity="0.12"></polygon>
<rect x="175" y="45" width="100" height="100" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
<text x="205" y="128" font-size="15" fill="#1b81e0" text-anchor="middle">L</text>
<text x="225" y="34" font-size="11" fill="#9a9a9a" text-anchor="middle">下三角(対角は 1)</text>
<polygon points="320,45 420,45 420,145" fill="#1b81e0" fill-opacity="0.12"></polygon>
<rect x="320" y="45" width="100" height="100" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
<text x="390" y="70" font-size="15" fill="#1b81e0" text-anchor="middle">U</text>
<text x="370" y="34" font-size="11" fill="#9a9a9a" text-anchor="middle">上三角</text>
<line x1="175" y1="45" x2="275" y2="145" stroke="#9a9a9a" stroke-width="1" stroke-dasharray="3 3"></line>
<line x1="320" y1="45" x2="420" y2="145" stroke="#9a9a9a" stroke-width="1" stroke-dasharray="3 3"></line>
<text x="230" y="180" font-size="11" fill="#9a9a9a" text-anchor="middle">対角より上と下に、それぞれ成分が集まった 2 つの行列に分けます</text>
<text x="230" y="198" font-size="11" fill="#9a9a9a" text-anchor="middle">白い側はすべて 0 です</text>
</svg>LU 分解とは
次正方行列 に対して、対角成分がすべて の下三角行列 と、上三角行列 を見つけて と書くことを LU 分解といいます。
の対角を に決めておくのは、分解を一通りに定めるためです。この決め方をドゥーリトル法といいます。逆に の対角を にする流儀もあり、そちらはクラウト法と呼ばれます。
対角を別に取り出した という書き方もあります。 と の対角をともに にし、 に大きさを集める形です。
掃き出しの前半がそのまま分解になる
上三角に変形する操作は、ある行の定数倍を下の行から引くことの繰り返しです。この倍率を覚えておくだけで が作れます。
第 列で第 行を消すときの倍率を と書くと、 の 成分がその になります。変形し終えた行列が です。
消去は「引く」操作、復元は「足す」操作です。 は引いた分を足し戻す行列で、だから対角より下に倍率がそのまま並びます。
例:3 次の行列を LU 分解する
次の行列を分解します。
第 1 列を消します。第 2 行からは第 1 行の 倍を引き、第 3 行からは 倍を引きます。倍率は 、 です。
第 2 行は 、第 3 行は になります。続けて第 2 列を消すと、倍率は で、第 3 行が になります。
倍率を並べたものが 、変形後が です。
掛け戻して確かめる
を計算すると、 の第 行が の各行をどれだけ混ぜるかを表していると分かります。
第 2 行なら です。もとの第 2 行に戻ります。
第 3 行は です。こちらも一致します。
消去で引いたものを足し戻しているだけなので、当然そうなります。
連立方程式は 2 段階に分かれる
に を入れると です。 と置けば、三角の方程式が 2 つ並びます。
まず を上から順に解きます。 の対角が なので、割り算すら要りません。これを前進代入といいます。
次に を下から順に解きます。こちらは後退代入です。どちらも 程度の手数で終わります。
<svg viewBox="0 0 460 190" width="100%" style="max-width:460px;display:block;margin:0 auto">
<rect x="20" y="60" width="110" height="50" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
<text x="75" y="90" font-size="13" fill="#1f1f1f" text-anchor="middle">A x = b</text>
<line x1="140" y1="85" x2="185" y2="85" stroke="#9a9a9a" stroke-width="1"></line>
<polygon points="185,85 177,81 177,89" fill="#9a9a9a"></polygon>
<text x="162" y="76" font-size="11" fill="#9a9a9a" text-anchor="middle">分解</text>
<rect x="195" y="25" width="110" height="50" fill="#1b81e0" fill-opacity="0.12" stroke="#1b81e0" stroke-width="1"></rect>
<text x="250" y="55" font-size="13" fill="#1f1f1f" text-anchor="middle">L y = b</text>
<rect x="195" y="105" width="110" height="50" fill="#1b81e0" fill-opacity="0.12" stroke="#1b81e0" stroke-width="1"></rect>
<text x="250" y="135" font-size="13" fill="#1f1f1f" text-anchor="middle">U x = y</text>
<line x1="250" y1="75" x2="250" y2="100" stroke="#9a9a9a" stroke-width="1"></line>
<polygon points="250,105 246,97 254,97" fill="#9a9a9a"></polygon>
<text x="320" y="55" font-size="11" fill="#9a9a9a">前進代入(上から順に)</text>
<text x="320" y="135" font-size="11" fill="#9a9a9a">後退代入(下から順に)</text>
<text x="230" y="180" font-size="11" fill="#9a9a9a" text-anchor="middle">三角の方程式は代入だけで解けます</text>
</svg>例:LU 分解で連立方程式を解く
さきほどの に対して、右辺を とします。
を上から解きます。第 1 式から 、第 2 式の から です。
第 3 式は なので、 になります。割り算が 1 度も出てきません。
次に を下から解きます。、 から 、 から です。
解は になります。 を計算すると に戻ります。
右辺が変わっても分解を使い回せる
同じ で右辺だけが違う方程式を何本も解く場面はよくあります。掃き出し法をやり直すと毎回 程度かかります。
LU 分解なら、分解は 1 回で済みます。右辺が増えても代入の が追加されるだけです。
逆行列を作って掛ける方法より速く、しかも誤差の面でも有利です。逆行列を陽に求める必要は、実はほとんどありません。
行列式は U の対角の積になる
三角行列の行列式は対角成分の積です。 の対角はすべて なので になります。
余因子展開が 個の項を持つのに対して、こちらは分解の 回で済みます。大きな行列式を数値で求めるときの標準的なやり方です。
例:行列式を LU 分解から求める
さきほどの の対角は 、、 でした。
余因子展開で確かめても同じ値になります。分解ができていれば、行列式は掛け算 2 回で出ます。
分解が存在する条件
行の入れ替えなしで LU 分解ができるのは、左上から取った小行列式がすべて でないときです。これを首座小行列式といいます。
このとき の対角を に決めれば、分解は一通りに決まります。 の形なら、正則行列に対して一意性がそのまま成り立ちます。
さきほどの例では首座小行列式が 、、 で、どれも ではありません。だから入れ替えなしで分解できました。
例:ピボットが 0 で分解できない行列
次の行列は、行を入れ替えないと分解できません。
と書けたとすると、 成分の比較から が出ます。
すると第 2 行の 成分は になり、 にはなりません。矛盾するので分解は存在しません。
正則であっても分解できない例がある、というのがこの行列の意味です。首座小行列式の 次が になっているのが原因です。
行の入れ替えを入れた PA = LU
行を先に入れ替えておけば、どんな正則行列でも分解できます。入れ替えを表す置換行列を と書きます。
は単位行列の行を並べ替えたもので、 は入れ替えの回数が偶数なら 、奇数なら です。行列式は符号のぶんだけ変わります。
方程式を解くときは、右辺にも同じ入れ替えを施して から始めます。
例:置換を入れて分解する
左上が の行列で試します。
第 1 行と第 2 行を入れ替えると、左上が になって消去を始められます。倍率は 、続いて です。
の対角の積は です。入れ替えが 1 回なので符号が変わり、 になります。
部分ピボット選択と数値の安定性
入れ替えは、ピボットが のときだけの応急処置ではありません。 に近い値で割ると誤差が拡大するので、実際の計算では毎回いちばん絶対値の大きい成分を選んで上へ持ってきます。
この選び方を部分ピボット選択といいます。倍率がすべて 以下に収まるので、消去のあいだに値が暴れにくくなります。
入れ替えをしない素朴な消去は、理論上は正しくても数値計算では不安定です。数値解析の教科書がピボット選択を必ず扱うのは、このためです。
分数が出ない行を選びたい。 でないピボットが取れれば、それ以上の工夫は要りません
絶対値がいちばん大きいピボットを選びます。誤差の拡大を防ぐことが目的で、 かどうかだけの問題ではありません
LDU 分解と対称行列
対角を分けた で が対称なら、 は の転置になります。 と書ける形です。
さらに が正定値なら の成分がすべて正なので、平方根を に配って にできます。これがコレスキー分解です。
コレスキー分解ではピボット選択が要らず、計算量も LU のおよそ半分の で済みます。対称正定値と分かっているなら、こちらを使います。
計算量
分解そのものは 回程度の掛け算と足し算で終わります。前進代入と後退代入は、それぞれ 程度です。
つまり最初の 1 本だけが重く、2 本目からは軽くなります。右辺が 本あるときの総手数は の形になります。
と は と同じ配列に上書きできます。 の対角は と決まっているので、記録する必要がないからです。
ブロックで見るとシューア補元
行を 2 つの組に分けて、ブロックのまま同じ消去をすると、右下にシューア補元が現れます。
ここで です。左の行列が にあたり、右の行列を同じ手続きで分解し続ければ LU 分解が組み上がります。
成分ごとの消去は、 次のブロックに区切った場合にあたります。詳しくはブロック行列とシューア補元の記事にあります。
他の話題とのつながり
消去の手順そのものは掃き出し法の記事で、変形を行列の積に書き直す話は基本行列の記事で扱っています。LU 分解は、その 2 つを「分解」という形にまとめたものです。
行列式を求める道具としては、クラメルの公式と対照的です。あちらは理論的な表示を与え、こちらは数値を求める手順を与えます。
直交行列を使う QR 分解は、計算量が LU の 2 倍ほどかかる代わりに数値的な安定性で勝ります。最小二乗法ではそちらが選ばれます。
正方でない行列や階数が落ちた行列では、分解の形が変わります。解の存在と自由度の話は、連立一次方程式の解の構造の記事にあります。











