ONLY DO WHAT ONLY YOU CAN DO

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

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

πの求め方




積分(中点則)


f::Double->Double
f x = 4 / (1 + (x * x))
import Text.Printf
import Control.Monad

forM_ ([1..10::Integer]) $ \j -> do
    let n = 2 ^ j
    let a = 0.0
    let b = 1.0
    let h = (b - a) / (fromIntegral n)
    -- 中点則で積分
    let a2 = a + (h / 2)
    let w1 = sum $ map(\x -> f x) $ map(\i -> (fromIntegral i) * h + a2) $ [0..(n-1)]
    let t1 = h * w1
    -- 結果を π と比較
    let t2 = t1 - pi
    printf "%3d : %13.10f, %13.10f\n" j t1 t2
  1 :  3.1623529412,  0.0207602876
  2 :  3.1468005184,  0.0052078648
  3 :  3.1428947296,  0.0013020760
  4 :  3.1419181743,  0.0003255207
  5 :  3.1416740338,  0.0000813802
  6 :  3.1416129986,  0.0000203451
  7 :  3.1415977399,  0.0000050863
  8 :  3.1415939252,  0.0000012716
  9 :  3.1415929715,  0.0000003179
 10 :  3.1415927331,  0.0000000795
参考文献