プログラムな日常>ウェブプログラム作品集>
対称行列における固有値・固有ベクトルの正しい求め方
(apposite way to know eigen-values and eigen-vectors of symmetric matrices)
 
digits after points 2 3 4 5 6 7 8 9 10
original

   →  

 preferSW 
 preferNE

symmetric
          torise
 ↓  
 


   ↓      
left
 
center
left
 
center
 
right

次数:

【使い方】


【右と左】

二次元の世界の鏡像関係、たとえば 「」 と 「」 との関係が、正確な鏡像であれば、それは「合同」と言うらしい。 この言葉の使い方を私は適切と思わないが、ユークリッドの時代から呼びならわされた用語であれば、反論してもしょうがない。 まあ、三次元の世界に取り出して、裏返してから嵌め直せば重なるということを言っているのだろう。 ただ、ここでは紙に表と裏とがある点を忘れているのが気になる。

次に問題にすることとして、正確に左右対称に作られた人形の左右の手は合同なのだろうか? 四次元の世界に取り出してから戻せば、それらは「重なる」はずだ。 しかし、四次元の世界など存在しないという考え方をするなら、それは不可能となるから、「合同ではない」ことになるだろう。 しかし、二次元について認められることが三次元では認められないのは、現代的な感覚からすると奇異なことだ。 このように、数学の用語は、古典的な定義と、新規な認識の間で、一貫性のない場合も多々ある。 「合同」は二次元幾何の用語であって三次元については言わない、というのが一つのあり得る解答である。

鏡像ではない合同関係につき、ここでだけ「純合同」という言葉を使おう。純粋な合同というわけだ。 空間に互いに鏡像関係にある二つの図形がある場合、どちらが右でどちらが左ということを数学は言うことはできないが、 合同な二つの図形が互いに「純合同」なのかそれとも鏡像なのかの別を数学は言うことはできる。 それは変換行列の行列式がプラスの 1 か、マイナスの 1 かを見れば良いのだから。 また、何らかの基準、たとえば座標軸が同じ空間に存在するならば、一定の定義を導入して、片方を右、他方を左と決めることはできるはずだ。

1を表現するものとして、「乗法単位元」という言葉がある。 もしも、1 と -1 を総称する何等かの言葉があるのに、1 だけを表現する言葉がないとしたら、とても変だ。 幾何学はこの変な状態をずっと続けている。 「合同」という変な言葉も、座標系が導入されたり、遅くともトポロジーが注目を集めた時点で見直されるべきだった。


【直交行列】

今、二つの空間図形が線形変換によって重なるとしよう。 もちろん、一般には併進移動を伴うので「アフィン変換」と言うべきだ。 そのアフィン変換から併進部分を除いた(併進を許容した)回転と変型の部分だけの線形変換を問題にするのだ。

互いに合同である図形間の変換は、直交行列で表現されるが、「合同」という言葉を批判する以上は、この「直交行列」という言葉も批判しなければならない。 なぜならばそれは、行列式が 1 である場合と -1 である場合の2つを総称するからだ。

鏡像ではない同一物の関係は、行列式が正の直交行列で変換され、鏡像のような関係は、行列式が負の直交行列で変換されるわけである。 行列式が正の直交行列を「正格」の直交行列と呼ぶらしい。

行列式が 1 か -1 かの区別は、直交行列を明確に分類するほぼ唯一の区別である。 なぜならこの区別を除けば、あらゆる直交行列の状態は(行列式が 1 同志、また、-1 同志の中で)連続的に変化し得るものだからである。


【「ODO分解」の特性】

過去のページ で、対称行列の特異値を導く「ODO分解」を提唱したが、これは、前および後に付く「正格」の直交行列と、その真ん中の対角行列に分解するものであった。 そこでは、対称行列の固有値と固有ベクトルは、「ODO分解」によって計算できると述べていたが、符合の問題に着目すると、やや不適切な部分があったという反省もあり、このページを書いている。 実際、例示していた「ODO分解」のルーチンは、見出される対角要素に、正の値が極力選ばれるように作っており、対角要素の内の最後の1個のみ、負になることもあった。 ここに「できるだけ」というのは、そもそも回転を許容する場合に、対角要素には、符合の選択において、ある程度の自由があることを認めて言っている。

図形を回転させる変換は多くの場合は非対称となる。それでは、次の変換はどうだろうか?

 → 

180度の回転がなされ、さらにデフォルメがある、というのは、この変換に対する一つの素直な感覚である。この変換に対する行列は、

 (
-2 0
0 -1
)

となるが、既に対角行列であるこの行列を、先のページで定義した「ODO分解」のルーチンにかけると、
 (
1 0
0 1
)
(
2 0
0 1
)
(
-1 0
0 -1
)
のように「分解」される。どちらも「正格」である左右の直交行列が、互いの転置行列にならない事実は、ODO分解(の考え方)がこれを一種の回転と見ていることを裏付けている。

変換を通じて、各対角要素の絶対値は維持されながら、符合が負のものは2個から0個になった。これは二次元の例であったが、より多次元でも同じようなことは可能である。 ただし、座標軸のどれか2つを必ず同時に選んで両方の符合を変えることになる。 2個ずつ増減するわけだから、負値対角要素個数の偶奇は変わらず、それは、その行列式が変わるべきでないことからも当然に要請される。 この要請は、掛算される「正格の直交行列」の行列式は 1 であることと、行列の積に対する行列式は、各行列の行列式の積に等しいこととから出てくる。 行列式の符合に応じて、負値対角要素の最低個数は0個または1個である。

