• ベストアンサー

固有値問題

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

質問者が選んだベストアンサー

  • ベストアンサー
  • siegmund
  • ベストアンサー率64% (701/1090)
回答No.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) など参考にされてはいかがでしょうか.

kiyohu16
質問者

お礼

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

関連するQ&A

  • 行列演算: 固有ベクトルの解法

    現在、対称行列の固有値、固有ベクトルを求めるプログラムを作成し、つい最近完成しました。 しかし、とても使い物にならないプログラムになってしまいました。 理由はとても遅いのです。 解法の手順として、まず固有値を求めてから固有ベクトルを求めるようと考え、入力の対称行列をHouseHolder法により三重対角行列に変換し、それをQR法により対角化してまず固有値を求めました。 固有値を求めることができたので、次に固有ベクトルを求めます。手順として、固有値ごとに入力対称行列の対角成分から固有値を減算した行列をLU分解し、連立一次方程式を解くように固有ベクトルを求めていきます。 この一連の手順で、対称行列の固有値、固有ベクトルを求めることができたのですが、とても時間がかかってしまいます。 ただし、対称行列の固有値を求めるまでの時間はとても高速です。 500×500の行列の固有値、固有ベクトルを求めるのに30分はかかってしまいますが、その中で固有値を求める時間は2秒しかかかりません。 つまり今固有値がわかっている状態で、固有ベクトルを高速に求めたいと考えています。 なにか高速に固有ベクトルを求める方法(アルゴリズム)はあるでしょうか?

  • QR法を使った行列の固有値問題について

    行列の固有値と固有ベクトルを求めるプログラムをJavaで 作っています。そこで、アルゴリズムとしてQR法を用いて いるのですが、この方法では固有値のみを求めており、 固有ベクトルは求めていないことがわかりました。そこで、 QR法を用いつつ、固有ベクトルも同時に求める方法がありましたら、 教えて頂きたいと思います。宜しくお願いします。

  • 固有値問題の解法について

    固有値問題を解くプログラムを作りたいと考えています。 対象とする行列は「実対称行列(正方行列)」で、251次の 行列を考えており、この行列の固有値、固有ベクトルを 求めたいです。そこで、現在調べたところ、ヤコビ法、 QR法などがあるのですが、どの方法がより高速に求められる でしょうか。ご教示願いたいと思います。また、上記の方法 よりも高速に求められる解法などありましたら、教えて頂き たいです。宜しくお願いします。

  • 行列の固有値、及び直交化問題

    (1)対称行列の固有値は、なぜ実数なのですか? (2)対称行列を対角化する行列は、直交するベクトルで構成された行列に限られるのでしょうか?だとしたら、それはなぜですか?

  • 行列の固有ベクトルについて質問です

    対称行列を対角化するにあたって,対称行列の固有ベクトルについて次のように教科書に記述があります. 「対称行列の異なる固有値に対する固有ベクトルは互いに直交する」 この記述によれば,異なる固有値から得られる固有ベクトルは必ず互いに直交しますが,固有値が重解となったときに同じ固有値から2つの固有ベクトルが得られる問題がありました. このとき,この得られた2つの固有ベクトルは互いに直交していないのでしょうか? つまり,「同じ固有値から得られた固有ベクトルは絶対に直交しない」のでしょうか? わかりにくい質問ですが,どなたか詳しい回答よろしくお願いします.

  • 固有値

    この問題がまったく何を言っているのかわかりません。。固有値は|A-λE│=0の固有値方程式を解いて、固有値λを求めればいいんですよね?参考書などを見ればちょっとした計算式と言葉で書いてあるだけで詳しい解きかたが書いていません。永年行列式をサラスの公式なり余因子展開なりで展開すると、λに対する三次方程式が得られ、それを解けば固有値がわかると教えていただいたんですがそれも何を言っているのかよくわからなくて。どうかできるだけ計算過程も詳しく教えてください。お願いします。 行列Aの固有値と対角化を以下の手順で考えていこう。    0 1 0  ( 1 0 0 )    0 0 0 (1)行列Aの固有値を求めなさい。数量の検算には、固有値の和が行列Aのトレースに等しいことに注意せよ。 (2)固有値に属する固有ベクトルを求めなさい。 (3)行列Aの固有ベクトルを列ベクトルとして任意の順に並べて作った行列Pを示しなさい。

  • 固有値、固有ベクトルおよび対角化について

    以下の問題なのですが、(2)が特にわかりません。 (1)も自信ありませんが…。 (2)なのですが、行列Aの固有ベクトルは2個しかないので、 対角化ができません。 もし対角化が出来れば、AP=PBに右からPの逆行列をかけることで、 A=PBP^(-1) となって、簡単にPとBは決定できます。(Bは上三角行列とあります) Bは固有値を対角に並べたもので、Pはそれに対応するように固有ベクトルを並べたものですよね。 しかし今回の場合はAがおそらく対角化できないので、そう簡単にはいかないようです。 どのようにして解けばよいのでしょうか? よろしくお願いします。

  • 固有値

    この問題がまったく何を言っているのかわかりません。。固有値は|A-λE│=0の固有値方程式を解いて、固有値λを求めればいいんですよね?参考書などを見れば言葉で書いてあるだけで詳しい解きかたが書いていません。どうかできるだけ計算過程も詳しく教えてください。できれば(1)と(2)だけでも結構です。お願いします。 行列Aの固有値と対角化を以下の手順で考えていこう。    0 1 0  ( 1 0 0 )    0 0 0 (1)行列Aの固有値を求めなさい。数量の検算には、固有値の和が行列Aのトレースに等しいことに注意せよ。 (2)固有値に属する固有ベクトルを求めなさい。 (3)行列Aの固有ベクトルを列ベクトルとして任意の順に並べて作った行列Pを示しなさい。 (4)行列Aはこの行列Pによって対角化可能であるかどうかどうか調べなさい。 (5)行列Pの転置行列tPを示し、行列Pとの積tPPを計算しなさい。 (6)行列Aが行列Pによって対角化可能であるならば、対角化されることを示しなさい。

  • 行列の固有ベクトルの解法

    現在行列の固有値と固有ベクトルをもとめるプログラムを作成しています。 手順としては、入力行列をハウスホルダー法により三重対角行列に変換し、その後QR法で対角化を行い固有値を求めます。 固有ベクトルはLU分解を使用して固有値ごとに求めていこうと考えました。 現状固有値を求めるプログラムは作成できました(そして正しく求められていることも確認しました)。そして行列のLU分解を行うプログラムまで作成できたのですが、LU分解後の行列から固有ベクトルを求める方法がわかりません。 詳しく説明します Ax = λx を (A - Iλ)x = 0 として、この(A - Iλ)をLU分解しました。 すると式は LUx = 0 となり 最終的に Ux = 0 をとく問題になります。 ここで行列Uは上三角行列なので、1次の連立方程式を解くように、行列Uの右下の要素を使って計算を始めていくのですが、自分がなにか勘違いをしているのだと思うのですがこの方法で計算すると固有ベクトルが全て0になってしまいます。  行列U     x       0 | 2 3 4 5 | |x1|   =  |0| | 0 4 2 9 | |x2|   =  |0| | 0 0 7 5 | |x3|   =  |0| | 0 0 0 8 | |x4|   =  |0| このような図式になり、固有ベクトルであるxを求めていくのですが、x4から順にもとめても0にしかならないんです。 下記のサイトを参考に学んでいたんですが、この部分が分からずにいます。 http://hooktail.org/computer/index.php?KL%C5%B8%B3%AB2 どこを勘違いしているんでしょうか? アドバイスをお願いします。  

  • 行列固有値問題

    Aは、3×3行列で、3つの固有値のうち2つが同じ(1組が重解)で、もう一つが異なる解、つまり固有値λ1、λ2、λ3で λ1=λ2 λ3≠λ1 の場合、 Aが対称行列ではないもの具体例を示して下さい。また、その具体例の行列を対角化する行列Pも示して下さい。 この時、求める最小多項式は重解はないものとします。 つまり、(A-λ1E)(A-λ3E)=0 をみたし、 対角化した行列は、λ1=λ2、λ1≠λ3で [λ1 0 0] [0 λ2 0] [0 0 λ3] になります。 このようなAでなおかつ対称行列でないものをあげて欲しいのですが、存在しますか? 対称行列だったら、いくつか列があったのですが、そうでない具体例が知りたいのです。