ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

Haskell で 積分(Simpson則)して π を求める

πの求め方




積分(Simpson則)


import Text.Printf
import Control.Monad

f::Double->Double
f x = 4 / (1 + (x * x))

main = do 
  forM_ ([1..5::Integer]) $ \j -> do
    let n  = 2 ^ j
    let a  = 0.0
    let b  = 1.0
    let h  = (b - a) / (fromIntegral n)
    -- シンプソン則で積分
    let w4 = sum $ map(\x -> (f ((fromIntegral x) * h))) $ map(\i -> i * 2 - 1) $ [1..(div n 2)]
    let w2 = sum $ map(\x -> (f ((fromIntegral x) * h))) $ map(\i -> i * 2)     $ [1..(div n 2)]
    let t1 = (w2 - (f b)) * 2 + (f a) + (f b)
    let t2 = w4 * 4
    let t3 = (t1 + t2) * h / 3
    -- 結果を π と比較
    let t4 = t3 - pi
    printf "%3d : %13.10f, %13.10f\n" j t3 t4
  1 :  3.1333333333, -0.0082593203
  2 :  3.1415686275, -0.0000240261
  3 :  3.1415925025, -0.0000001511
  4 :  3.1415926512, -0.0000000024
  5 :  3.1415926536, -0.0000000000
参考文献