2013年4月22日月曜日

[SICP][Haskell] ニュートン法で平方根を求める

ニュートン法を使って平方根を求める処理をHaskellで書いてみた。

コード

prec = 0.0001

mysqrt :: Double -> Double
mysqrt x = sqrt_iter 1 x x
  where sqrt_iter guess last_guess x = if good_enough guess last_guess then
                                         guess
                                       else
                                         sqrt_iter (improve guess x) guess x
          where
            good_enough guess last_guess = (abs (guess - last_guess) / guess) < prec
            improve guess x = average guess (x / guess)
                  where average a b = (a + b) / 2

実行結果

*Main> mysqrt 2
1.4142135623746899
*Main> mysqrt 20000
141.42135623738412
*Main> 

SICPのSchemeのコードほぼそのまま。何のひねりもない。
Schemeよりは分かりやすいような気もするけど、この程度じゃあまり変らないよね...
Schemeで hoge? 、Common Lispで hoge-p と命名するような predicateな関数は、Haskellではどのように命名するのが一般的なんだろうか?


コードよりは、
  • ニュートン法とは?
  • どうしてニュートン法で平方根を求めることができるの?
の方が気になって、理解できるまで、いろいろ調べてしまった。
接線の方程式とか、微分とか、いろいろ忘れているなぁ。
たまには数学を再勉強しなきゃ。

参考