コレスキー分解シミュレーター 戻る
数値解析

コレスキー分解シミュレーター

対称な 3×3 行列を A=LLᵀ という下三角行列の積に分解するツールです。対角成分と非対角成分を変えると、シルベスター判定による正定値性、下三角行列 L の各成分、行列式、そして LU 分解の半分という演算量がリアルタイムで分かります。

パラメータ設定
対称行列 A の対角成分3つと非対角成分3つを設定します。対称性は自動的に保たれ、A[i][j]=A[j][i] となります。
対角成分 a₁₁
対角成分 a₂₂
対角成分 a₃₃
非対角成分 a₁₂ = a₂₁
非対角成分 a₁₃ = a₃₁
非対角成分 a₂₃ = a₃₂
非対角成分を大きくすると正定値性が崩れやすくなります。
計算結果
正定値性
L₁₁
L₂₁
L₂₂
L₃₃
行列式 det(A)
行列 A と下三角因子 L — 分解アニメーション

左が入力行列 A、右が下三角因子 L です。各セルは値の大きさで色が変わり、L の成分が L₁₁→L₂₁→L₃₁→L₂₂→L₃₂→L₃₃ の計算順にハイライトされます。正定値でない場合は分解できないことを表示します。

主座小行列式(シルベスター判定)
演算量の比較(コレスキー・LU・逆行列)
理論・主要公式

$$A=LL^{\mathsf T},\qquad L_{jj}=\sqrt{A_{jj}-\sum_{k\lt j}L_{jk}^2}$$

対称正定値行列 A は、下三角行列 L とその転置 Lᵀ の積に分解できます。対角成分 L_jj は、対応する A の対角成分から既に求めた行の二乗和を引き、平方根をとって求めます。

$$L_{ij}=\frac{1}{L_{jj}}\Big(A_{ij}-\sum_{k\lt j}L_{ik}L_{jk}\Big)\quad(i\gt j)$$

非対角成分 L_ij(i>j)は、A_ij から既に求めた成分の積和を引き、対角成分 L_jj で割って求めます。平方根の中身が0以下になれば、その行列は正定値ではありません。

$$\det(A)=(L_{11}L_{22}L_{33})^2,\qquad \text{演算量}\approx \tfrac{n^3}{3}$$

行列式は L の対角成分の積の二乗で得られます。コレスキー分解の演算量は約 n³/3 で、LU 分解(約 2n³/3)のちょうど半分です。

コレスキー分解とは

🙋
「コレスキー分解」って名前は聞いたことがあるんですけど、結局なにをする計算なんですか?
🎓
ざっくり言うと、ある行列 A を「下三角行列 L とその転置 Lᵀ の掛け算」に書き直す計算だよ。つまり A=LLᵀ。数を平方根に分解するのと似ていて、行列版の√みたいなものなんだ。例えば 4 を 2×2 に分解するように、行列 A を L×Lᵀ に分解する。こうしておくと、連立方程式 Ax=b が下三角と上三角の2段階で一気に解けるようになるんだ。
🙋
どんな行列でも分解できるんですか?左の非対角成分 a₂₃ を大きくしていくと、急に「非正定値」って赤くなりました。
🎓
いいところに気づいたね。コレスキー分解が使えるのは「対称」かつ「正定値」な行列だけなんだ。対称は A[i][j]=A[j][i]、正定値はどんなベクトル x をぶつけても xᵀAx が必ずプラスになる、という性質。非対角成分を大きくしすぎると、行列が正定値でなくなる。そうなると分解の途中で「マイナスの数の平方根」を取ろうとして破綻するんだ。だから左でグラフが赤くなったのは、まさにその「分解できない領域」に入ったサインだよ。
🙋
正定値かどうかって、どうやって見分けるんですか?毎回ベクトルを全部試すのは無理ですよね。
🎓
そこで「シルベスターの判定法」だ。左上から順に大きくしていく小さな正方形の行列式——主座小行列式 M1, M2, M3 を計算して、3つとも正なら正定値、と判定できる。下の棒グラフがその M1・M2・M3 だよ。さらに面白いのは、コレスキー分解そのものが最も安いテストだということ。実際に分解してみて、途中で平方根の中身が0以下になったら「あ、この行列は正定値じゃないな」と即座に分かる。わざわざ別の判定をしなくてもいいんだ。
🙋
LU 分解っていうのも習いました。コレスキー分解とはどう使い分けるんですか?
🎓
LU 分解はどんな正方行列にも使える万能選手。対してコレスキー分解は「対称正定値」専用の特化版だ。専用にしたぶん、計算が速い。LU は演算量が約 2n³/3 だけど、コレスキーは対称性を使うから約 n³/3——ちょうど半分で済む。下の「演算量の比較」グラフを見ると、逆行列をまるごと求める n³ と比べても、コレスキーが一番安いのが分かるはずだ。だから「対称正定値だと分かっているなら、迷わずコレスキー」が定石だよ。
🙋
そんなに速くて安定なら、実際の解析ソフトでもよく使われているんですか?
🎓
まさにそう。有限要素法(FEM)の剛性行列はたいてい対称正定値になるから、その連立方程式を解く直接法ソルバーの中心がコレスキー分解なんだ。ほかにも最小二乗法の正規方程式、カルマンフィルタやガウス過程に出てくる共分散行列の扱い、相関のある乱数のサンプリングなど、対称正定値行列が顔を出す場面では必ずと言っていいほど登場する。地味だけど、数値計算の屋台骨を支える基本ツールだよ。

よくある質問

