wvogel日記

自分用の技術備忘録が多めです.

数値計算(べき乗法)

Haskellだとこの手の繰り返し処理はとても簡単ですね。
明日の講義の演習課題として出されていたのですが、
答えがあっているかどうかの確認用に書きました。


以下の例では、
手計算では6回ほど繰り返さないと答えが出力されませんね...

import Control.Monad

--行列aの固有値、固有vectorを求める
a = [[6, -3, -7] , [-1, 2 ,1] , [5 ,-3 ,-6] ]

--初期条件としての、仮の固有vector
y0 = [1 , 0 , 0 ]

--正規化関数
normalize vector@(y1:_) = map (/y1) vector

--行列A * 固有vector(仮)
f array y = map (sum.zipWith (*) y ) array

--行列*vectorと正規化
powerMethod array = iterate $ normalize.f array

main = forM_ (take 20.powerMethod a $ y0) $ print.takeData
  where
     --fst :: 固有値、  snd :: 固有vector
    takeData y = (head (f a y) , y)

実行すると、最終的に

固有値→2、
固有vector→[1,-1,1]

となりました