しかし、元の行列が既に対角行列であることを素直に受け入れるならば、これは、x 軸と y 軸とがそのまま固有ベクトルであり、その固有値は -2 および -1 である。 回転というよりも、各軸にそって反転していると見られるわけだ。 対称行列の固有値を求める手続きでは、左右の直交行列は互いに逆行列であることを強制できるので、これは一貫性が拓ける、望ましい認識である。


【対称行列を(互いに転置な直交行列で挟んで)対角化する反復法】

だから、最初から対称行列とわかっているものは、そう割切った変換を考えるべきなのである。

そこで、まず2次の対称行列を直交行列で挟んで対角化することを考える。一般に4個の数値から成る2次の対称行列には、i=0,j=1 要素と i=1,j=0 とを同じとする制約があるから、自由度が3である。 そこで、一般の2次対称行列 R は変数 p, q, t を適当に選んで次の一般式で書ける。

 
R =
p
・ (
cos(2t) sin(2t)
sin(2t) -cos(2t)
) +
q
・ (
1 0
0 1
)
この内、右辺の最初の行列は、次のように分解できる。
 (
cos(2t) sin(2t)
sin(2t) -cos(2t)
)
(
cos(t) -sin(t)
sin(t) cos(t)
)
(
cos(t) sin(t)
sin(t) -cos(t)
)
対称行列 R を互いに転置関係にある(逆行列である)2つの直交行列で次のように挟むと、
  (
cos(t) sin(t)
-sin(t) cos(t)
)
R
(
cos(t) -sin(t)
sin(t) cos(t)
)
  
p
・ (
1 0
0 -1
) +
q
・ (
1 0
0 1
)
だから、
   t=0.5 arctan((R1,2+R2,1)/(R1,1-R2,2))
と置けば、
 R= (
cos(t) -sin(t)
sin(t) cos(t)
) (
p+q 0
0 -p+q
) (
cos(t) sin(t)
-sin(t) cos(t)
)
の分解が可能になるのである。

こうして、2次の行列は対角化できるのだが、より高次であっても、絶対値が大きい非対角要素に次々着目して、同様の変換を行うことができる。 この時、他の次元にも影響はあるので、反復法にはなってしまうが、収束性は悪くない。

このように非対角(の非ゼロ)要素を処理するわけだが、各行で絶対値が最大の要素を探してはゼロ化することを続けている。 これをヤコビ法と言う。比較処理に時間をかけるのはもったいないとばかりに、手当たり次第にゼロ化するやり方もあり、こちらはシリアル・ヤコビ法と言う。 実際、速度に大差はないのだが、比較を行うヤコビ法では、対角要素がその大小の順にきれいに並ぶという利点がある。 個人的に証明したわけではないが、なぜかそうなる。

なお、「ODO分解」においては、対角要素は絶対値化され、その大きい方から順に並べている。最後の1要素のみ、負の場合があり得る。


ユーティリティのプログラム "autil.js":
ヤコビ法対角化は、このファイル中の関数 "getaxis" 、「ODO分解」は、関数 "decompODO" による。

ヤコビ法およびシリアル・ヤコビ法のパフォーマンスを表に示す。どちらも C# の場合だが、javascript でも大差ない。

ヤコビ法
次元 elapsed time(msec)
64 47
128 373
2564 3,674
512 32,024
1,024 514,201

シリアル・ヤコビ法
次元 elapsed time(msec)
64 47
128 504
2564 4,753
512 41,671
1,024 437,368

【固有値・固有ベクトルの教科書的求め方】

以下は一般教科書のある意味、復習であって、付録のようなものである。

教科書的には、第1のステップで、未知変数λの多項式である永年方程式
      det(λI-A)=0
(Iは単位行列)を満たす固有値セット(λ1, λ2, ... )を求め、さらに、第2のステップで、先の永年方程式の内容
      λI-A
に、先に得られた固有値の一つを適用し、できた式の値である各行列の(それは線形従属なベクトルセットであるはずなので)部分空間から直交系を構成し、これらに直交するベクトルを見つける。 Aの次元をm、縮退の数をn(すなわちn重根)とすれば、式の値である行列の部分空間の次元はm-nであり、ここで見つけるべき残りの直交ベクトルの数はnである。 このことを、固有値セットの各内容について順次行うことで、全部でm個の固有ベクトルを抽出できる。

以上の内、第1のステップでは、多項式としての永年方程式を解くことになるが、それは行列式であって、行列式については、その数値解を得るのでも従来の方法では大変だよ、というのが 過去に指摘した点であった。 数値としてもそうなのだから、多項式としてまず式を展開し、さらにその根を求める大変さは想像を絶するものがある。 2次元なら2次方程式だからなんとか解けるが、3次元の3次方程式になると、出題者が始めから解けるように用意してくれた問題以外はまず手に負えない。 そういう場合に限っても、筆算とかで解けるのは4次くらいまでで、数百次元とか言われたら、生涯計算を続けても解けるかどうかわかりませんよ、と念を押しておいた方が良さそうだ。