条件数シミュレーター 戻る
数値解析

条件数シミュレーター — 行列の悪条件性

2×2行列 A の条件数 κ(A) を計算し、悪条件性を可視化するツールです。行列の成分を動かすと、特異値・行列式・解の誤差増幅率がリアルタイムで変わり、連立方程式 A·x=b の数値解がデータの微小誤差でどれだけ狂うかを単位円の像(楕円)で直感的に確かめられます。

パラメータ設定
行列成分 a11
行列 A の1行1列目(左上)の要素
行列成分 a12
行列 A の1行2列目(右上)の要素
行列成分 a21
行列 A の2行1列目(左下)の要素
行列成分 a22
行列 A の2行2列目(右下)の要素
入力 b の摂動の大きさ δ
右辺ベクトル b に加える微小誤差。これが解 x にどれだけ拡大されるかを実測します
計算結果
条件数 κ(A)
最大特異値 σ_max
最小特異値 σ_min
行列式 det(A)
解の誤差増幅率
条件の判定
線形写像 — 単位円から楕円へ

行列 A は単位円を楕円に写します。楕円の半軸の長さがちょうど σ_max と σ_min。円に近い楕円は良条件、薄い針状の楕円は悪条件を意味します。

特異値と条件数
誤差増幅 — 入力誤差に対する解の誤差
理論・主要公式

$$\kappa(A)=\lVert A\rVert\,\lVert A^{-1}\rVert=\frac{\sigma_{max}}{\sigma_{min}}$$

2ノルム条件数 κ(A)。σ_max・σ_min は行列 A の最大・最小特異値で、A による「最も伸びる方向」と「最も縮む方向」の倍率を表す。

$$\frac{\lVert\Delta x\rVert}{\lVert x\rVert}\le\kappa(A)\,\frac{\lVert\Delta b\rVert}{\lVert b\rVert}$$

誤差の上限。右辺 b の相対誤差は、解 x の相対誤差として最悪 κ(A) 倍まで拡大されうる。κ=1 が理想(誤差が増幅されない)、κ≫1 は悪条件で数値的に危険。

$$M=A^{\mathsf T}A,\quad \sigma=\sqrt{\lambda(M)}$$

特異値の求め方。対称行列 M=AᵀA の固有値 λ の平方根が A の特異値。2×2 なら固有値は tr/det から解析的に求まる。

条件数とは

🙋
「条件数」って言葉、数値計算の授業で出てきたんですけど、結局なんの数字なんですか?
🎓
ざっくり言うと「その問題、データのちょっとした誤差にどれくらい敏感か」を測る数字だよ。連立方程式 A·x=b を解く場面を考えてみて。右辺の b は測定値だったりするから、必ず少し誤差を含んでいる。条件数 κ(A) は、その b の相対誤差が、答え x の相対誤差として最悪何倍に拡大されるかを表す倍率なんだ。κ が 1 なら誤差はそのまま、κ が 1000 なら最悪 1000 倍に膨らむ、というわけ。
🙋
えっ、最悪1000倍ですか…。左のスライダーをいじると、デフォルトでもう κ が約399って出てます。これってどうやって計算してるんですか?
🎓
2ノルムの条件数は κ(A)=σ_max/σ_min、つまり最大特異値を最小特異値で割った値なんだ。特異値っていうのは、行列 A が空間をどれだけ「伸ばす・縮める」かを表す量で、上のキャンバスを見ると分かりやすい。A は単位円を楕円に写すんだけど、その楕円の長半径が σ_max、短半径が σ_min。デフォルトの行列だと楕円がかなり潰れた葉巻みたいな形になってるだろう? σ_max≈3.99 に対して σ_min≈0.01。比を取ると約399になる。
🙋
なるほど、楕円が潰れてるほど悪い行列ってことですね。でも、行列式(det)が小さいと特異に近いって習った気がします。det じゃダメなんですか?
🎓
いい質問だね。それ、すごくよくある誤解なんだ。det はスケールに引きずられる。例えば行列を全部1000倍すると det は 100万倍になるけど、悪条件性は全く変わってない。条件数 σ_max/σ_min は比だからスケール不変で、こっちが正しい指標。デフォルト行列の det は 0.0399 で、確かに小さいけど、本当に効くのは κ≈399 のほうだよ。「det が小さい=特異っぽい」はヒント止まり、判断は κ でする。
🙋
下のほうに「解の誤差増幅率」っていうカードがありますね。これは κ とは別物ですか?
🎓
それは「実測値」だよ。固定した右辺 b に δ だけ摂動を加えて、実際に方程式を2回解いて、解 x がどれだけ変わったかを測ってる。理論上、この増幅率は必ず κ 以下に収まる ── ‖Δx‖/‖x‖ ≤ κ·‖Δb‖/‖b‖ という不等式があるからね。κ は「最悪値の保証」、増幅率は「今回の実測」。δ のスライダーを動かしても増幅率がだいたい一定なのは、線形だからだ。κ がその上限の「天井」になっていることを、下の誤差増幅グラフで確かめてみて。
🙋
じゃあ、悪条件の行列に出くわしたら、どうすればいいんですか?
🎓
まず「気づくこと」が一番大事。κ を計算せずに普通に解いて、答えを信じてしまうのが一番危ない。実務では、行や列をスケーリングして見かけの κ を下げたり、部分ピボット付きLU分解やQR分解みたいな安定なアルゴリズムを使ったりする。最小二乗問題なら正規方程式(条件数が2乗になる)を避けてQRやSVDを使う。それでも本質的に悪条件なら、リッジ回帰のような正則化で解を安定させる。要は「κ を先に知って、それに見合った手法を選ぶ」ことだね。

