プロが教えるわが家の防犯対策術!

現在、因子分析や主成分分析などを行うために対称行列の固有値及び固有ベクトルを求めるプログラムを作っています。
現在、ハウスホルダー法を用いて行列を3重対角化し、QR法にて固有値が求まるところまでは、できたのですが、この後の固有ベクトルを求める方法がわかりません。
文献などを調べておりますと、逆反復法を用いて固有ベクトルを求めれば良いとあるのですが、この逆反復法のアルゴリズムが良く分かりません。
また、この逆反復法以外で効率的に求める手法がありましたら、教えてください。
よろしくお願いします。

A 回答 (1件)

逆反復法は固有ベクトルを計算するのによく用いられます.



問題の行列を A (既知),近似的固有値を Ea (既知) とします.
任意の初期ベクトル v_0 を出発点にとり,
(A-Ea)^(-1) を繰り返し掛けようというのが逆反復法のアルゴリズム
(というか,原理)です.
v_0 を A の固有ベクトル φ_j (未知)で展開します.
(1)  v_0 = Σ_j a_(j0) φ_j
係数 a_(j0) は未知.
これに (A-Ea)^(-1) を k 回掛けます.
左辺は (A-Ea)^(-k) v_0 = v_k と書くことにします.
φ_j は A の固有ベクトル(固有値を E_j とします)なので,
(2)  (A-Ea)^(-1) φ_j = (E_j - Ea)^(-1) φ_j
で,k 回繰り返して
(3)  (A-Ea)^(-k) φ_j = (E_j - Ea)^(-k) φ_j
したがって
(4)  v_k = Σ_j a_(j0) (E_j - Ea)^(-k) φ_j
です.
(E_j - Ea)^(-k) がミソで,Ea に近い E_j をもつ j 成分が他の成分に比べて
格段に大きくなります(繰り返し回数 k に対して指数関数的に増大).

(A-Ea)^(-1) を掛ける操作をそのままやろうとすると逆行列を求める必要があります.
しかし,
(5)  v_k = (A-Ea)^(-1) v_(k-1)
ですから
(6)  v_(k-1) = (A-Ea) v_k
というわけで,これなら単に連立方程式を解くだけですからできます.

不幸にして最初の v_0 の選び方が悪くて,求める固有ベクトルと直交していると,
うまく行きません.
極端な話,v_0 を A の真の固有ベクトルに選んでしまったら,
いつまで経ってもその固有ベクトルから抜け出せません.
こういうことが起きるのは,対称性の問題に起因することがほとんどです.
まあ,適当にごちゃごちゃした A で,v_0 を対称性の違うベクトルの線形結合に
とっておけばたいてい大丈夫です.

実際のプログラミングにはいろいろ注意が要ります.
固有値が縮退している可能性なども考えておかないといけません.
森正武「FORTRAN77 数値計算プログラミング」(岩波書店,1988)
など参考にされてはいかがでしょうか.
    • good
    • 0
この回答へのお礼

とても詳しく回答していただきありがとうございます。siegmundさんの回答をもとにもう一度専門書を読み直してみます。「FORTRAN77 数値計算プログラミング」は図書館に行って探してみましたが、どこも貸し出し中で当分読めないかもしれませんが、読んでみようと思います。

お礼日時:2003/11/23 22:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!