AERN-RnToRm-0.4.9: src/Data/Number/ER/RnToRm/UnitDom/ChebyshevBase/Polynom.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-|
Module : Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom
Description : polynoms in the Chebyshev basis of the 1st kind
Copyright : (c) 2007-2008 Michal Konecny
License : BSD3
Maintainer : mik@konecny.aow.cz
Stability : experimental
Portability : portable
Arithmetic of multivariate polynomials
represented by their coefficients it the Chebyshev basis.
The polynomials are never to be used outside the domain @[-1,1]^n@.
All operations are rounded in such a way that the resulting polynomial
is a /point-wise upper or lower bound/ of the exact result.
-}
module Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom
(
ERChebPoly(..), TermKey
)
where
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Basic
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Eval
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Reduce
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Ring
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Bounds
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Enclosure
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Compose
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Integration
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Division
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Elementary
import qualified Data.Number.ER.RnToRm.UnitDom.Base as UFB
import qualified Data.Number.ER.Real.Base as B
import Data.Number.ER.Real.Approx.Interval
import Data.Number.ER.Real.DomainBox (VariableID(..), DomainBox, DomainBoxMappable, DomainIntBox)
import qualified Data.Map as Map
{- code for testing purpose, to be deleted later -}
import Data.Number.ER.Real.DefaultRepr
import Data.Number.ER.Real.DomainBox.IntMap
type P = ERChebPoly (Box Int) B
x0 = chplVar 0 :: P
x1 = chplVar 1 :: P
x2 = chplVar 2 :: P
x3 = chplVar 3 :: P
x4 = chplVar 4 :: P
p1 = x1 *^ x1 *^ x1 +^ x1 *^ (x2 +^ (chplConst 2)) *^ (x3 -^ (chplConst 3))
{- end of code for testing purposes -}
instance
(B.ERRealBase rb, RealFrac rb,
DomainBox box varid Int, Ord box,
DomainBoxMappable boxb boxras varid rb [ERInterval rb],
DomainBoxMappable boxra boxras varid (ERInterval rb) [ERInterval rb],
DomainIntBox boxra varid (ERInterval rb)) =>
(UFB.ERUnitFnBase boxb boxra varid rb (ERInterval rb) (ERChebPoly box rb))
where
{----- Miscellaneous associated operations -----}
raEndpoints _ (ERInterval l h) = (l,h)
raEndpoints _ ERIntervalAny = (- B.plusInfinity, B.plusInfinity)
raFromEndpoints _ (l,h) = normaliseERInterval (ERInterval l h)
compareApprox = chplCompareApprox
showDiGrCmp = chplShow
{----- Structural analysis and update of functions -----}
isValid = chplHasNoNaNOrInfty
check = chplCheck
getGranularity = chplGetGranularity
setMinGranularity = chplSetMinGranularity
setGranularity = chplSetGranularity
getDegree = chplGetDegree
reduceDegreeUp = chplReduceDegreeUp
getSize = chplCountTerms
reduceSizeUp = chplReduceTermCountUp
getVariables = chplGetVars
{----- Construction of basic functions -----}
const = chplConst
constEncl (low, high) = (chplConst (-low), chplConst high)
affine = chplAffine
{----- Pointwise order operations ----------}
upperBound = chplUpperBound
maxUp = chplMaxUp
minUp = chplMinUp
{----- Field operations ----------}
neg = chplNeg
scaleUp = chplScaleUp
scaleApproxUp = chplScaleRAUp
(+^) = (+^)
(-^) = (-^)
(*^) = (*^)
multiplyEncl = enclMultiply
recipUp md mt ix f = snd $ enclRecip md mt ix (md + 1) (chplNeg f, f)
recipEncl md mt ix = enclRecip md mt ix (md + 1)
{----- Evaluation and composition of functions -----}
evalUp pt f = chplEvalUp f pt
evalApprox x ufb = chplRAEval (\ b -> ERInterval b b) ufb x
partialEvalApproxUp substitutions ufb =
snd $
chplPartialRAEval (UFB.raEndpoints ufb) ufb substitutions
composeUp m n f v fv = snd $ enclCompose m n f v (enclThin fv)
composeEncl = enclCompose
composeManyUp m n f subst = snd $ enclComposeMany m n f (Map.map enclThin subst)
composeManyEncls = enclComposeMany
{----- Selected elementary operations ----------}
sqrtEncl = enclSqrt
expEncl = enclExp
logEncl = enclLog
sinEncl = enclSine
cosEncl = enclCosine
atanEncl = enclAtan
integrate = chplIntegrate