よくある質問

条件数 κ(A) は、連立一次方程式 A·x=b を解くとき、データ b(や行列 A、丸め誤差)に含まれる相対誤差が、解 x の相対誤差として最悪どこまで拡大されうるかを示す倍率です。2ノルムでは κ(A)=σ_max/σ_min(最大特異値÷最小特異値)で定義されます。κ≈1 は完全な良条件(直交行列が代表例)、κ が大きいほど行列がほぼ特異に近く、数値解が危うくなります。
誤差の境界 ‖Δx‖/‖x‖ ≤ κ(A)·‖Δb‖/‖b‖ から、κ が大きいほど入力の小さな誤差が解で大きく拡大されます。例えば κ=10^6 なら、データの相対誤差 10^-7 が解では 10^-1(10%)まで増幅されうる、ということです。倍精度演算の丸め誤差(約10^-16)でも κ が10^14 を超えると有効数字がほぼ失われます。条件数は連立方程式の「数値的な信頼度」を測る指標です。
行列式 det(A) が小さいと「特異に近い」と言われますが、det はスケールに依存するため悪条件の指標としては不適切です。例えば行列全体を 1000 倍すると det は 10^6 倍になりますが、条件数は変わりません。条件数は σ_max と σ_min の比なのでスケール不変であり、悪条件性を正しく表します。det≈0 は特異性のヒントにはなりますが、悪条件かどうかは κ で判断すべきです。
まず問題の定式化を見直します。スケーリング(行・列の正規化)で見かけの条件数を改善できる場合があります。それでも本質的に悪条件なら、ピボット選択付きの安定なアルゴリズム(部分ピボット付きLU分解、QR分解)を使い、最小二乗問題には正規方程式でなくQRやSVDを用います。さらに正則化(リッジ回帰、Tikhonov 正則化)で解を安定化させる手段もあります。重要なのは「条件数を事前に把握し、それに見合った手法を選ぶ」ことです。

実世界での応用

有限要素法(FEM)の剛性行列:構造解析の剛性行列は、薄い要素・極端なアスペクト比のメッシュ・大きく異なる材料剛性が混在すると条件数が悪化します。条件数が悪いと反復ソルバー(共役勾配法など)の収束が極端に遅くなり、直接ソルバーでも丸め誤差で変位や応力が信用できなくなります。CAE実務でメッシュ品質を厳しくチェックするのは、見た目だけでなく剛性行列の条件数を健全に保つためでもあります。

