module Data.Number.ER.Real.Arithmetic.Integration
(
integrateCont,
integrateCont_R,
integrateContAdapt_R
)
where
import qualified Data.Number.ER.Real.Approx as RA
import Data.Number.ER.BasicTypes
import Data.Number.ER.Real.Approx.Sequence
import Data.Number.ER.Real.Arithmetic.Elementary
testIntegr1 ::
(RA.ERIntApprox ira, Ord ira) =>
(ConvergRealSeq ira)
testIntegr1 = integrateCont erExp_IR 0 1
integrateCont ::
(RA.ERIntApprox ira) =>
(EffortIndex -> ira -> ira) ->
(ConvergRealSeq ira) -> (ConvergRealSeq ira) -> (ConvergRealSeq ira)
integrateCont f = convertBinFuncRA2Seq $ integrateContAdapt_R f
integrateDiff ::
(RA.ERIntApprox ira) =>
(EffortIndex -> ira -> ira, EffortIndex -> ira -> ira) ->
(ConvergRealSeq ra) -> (ConvergRealSeq ra) -> (ConvergRealSeq ra)
integrateDiff f = convertBinFuncRA2Seq $ integrateDiffAdapt_RA f
integrateCont_R ::
(RA.ERIntApprox ira) =>
(EffortIndex -> ira -> ira) ->
EffortIndex -> (ira) -> (ira) -> (ira)
integrateCont_R f ix a b =
sum $ map rectArea rectangles
where
rectArea (width, height) = width * height
rectangles =
zip (repeat width) $ map (f ix) covering
width = (b a) / (fromInteger rectCount)
rectCount = 2 * (fromInteger $ toInteger gran)
gran = effIx2gran ix
covering = getCoveringIntervals division
getCoveringIntervals ( pt1 : pt2 : rest ) =
((pt1) RA.\/ (pt2)) : (getCoveringIntervals $ pt2 : rest)
getCoveringIntervals _ = []
division = map getEndPoint $ [0..rectCount]
getEndPoint n =
a + ((fromInteger n) * width)
integrateContAdapt_R ::
(RA.ERIntApprox ira) =>
(EffortIndex -> ira -> ira) ->
EffortIndex -> (ira) -> (ira) -> (ira)
integrateContAdapt_R f ix a b =
sum rectangleAreas
where
rectangleAreas =
getRs 10 a b
getRs subix l r
| RA.getPrecision area >= prec = [area]
| otherwise =
(getRs nsubix l m) ++ (getRs nsubix m r)
where
prec = foldl1 min [effIx2prec ix, RA.getPrecision l, RA.getPrecision r]
area = (r l) * (f subix (l RA.\/ r))
nsubix = subix + 1
m = (l + r)/2
integrateDiffAdapt_RA ::
(RA.ERIntApprox ira) =>
(EffortIndex -> ira -> ira, EffortIndex -> ira -> ira) ->
EffortIndex -> (ra) -> (ra) -> (ra)
integrateDiffAdapt_RA f prec a b =
error "TODO"