Edited at

Haskellで数値計算やってみた

この記事は執筆途中です

なぜか僕の友人が僕に触発され全く同じ記事を書いていたので載せておきます。

->https://yakituka.hateblo.jp/entry/2019/11/09/133133

はい今日は、今日はHaskellを使って数値計算をしてみます。

世にある数値計算の方法全てを網羅するのはまだ難しいので、少しづつ書き足していこうと思います。


対象としている読者

・Haskellを勉強している、アルゴリズムの勉強を通してHaskellの理解を深めたい

・数値計算を勉強していて、ある程度知っている。そうでなくてもどんなアルゴリズムがあるか知っている。


求根アルゴリズム

求根アルゴリズム(関数を解くアルゴリズム)は関数の1ないし2点から、次の1点を求めることを繰り返すため、再帰で簡単に考えることができる。


2分法

bisection f x1 x2

| abs (f x') < ε = x'
| f x1 * f x' > 0 = bisection f x' x2
| otherwise = bisection f x1 x'
where
x' = (x1+x2)/2


ニュートン法

    newton f f' x --関数f'は関数fの導関数ですが、数値微分についてはまた今度...

| abs (f x) < ε = x
| otherwise = newton f f' x'
where
x' = x - f x / f' x


数値積分


台形公式

    ε = 1E-5

trapezoidal f h a b ans --hは区間はば, ansに答えを足していっています
| abs (a - b) > ε = trapezoidal f h (a-h) b (ans+( ( (f a) + (f (a-h) ) )*h/2))
| abs (a - b) <= ε = ans

頑張って再帰で書いたんですが醜いと怒られました,,,

僕の友人が書いたリスト内包表記を用いたソースコードがこちら

    integrate f a b n = sum [ trapezoid (a+h*i) (a+h*(i+1)) | i <- [0..n-1] ]

where
trapezoid x1 x2 = (x2 - x1)*(f x1 + f x2)/2
h = (b - a)/n