math-functions-0.1.1.1: tests/Tests/Chebyshev.hs
module Tests.Chebyshev (
tests
) where
import Data.Vector.Unboxed (fromList)
import Test.Framework
import Test.Framework.Providers.QuickCheck2
import Test.QuickCheck (Arbitrary(..))
import Tests.Helpers
import Numeric.Polynomial.Chebyshev
tests :: Test
tests = testGroup "Chebyshev polynomials"
[ testProperty "Chebyshev 0" $ \a0 (Ch x) ->
(ch0 x * a0) ≈ (chebyshev x $ fromList [a0])
, testProperty "Chebyshev 1" $ \a0 a1 (Ch x) ->
(a0*ch0 x + a1*ch1 x) ≈ (chebyshev x $ fromList [a0,a1])
, testProperty "Chebyshev 2" $ \a0 a1 a2 (Ch x) ->
(a0*ch0 x + a1*ch1 x + a2*ch2 x) ≈ (chebyshev x $ fromList [a0,a1,a2])
, testProperty "Chebyshev 3" $ \a0 a1 a2 a3 (Ch x) ->
(a0*ch0 x + a1*ch1 x + a2*ch2 x + a3*ch3 x) ≈ (chebyshev x $ fromList [a0,a1,a2,a3])
, testProperty "Chebyshev 4" $ \a0 a1 a2 a3 a4 (Ch x) ->
(a0*ch0 x + a1*ch1 x + a2*ch2 x + a3*ch3 x + a4*ch4 x) ≈ (chebyshev x $ fromList [a0,a1,a2,a3,a4])
]
where (≈) = eq 1e-12
-- Chebyshev polynomials of low order
ch0,ch1,ch2,ch3,ch4 :: Double -> Double
ch0 _ = 1
ch1 x = x
ch2 x = 2*x^2 - 1
ch3 x = 4*x^3 - 3*x
ch4 x = 8*x^4 - 8*x^2 + 1
-- Double in the [-1 .. 1] range
newtype Ch = Ch Double
deriving Show
instance Arbitrary Ch where
arbitrary = do x <- arbitrary
return $ Ch $ 2 * (snd . properFraction) x - 1