Skip to content

Instantly share code, notes, and snippets.

@kirelagin
Created May 22, 2012 17:57
Show Gist options
  • Save kirelagin/2770598 to your computer and use it in GitHub Desktop.
Save kirelagin/2770598 to your computer and use it in GitHub Desktop.
Teorver task2
import Data.Functor
import Data.Vector (fromList)
import qualified Data.Vector as V
import Statistics.Sample
import System.Random
import System.Random.Mersenne.Pure64
import Text.Printf
import Statistics.Distribution (quantile)
import Statistics.Distribution.Normal
import Statistics.Distribution.Uniform
import Statistics.Distribution.Exponential
gamma = 0.98
-- Общая функция для интегрирования
integrate :: (Double -> Double) -> [Double] -> Int -> (Double, Double)
integrate f smpl n = ( mean vals -- <- это оценка величины
, (quantile standard ((gamma+1) / 2)) * (stdDev vals) / (sqrt . fromIntegral $ V.length vals) -- <- вот здесь я считаю доверительный интервал
)
where vals = f <$> fromList (take n smpl)
main = do
-- Хороший генератор случайных чисел (вихрь Мерсенна)
gen <- newPureMT
-- Первый интеграл
let f = \x -> (x^3)/2
lambda = 2
distr = exponential lambda
n = 10^4
(val, interval) = integrate f (genContList distr gen) n
putStrLn $ formatAnswer n val interval
-- Второй интеграл
let f = \x -> (b-a) * (1/sqrt(1 + x^4))
a = -4
b = 5
distr = uniformDistr a b
n = 10^4
(val, interval) = integrate f (genContList distr gen) n
putStrLn $ formatAnswer n val interval
formatAnswer n val interval = printf "n = %d: %.4f ± %.4f (%.2f%%)" n val interval (interval/val * 100)
-------------------
class ContGenList d where
genContList :: RandomGen g => d -> g -> [Double]
instance ContGenList UniformDistribution where
genContList d gen = randomRs (uniformA d, uniformB d) gen
instance ContGenList ExponentialDistribution where
genContList d gen = (\x -> log(x)/(-edLambda d)) <$> genContList (uniformDistr 0 1) gen
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment