プログラムな日常>ウェブプログラム作品集>
固有値、固有ベクトルの真実
(realities in eigenvalues and eigenvectors)
U:
cos(u), -sin(u)
sin(u), cos(u)
V:
cos(v), sin(v)
-sin(v), cos(v)
 
 =
U "
  *
D1 "
  *
V "
行列 M "
" "
" "
 =
P(列=単位固有vector) "
  *
D2(対角要素=固有値) "
  *
P-1: Pの逆行列 "
 =
L "
  *
D3 "
  *
U "
D_1_1/D_2_2
D_2_2
u
v
symmetric matrix(u=v; UV=E)
M2(対角化から再計算) "
M3(LDU 分解から再計算) "
 =
U_again "
  *
D1_again "
  *
V_again "
M_again(再計算した ODO 分解の積)
"
 

2次元の一次変換と、これを対角化したときの対角要素、固有値、固有ベクトルを示すものです。 ここでは、2つの直交行列 U,V と、対角行列 D とを指定することで、任意の行列 M を生成。これの固有値と固有ベクトルとを計算、表示します。

使い方:
ここで実際には、行列 M を U,D,V から作っているわけですが、一般に

(ただし、D を対角行列)とする分解は幾つかあります。

  1. A、B がどちらも直交行列だが、相互の関係性に制限がない場合。
    この分解は常に可能で、「ODO 分解」と名付けておきますが、このページの最後にプログラムを置いておきます(ちなみに反復法です)。 常に分解可能ということは逆に言えば、一般の行列を積によって作れることになり、これをこのページで利用しています。
    O は orthogonal のことであり、第1と第3の O は必ずしも同じではなく、互いに逆行列とも限りません。
    (2/6 加筆:この分解は、非正方の場合も含めて「特異値分解(singular value decomposition)」、 対角要素は「特異値(singular value)」と呼ばれるようで、いずれ、もう少し整理して新版でご提示します。)

  2. A と B が互いに逆行列の場合。
    対角化などと呼ばれ、例えば Wikipedia:

    項を移せば A=PDP-1 となり、これは、固有値、固有ベクトルを導く根拠です。

  3. A が下三角行列で B が上三角行列の場合。
    これは、LDU 分解などと呼ばれます。
    途中でピボットがゼロになる場合は不可(実例は、逆行列の解法 の "sample2")だが、それ以外は常に可能。
    L と U の対角要素を1とする限定も可能で、この場合は(可能であれば)一意的に決定。
    D と U を掛けて R とすることもあり、この R を U と書くこともあって、LU 分解などと呼ばれる。
    このページでは深く論じません。

さて、この3通りの分解方法の何れも、真ん中に対角行列を作るわけですが、それらの値はお互いに一致しているわけではありません。 対角化によって得られる固有ベクトルに許される空間は、グラフ上で、黄色の直線によって表現し、実数解が得られないときはこの表示が消えます。 ただし、解を複素数にまで広げると、より広い範囲で解が存在すると言われます。 これは「代数学の基本定理」で理屈づけられるのですが、座標成分が複素数であるとか、固有値が複素数であるとかの話は、とてもイメージできるようなことではなくなってきます。

基本的に固有値はとても大事です。物理においては古典論でも量子論でも、頻出します。 経済学などでも、市場の安定点などを分析するのに重要であるに違いありません(良くは存じませんが)。 しかしながら、こういう大事な固有値問題というのは例外なく、対称行列の場合、すなわち、"symmetric matrix" のボックスがチェックされた場合の話なんです。 これをチェックしてみてください。行列 P は直交行列となり、P-1 はその転置行列になります。そして、D1 と D2 の内容が 同じになります。これは固有値問題を「ODO 分解」によって解くことができる、ということなんです。

ところで、固有値って普通はどうやって解くんでしたっけ? 永年方程式を作るんでしたね。永年方程式というのは行列式に関する方程式です。 しかし、行列式を解くということに対して、世の中はあまり真剣でなかったように思うんです(過去のページ)。 数値としての行列式を解くのも難しいのに、多項式として簡単に作れるか、甚だ疑問です。 多項式になったものを解くには 過去の別のページの方法が使えますが、次数が大きい場合にパワフルとは言えません。 それを考えると、「ODO 分解」は非常に実用的でパワフルな方法です。 そもそも、数学の分野で、固有値・固有ベクトルが論じられる理由の一つは、固有ベクトルの基底を使えば、線形変換を、成分に係数を掛けた総和に置き換えられる安心感にあるのではないでしょうか? しかし、黄色い線が現れたり消えたりするように、実領域で常にそれが見つけられるとは限りません。実領域で無ければ、複素数に行くのが良いのでしょうか? それは、問題を不必要に難しくするだけに見えます。

「群盲象を評す」という言葉がありますが、固有値・固有ベクトルの本来の定義は実に色々なケースを含んでいてわかりにくく、なかなか共通の感覚を得にくいと思います。 だから、実用上、固有値・固有ベクトルは対称行列だけを話題にしていれば良いのではないでしょうか?  それは「ODO 分解」で解けます。反復解法にはなりますが、コンピュータが普及した昨今、それは障害にはならないはずです。

ODO 分解(javascript):