dsp-0.1: Numeric/Approximation/Chebyshev.hs
-----------------------------------------------------------------------------
-- |
-- Module : Numeric.Approximation.Chebyshev
-- Copyright : (c) Matthew Donadio 2003
-- License : GPL
--
-- Maintainer : m.p.donadio@ieee.org
-- Stability : experimental
-- Portability : portable
--
-- Function approximation using Chebyshev polynomials
--
-- @ f(x) = ( sum (k=0..N-1) c_k * T_k(x) ) - 0.5 * c_0 @
--
-- over the interval @ [a,b] @
--
-- Reference: NRiC
--
-----------------------------------------------------------------------------
module Numeric.Approximation.Chebyshev (cheby_approx,
cheby_eval) where
import Data.Array
-- | Calculates the Chebyshev approximation to @f(x)@ over @[a,b]@
cheby_approx :: (Double -> Double) -- ^ f(x)
-> Double -- ^ a
-> Double -- ^ b
-> Int -- ^ N
-> [Double] -- ^ c_n
cheby_approx f a b n = f''
where a' = 0.5 * (b - a)
b' = 0.5 * (b + a)
y = [ a' * cos (pi * (fromIntegral k + 0.5) / fromIntegral n) + b' | k <- [0..n-1] ]
f' = map f y
f'' = [ 2 * sum (zipWith (*) f' [ cos (pi * fromIntegral j * (fromIntegral k + 0.5) / fromIntegral n) | k <- [0..n-1] ]) / fromIntegral n | j <- [0..n-1] ]
-- | Evaluates the Chebyshev approximation to @f(x)@ over @[a,b]@ at @x@
cheby_eval :: [Double] -- ^ c_n
-> Double -- ^ a
-> Double -- ^ b
-> Double -- ^ x
-> Double -- ^ f(x)
cheby_eval f a b x = y * d!1 - d!2 + 0.5 * c!0
where y = (2 * x - a - b) / (b - a)
c = listArray (0,n) f
d = array (1,n+2) ((n+2,0) : (n+1,0) : [ (j,2*y*d!(j+1) - d!(j+2) + c!j) | j <- [1..n] ])
n = length f - 1