integration-0.2.1: Fast robust numeric integration via tanh-sinh quadrature
Copyright(C) 2012-2015 Edward Kmett
LicenseBSD-style (see the file LICENSE)
MaintainerEdward Kmett <[email protected]>
Stabilityprovisional
Portabilityportable
Safe HaskellNone
LanguageHaskell98

Numeric.Integration.TanhSinh

Description

An implementation of Takahashi and Mori's Tanh-Sinh quadrature.

Tanh-Sinh provides good results across a wide-range of functions and is pretty much as close to a universal quadrature scheme as is possible. It is also robust against error in the presence of singularities at the endpoints of the integral.

The change of basis is precomputed, and information is gained quadratically in the number of digits.

ghci> absolute 1e-6 $ parTrap sin (pi/2) pi
Result {result = 0.9999999999999312, errorEstimate = 2.721789573237518e-10, evaluations = 25}
ghci> confidence $ absolute 1e-6 $ trap sin (pi/2) pi
(0.9999999997277522,1.0000000002721101)

Unlike most quadrature schemes, this method is also fairly robust against singularities at the end points.

ghci> absolute 1e-6 $ trap (recip . sqrt . sin) 0 1
Result {result = 2.03480500404275, errorEstimate = 6.349514558579017e-8, evaluations = 49}

See John D. Cook's "Care and Treatment of Singularities" for a sense of how more naïve quadrature schemes fare.

Synopsis

Quadrature methods

trap :: (Double -> Double) -> Double -> Double -> [Result] Source #

Integration using a truncated trapezoid rule under tanh-sinh quadrature

simpson :: (Double -> Double) -> Double -> Double -> [Result] Source #

Integration using a truncated Simpson's rule under tanh-sinh quadrature

trap' :: Strategy [Double] -> (Double -> Double) -> Double -> Double -> [Result] Source #

Integration using a truncated trapezoid rule and tanh-sinh quadrature with a specified evaluation strategy

simpson' :: Strategy [Double] -> (Double -> Double) -> Double -> Double -> [Result] Source #

Integration using a truncated Simpson's rule under tanh-sinh quadrature with a specified evaluation strategy

parTrap :: (Double -> Double) -> Double -> Double -> [Result] Source #

Integration using a truncated trapezoid rule under tanh-sinh quadrature with buffered parallel evaluation

parSimpson :: (Double -> Double) -> Double -> Double -> [Result] Source #

Integration using a truncated Simpson's rule under tanh-sinh quadrature with buffered parallel evaluation

data Result Source #

Integral with an result and an estimate of the error such that (result - errorEstimate, result + errorEstimate) probably bounds the actual answer.

Constructors

Result 

Instances

Instances details
Read Result Source # 
Instance details

Defined in Numeric.Integration.TanhSinh

Show Result Source # 
Instance details

Defined in Numeric.Integration.TanhSinh

Eq Result Source # 
Instance details

Defined in Numeric.Integration.TanhSinh

Methods

(==) :: Result -> Result -> Bool #

(/=) :: Result -> Result -> Bool #

Ord Result Source # 
Instance details

Defined in Numeric.Integration.TanhSinh

Estimated error bounds

absolute :: Double -> [Result] -> Result Source #

Filter a list of results using a specified absolute error bound

relative :: Double -> [Result] -> Result Source #

Filter a list of results using a specified relative error bound

Confidence intervals

confidence :: Result -> (Double, Double) Source #

Convert a Result to a confidence interval

Changes of variables

nonNegative :: ((Double -> Double) -> Double -> Double -> r) -> (Double -> Double) -> r Source #

Integrate a function from 0 to infinity by using the change of variables x = t/(1-t)

This works much better than just clipping the interval at some arbitrary large number.

everywhere :: ((Double -> Double) -> Double -> Double -> r) -> (Double -> Double) -> r Source #

Integrate from -inf to inf using tanh-sinh quadrature after using the change of variables x = tan t

everywhere trap (\x -> exp(-x*x))

This works much better than just clipping the interval at arbitrary large and small numbers.