固有値と固有ベクトル——行列が「伸ばすだけ」の方向
固有値・固有ベクトルとは
「行列は空間を変形させる道具」——普通は矢印(ベクトル)の向きも変えてしまいます。しかし「向きは変えずに長さだけ変える」特別な方向があります。それが固有ベクトルの方向で、伸びる倍率が固有値です。
たとえばゴムシートを横方向に引っ張ったとき、横方向のベクトルは向きを変えずに伸び、縦方向のベクトルは向きを変えずに縮む——こういう「変形しても向きが変わらない特別な方向」が固有ベクトルです。
行列 に対して、次の条件を満たすゼロでないベクトル とスカラー を考えます:
- :固有ベクトル(eigenvector)——「向きが変わらない特別な方向」
- :固有値(eigenvalue)——「どれだけ伸縮するかの倍率」
意味: でベクトル を変換すると、向きが変わらずに 倍に伸縮するだけ。
普通のベクトルは で変換すると向きが変わりますが、固有ベクトルは向きが変わらない特別な方向です。
固有値の求め方
「特別な方程式を解けば固有値が求まる」——手順は次のとおりです:
より 。
非自明な解()が存在するには、行列式がゼロになる必要があります——「逆行列が存在しないとき、ゼロでない解が生まれる」:
これを特性方程式(characteristic equation)といいます。
2×2 行列の例
「実際に手を動かして固有値と固有ベクトルを求めてみましょう」:
① 特性方程式を立てる
固有値:——「この行列は2倍に伸ばす方向と4倍に伸ばす方向がある」
② 固有ベクトルを求める
のとき:
のとき:
変換のアニメーション
円周上のすべてのベクトルを で変換します。固有ベクトルの方向のベクトルは向きが変わらず(スケールのみ変化)、他のベクトルは向きが変わることを観察してください。
var t, i, ox, oy, scale, numVec;
t = 0;
numVec = 16;
// Matrix A = [[3,1],[1,3]]
var A00 = 3, A01 = 1, A10 = 1, A11 = 3;
function mulMat(x, y) {
return [A00*x + A01*y, A10*x + A11*y];
}
function loop() {
ctx.clearRect(0, 0, W, H);
t += 0.008;
var lerpT = (Math.sin(t) + 1) / 2; // 0..1
ox = W/2; oy = H/2; scale = 48;
// grid
ctx.strokeStyle = '#1e293b';
ctx.lineWidth = 1;
for (var g = -5; g <= 5; g++) {
ctx.beginPath(); ctx.moveTo(ox+g*scale, oy-5*scale); ctx.lineTo(ox+g*scale, oy+5*scale); ctx.stroke();
ctx.beginPath(); ctx.moveTo(ox-5*scale, oy+g*scale); ctx.lineTo(ox+5*scale, oy+g*scale); ctx.stroke();
}
ctx.strokeStyle = '#334155';
ctx.lineWidth = 2;
ctx.beginPath(); ctx.moveTo(ox-5*scale, oy); ctx.lineTo(ox+5*scale, oy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(ox, oy-5*scale); ctx.lineTo(ox, oy+5*scale); ctx.stroke();
// draw vectors
for (i = 0; i < numVec; i++) {
var angle = (i / numVec) * Math.PI * 2;
var vx = Math.cos(angle), vy = Math.sin(angle);
var tv = mulMat(vx, vy);
// interpolate between original and transformed
var ix = vx + lerpT * (tv[0] - vx);
var iy = vy + lerpT * (tv[1] - vy);
// check if close to eigenvector directions
var norm = Math.sqrt(ix*ix + iy*iy);
var cos45 = Math.abs(ix - iy) / norm;
var cos45b = Math.abs(ix + iy) / norm;
var isEigen = cos45 < 0.15 || cos45b < 0.15;
ctx.strokeStyle = isEigen ? '#fbbf24' : '#60a5fa88';
ctx.lineWidth = isEigen ? 2.5 : 1;
ctx.beginPath();
ctx.moveTo(ox, oy);
ctx.lineTo(ox + ix * scale, oy - iy * scale);
ctx.stroke();
if (isEigen) {
ctx.fillStyle = '#fbbf24';
ctx.beginPath();
ctx.arc(ox + ix*scale, oy - iy*scale, 4, 0, Math.PI*2);
ctx.fill();
}
}
// eigenvector labels
ctx.fillStyle = '#fbbf24';
ctx.font = '12px monospace';
ctx.textAlign = 'center';
ctx.fillText('v₁=(1,-1) λ=2', ox + 80, oy + 110);
ctx.fillText('v₂=(1,1) λ=4', ox - 70, oy - 100);
ctx.fillStyle = '#e2e8f0';
ctx.font = '13px monospace';
ctx.textAlign = 'left';
ctx.fillText('A = [[3,1],[1,3]]', 14, 22);
var phase = lerpT < 0.1 ? '変換前' : lerpT > 0.9 ? '変換後' : '変換中...';
ctx.fillText(phase, 14, 40);
requestAnimationFrame(loop);
}
loop(); 特性多項式と固有空間
「 行列は 個の固有値を持つ」—— 行列の特性方程式は の 次方程式(特性多項式)で、一般に 個の固有値(重複・複素数含む)を持ちます。
各固有値 に対応する固有ベクトル全体( を含む)を固有空間(eigenspace)といいます——「同じ固有値を持つベクトルたちの集合」。
トレースと行列式との関係
「固有値の和と積は行列から直接読み取れる」—— 行列 の固有値 は:
これはビエタの公式の適用です——「対角成分を足したものと行列式が、固有値の情報をすでに含んでいる」。
例:、 ✓、 ✓
固有値・固有ベクトルの応用
「固有値は現代技術の各所で活躍している」——日常生活に直結した応用があります:
| 分野 | 使い方 |
|---|---|
| 主成分分析(PCA) | データの分散方向(固有ベクトル)を求める |
| PageRank | Webグラフの遷移行列の最大固有ベクトル |
| 振動解析 | 固有振動数(固有値)と振動モード(固有ベクトル) |
| 量子力学 | エネルギー固有状態 |
| マルコフ連鎖 | 定常分布は固有値1の固有ベクトル |
行列の対角化
「固有ベクトルを並べた行列で変換すると、行列が対角化できる」——計算が非常に楽になります:
が 個の線形独立な固有ベクトル を持つとき:
(固有ベクトルを並べた行列)
対角化できれば により行列のべき乗が簡単に計算できます——「対角行列のべき乗は各対角成分のべき乗だけで済む」。フィボナッチ数の一般項もこの方法で導けます!
まとめ
- 固有方程式:(向きが変わらずスケールのみ変化)——「変換されても向きが変わらない特別な方向」
- 固有値の求め方:特性方程式 ——「この方程式を解けば固有値が出る」
- 固有ベクトルの求め方:各 について を解く
- 、——「行列から固有値の情報を読み取れる」
- 対角化:固有ベクトル行列 を使って と表せる——「べき乗の計算が楽になる」
- 機械学習・物理・統計で中心的な役割を果たす
次回はフィボナッチ数列と黄金比——自然界に現れる美しい数列の秘密を探ります。