コレスキー分解 A = L·Lᵀ は、対称かつ正定値(SPD)な行列に対してのみ存在します。対称とは A[i][j]=A[j][i]、正定値とは任意の非零ベクトル x に対し xᵀAx>0 が成り立つことです。実用上は、すべての主座小行列式が正であること(シルベスターの判定法)で正定値性を判定できます。対称でない行列や、正定値でない行列にはコレスキー分解は使えず、その場合は LU 分解や LDLᵀ 分解を使います。
対称行列の正定値性は、シルベスターの判定法(主座小行列式がすべて正)で確認できます。3×3 なら M1=a11、M2=a11·a22−a12²、M3=det(A) の3つを計算し、3つとも正であれば正定値です。本ツールはこの M1・M2・M3 を棒グラフで表示します。実は、コレスキー分解を試みること自体が最も安価な正定値性テストです。途中で平方根の中身が0以下になれば、その行列は正定値ではないと即座に分かります。
LU 分解は一般の正方行列を A=LU に分解しますが、コレスキー分解は対称正定値行列に特化し A=LLᵀ と分解します。対称性を利用するため、必要な演算量は約 n³/3 で、LU 分解の約 2n³/3 のちょうど半分です。記憶領域も下三角部分だけで済みます。さらにコレスキー分解はピボット選択なしで数値的に安定なため、対称正定値系では LU より優先して使われます。
有限要素法(FEM)の剛性行列は対称正定値になることが多く、その連立方程式 Ku=f を解く標準的な直接法ソルバーがコレスキー分解です。ほかにも最小二乗法の正規方程式 AᵀA x = Aᵀb、ガウス過程やカルマンフィルタで現れる共分散行列の扱い、相関のある乱数を生成するサンプリングなど、対称正定値行列が出てくるあらゆる場面で利用されます。

実世界での応用

有限要素法(FEM)の構造解析:線形静解析で組み立てられる全体剛性行列 K は、適切に拘束条件を入れれば対称正定値になります。連立方程式 Ku=f を直接法で解くソルバーの中核がコレスキー分解(および疎行列向けの変種であるスパース・コレスキー)です。同じ K に対して荷重ベクトル f だけを変えて何度も解く荷重ケース計算では、一度分解した L を使い回せるため、前進・後退代入だけで高速に解けます。

最小二乗法と回帰分析:観測データへの当てはめで現れる正規方程式 AᵀA x = Aᵀb の係数行列 AᵀA は対称半正定値です。フルランクであれば正定値となり、コレスキー分解で安定かつ高速に解けます。多項式フィッティング、センサーキャリブレーション、測量の網平均など、過剰決定系を扱うあらゆる場面で使われます。

カルマンフィルタとガウス過程:状態推定や機械学習で扱う共分散行列は対称正定値です。カルマンフィルタの数値的に安定な実装(平方根フィルタ)はコレスキー因子を直接更新します。ガウス過程回帰では、カーネル行列のコレスキー分解が予測分布の計算と対数尤度の評価の両方に使われます。

相関のある乱数のサンプリング:多変量正規分布 N(μ, Σ) からサンプルを生成するとき、共分散行列 Σ=LLᵀ をコレスキー分解し、独立な標準正規乱数 z に対して x=μ+Lz とすれば、所望の相関を持つ乱数が得られます。モンテカルロ・シミュレーションや金融工学のリスク評価で基本的な手法です。

よくある誤解と注意点

まず多いのが、「対称でありさえすればコレスキー分解できる」という誤解です。コレスキー分解には対称性に加えて正定値性が必須です。対称でも固有値に負のものが混じっていれば(不定値・負定値)、分解の途中で平方根の中身が負になり破綻します。本ツールで非対角成分を大きくしていくと判定が「非正定値」に変わるのはこのためです。対称だが正定値でない行列を扱いたい場合は、平方根を使わない LDLᵀ 分解や、ピボット付きの分解を選びます。

次に、「正規方程式 AᵀA をコレスキーで解けば常に安心」という思い込み。理論上 AᵀA は対称正定値ですが、A の条件数が大きいと AᵀA の条件数はその二乗になり、数値誤差が増幅されます。悪条件の最小二乗問題では、正規方程式+コレスキーよりも、A を直接 QR 分解する方が数値的に安定です。コレスキーが速いからといって、条件数を確認せずに使うのは危険です。

最後に、「演算量が半分なら計算時間も常に半分」という単純化。理論的な浮動小数点演算回数はコレスキーが LU の半分ですが、実際の計算時間はメモリアクセスのパターン、キャッシュ効率、疎行列のフィルイン(分解で新たに非零になる成分)に強く依存します。大規模な疎行列では、節点の並べ替え(リオーダリング)でフィルインをどれだけ抑えられるかが、演算量の係数より支配的になることも珍しくありません。「n³/3」はあくまで密行列の目安として理解してください。

使い方ガイド

  1. 対称行列Aの成分a11、a22、a33(対角要素)をスライダーまたは入力欄で設定します。範囲は各パラメータのRangeで指定できます
  2. 非対角要素a12を設定すると、自動的にa21=a12に同期されます。シミュレーターが対称性を保証します
  3. 「計算実行」ボタンをクリックするとコレスキー分解A=LLᵀが実行され、下三角行列Lの成分L₁₁、L₂₁、L₂₂、L₃₃と正定値性判定、行列式det(A)がリアルタイム表示されます

具体的な計算例

3×3対称行列A=[4, 2, 0; 2, 3, 1; 0, 1, 2](単位はN/mm²の剛性マトリックス想定)で計算した場合:a11=4、a22=3、a33=2、a12=2とします。コレスキー分解によりL=[2, 0, 0; 1, 1.414, 0; 0, 0.707, 1.225]が得られ、L₁₁=2、L₂₁=1、L₂₂≈1.414、L₃₃≈1.225となります。行列式det(A)=4×1.414²×1.225²≈4.765となり、すべての対角要素が正であるため正定値と判定されます

実務での注意点