数値計算(べき乗法)
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]
となりました