プログラミング演習(P3):固有値問題、冪乗法

  1. n x n の正方行列 A について、

    A x = a x 

    となるような 1 x n のベクトル x と、値 a を求める問題を固有値問題という。ここでは、行列 A の i 行 j 列成分 Aij について、

    Aij = Aji , Aij は実数

    となる実対称行列に対する冪乗法を学ぶ。

  2. 行列 A の固有値に同じ値のものがないとして、それらの絶対値の大きい順に

    |a1| > |a2| > ... > |an|

    と並べて、対応する固有ベクトル x1, x2, ..., xn が一次独立であるとする。あるベクトル y を x1, x2, ..., xn の線形結合で

    y = c1x1 + c2x2 + ... +  cnxn

    とすると、これに行列 A を1回かけたものは Axj=ajxj, (j=1,...,n)より

    y(1) = A y = c1a1x1 + c2a2x2 +  ... + cnanxn

    さらに N 回かけたものは

    y(N) = A y(N-1) = AN y
           
            = c1a1Nx1 + c2a2Nx2 +  ... + cnanNxn

            = a1N [c1x1 + c2(a2/a1)Nx2 + ... + cn(an/a1)Nxn]

    となる。i≠1 の場合、 |ai/a1| < 1 なので、 y(N) (N->∞) ->  a1N c1x1 に収束し、

    [y(N) T y(N-1)] / [y(N-1) T y (N-1)] -> a1 ... (*)

    の最大固有値に収束する。 ここで T は転置を表す。[y(N) T y(N-1)]  は ベクトル y(N)  とベクトル y(N-1) の内積である。

  3. アルゴリズムは

    1. ベクトル y を入力し、初期値として、y(0)=y/sqrt[yTy] として  y(0)T y(0) =1 となるように規格化する。 k=0 とする。
    2. z(k) = A y(k) をつくる。(行列ベクトル積)
    3. b(k) = y(k)Tz(k) をつくる。(内積 ... 上の式(*)の左辺に対応)
    4. y(k+1) = z(k)/ sqrt[z(k)T z(k)] として y を更新する。(規格化)
    5. 十分小さい e に対して 3 の内積について | (b(k)-b(k-1))/b(k) | < e となるまで繰り返す。(収束判定)
    6. そのときの b(k) と y(k+1) が固有値と固有ベクトルとなる。

 
 (例題P3−1)以下のプログラムは 4 x 4 の行列を matrix.d から、4行のベクトルを vector.d から読み込んで、冪乗法のアルゴリズムに従って、最大固有値と固有ベクトルの収束性をみるプログラムである。作成して実行してみましょう。

        ( 5 2 3 4 )
        ( 2 5 4 3 )
A =   ( 3 4 5 2 )
        ( 4 3 2 5 )





(さらに余裕がある人へ。成績評価にはあまり影響しない課題)

上の例題では、行列 A の最大固有値 a1 と対応する固有ベクトル x1 を求めた。ここでは、2番目に大きい固有値と対応する固有ベクトルを求める方法について考える。新しく行列

B = A - a1 x1 x1T

とすると、 B の固有値は、 0, a2, a3, ..., anとなり、対応する固有ベクトルは x1, x2, x3, ... , xn となる。これを用いて2番目に大きい固有値 a2 と対応する固有ベクトル x2 を冪乗法により求めることができる。

(課題P3−5)
例題プログラムに
B = A - a1 x1 x1T
を作って2番目に大きい固有値と固有ベクトルを求めるプログラムを作成し、実行しなさい。

(課題P3−6)
4 x 4 の行列の全ての固有値と固有ベクトルを求めるプログラムを作成し、 matrix.d について実行しなさい。


Shimpei Endo, The University of Electro-Communications