Portability | portable |
---|---|
Stability | provisional |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Safe Haskell | Safe-Infered |
An implementation of Takahashi and Mori's Tanh-Sinh quadrature.
http://en.wikipedia.org/wiki/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, evalutions = 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, evalutions = 49}
See http://www.johndcook.com/blog/2012/02/21/care-and-treatment-of-singularities/ for a sense of how more naive quadrature schemes fare.
- trap :: (Double -> Double) -> Double -> Double -> [Result]
- simpson :: (Double -> Double) -> Double -> Double -> [Result]
- trap' :: Strategy [Double] -> (Double -> Double) -> Double -> Double -> [Result]
- simpson' :: Strategy [Double] -> (Double -> Double) -> Double -> Double -> [Result]
- parTrap :: (Double -> Double) -> Double -> Double -> [Result]
- parSimpson :: (Double -> Double) -> Double -> Double -> [Result]
- data Result = Result {
- result :: !Double
- errorEstimate :: !Double
- evalutions :: !Int
- absolute :: Double -> [Result] -> Result
- relative :: Double -> [Result] -> Result
- confidence :: Result -> (Double, Double)
- nonNegative :: ((Double -> Double) -> Double -> Double -> r) -> (Double -> Double) -> r
- everywhere :: ((Double -> Double) -> Double -> Double -> r) -> (Double -> Double) -> r
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
Integral with an result and an estimate of the error such that
(result - errorEstimate, result + errorEstimate)
probably bounds
the actual answer.
Result | |
|
Estimated error bounds
absolute :: Double -> [Result] -> ResultSource
Filter a list of results using a specified absolute error bound
relative :: Double -> [Result] -> ResultSource
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) -> rSource
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) -> rSource
Integrate from -inf to inf using tanh-sinh quadrature after using the change of variables x = tan t
everywhere trap (\x -> x*x*exp(-x))
This works much better than just clipping the interval at arbitrary large and small numbers.