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
参考文献