最小二乗法・回帰分析:多項式回帰や説明変数が強く相関したデータでは、正規方程式 AᵀA·x=Aᵀb の行列がほぼ特異になります。AᵀA の条件数は A の条件数の2乗になるため、悪条件が一気に深刻化します。これが「多重共線性」の正体で、回帰係数が観測ノイズで大きく振れる原因です。実務ではQR分解やSVD、リッジ回帰で対処します。

逆問題・画像復元:CT再構成、デコンボリューション、地球物理の逆解析などの逆問題は、本質的に悪条件(しばしば条件数が無限大に近い「ill-posed問題」)です。観測データの微小なノイズが復元結果を大きく乱すため、Tikhonov 正則化や打ち切りSVDで「滑らかさ」や「事前知識」を加えて解を安定化させます。条件数の概念は、こうした正則化パラメータを選ぶ指針になります。

制御工学・数値最適化:状態空間モデルの可制御性・可観測性グラム行列、最適化の二次形式のヘッセ行列なども条件数で評価されます。ヘッセ行列の条件数が大きいと最急降下法が「細長い谷」をジグザグに進んで収束が遅くなります。これがニュートン法や前処理付き勾配法が必要になる理由で、条件数は数値手法選択の共通言語になっています。

よくある誤解と注意点

まず最大の誤解が、「行列式が小さければ悪条件、大きければ良条件」という思い込みです。行列式 det(A) はスケールに完全に依存します。例えば 2×2 の単位行列を 0.001 倍した行列 0.001·I は、det が 10^-6 と非常に小さいですが、条件数は 1(完璧な良条件)です。逆に大きな det を持つ行列が極端な悪条件であることもあります。条件数 σ_max/σ_min は比なのでスケール不変であり、これだけが悪条件性の正しい尺度です。det はあくまで「特異性のヒント」程度に留めてください。

次に、「条件数が大きいのは行列やアルゴリズムのせいだ」という誤解。条件数は問題そのものに固有の性質であり、解き方とは無関係です。κ=10^10 の問題は、どんなに優れたアルゴリズムを使っても、入力誤差が10^10 倍に拡大されうるという事実は変わりません。良いアルゴリズム(後退安定なアルゴリズム)が保証するのは「アルゴリズム自身が余計な誤差を増やさないこと」だけで、問題固有の条件数による誤差増幅は避けられません。悪条件の問題は、解法ではなく「問題の定式化」を変えることでしか改善できません。

最後に、「残差が小さければ解は正確だ」という思い込み。連立方程式の解 x̂ について、残差 ‖b−A·x̂‖ が小さくても、真の解との誤差 ‖x−x̂‖ は小さいとは限りません。誤差は残差に条件数を掛けた分まで大きくなりえます ── 悪条件の行列では「残差はほぼゼロなのに解は全く違う」ことが起こります。逆に、悪条件下では真の解に近い x でも残差が大きく見えることもあります。残差だけを見て解の精度を判断するのは危険で、必ず条件数とセットで評価してください。

使い方ガイド

  1. 2×2行列の各要素(a11, a12, a21, a22)を入力フィールドまたはスライダーで設定します
  2. 「計算実行」ボタンを押すと、条件数κ(A)、特異値σ_max・σ_min、行列式det(A)が自動計算されます
  3. 出力された誤差増幅率(κ(A)倍)と条件判定(良好/悪条件/極度に悪条件)を確認し、連立方程式Ax=bの数値安定性を評価します
  4. スライダーを動かしてリアルタイムに条件数の変化を観察し、行列の悪条件性が数値解に与える影響を可視化します

具体的な計算例

鋼構造物の応力解析で3点の変位を求める場合、剛性行列A=[1000, 999; 999, 998](単位:kN/mm)が生成されたとします。σ_max≈1999、σ_min≈1となり、κ(A)≈1999です。入力ベクトルbの相対誤差が0.1%の場合、解xの相対誤差は約199%に増幅されます。一方、A=[1, 0; 0, 1]の単位行列ではκ(A)=1であり、入力誤差0.1%に対して解の誤差も0.1%に抑制されます。

実務での注意点