{-# LANGUAGE OverloadedStrings #-} import Control.Applicative import Control.Monad import Numeric.SpecFunctions import Numeric.MathFunctions.Constants import CPython.Sugar import CPython.MPMath import qualified CPython as Py import HEP.ROOT.Plot ---------------------------------------------------------------- viewBetaDelta = runPy $ do addToPythonPath "." m <- loadMPMath mpmSetDps m 100 xs <- forM pqBeta $ \(p,q) -> do x <- fromMPNum =<< mpmLog m =<< mpmBeta m (MPDouble p) (MPDouble q) return (p,q, relErr x (logBeta p q)) draws $ do -- let xs = [ (p,q, logBeta p q `relErr` (logGammaL p + logGammaL q - logGammaL (q+p))) -- | (p,q) <- pqBeta -- ] add $ Graph2D xs pqBeta = [ (p,q) | p <- logRange 50 0.3 0.6 , q <- logRange 50 5 6 ] where viewIBeta x = runPy $ do addToPythonPath "." m <- loadMPMath mpmSetDps m 30 -- let n = 40 let pq = (,) <$> logRange n 100 1000 <*> logRange n 100 1000 -- xs <- forM pq $ \(p,q) -> do i <- fromMPNum =<< mpmIncompleteBeta m (MPDouble p) (MPDouble q) (MPDouble x) return (p,q, incompleteBeta p q x `relErr` i) -- draws $ do add $ Graph2D xs go = runPy $ do addToPythonPath "." m <- loadMPMath mpmSetDps m 16 -- print =<< fromMPNum =<< mpmIncompleteBeta m (MPDouble 10) (MPDouble 10) (MPDouble 0.4) print $ incompleteBeta 10 10 0.4 viewLancrox = runPy $ do addToPythonPath "." m <- loadMPMath mpmSetDps m 50 -- let xs = logRange 10000 (1e-8) (1e-1) pl <- forM xs $ \x -> do y0 <- fromMPNum =<< mpmLog m =<< mpmGamma m (MPDouble x) return (x, y0) draws $ do add $ Graph $ [ (x, abs $ y `relErr` logGammaL x) | (x,y) <- pl ] set $ lineColor RED -- add $ Graph $ [ (x, abs $ y `relErr` logGamma x) | (x,y) <- pl ] set $ lineColor BLUE -- set $ xaxis $ logScale ON -- set $ yaxis $ logScale ON -- add $ HLine m_epsilon add $ HLine $ negate m_epsilon ---------------------------------------------------------------- relErr :: Double -> Double -> Double relErr 0 0 = 0 relErr x y = (x - y) / max (abs x) (abs y) logRange :: Int -> Double -> Double -> [Double] logRange n a b = [ a * r^i | i <- [0 .. n] ] where r = (b / a) ** (1 / fromIntegral n)