packages feed

scubature-1.0.0.0: src/Numeric/Integration/Simplex/Simplex.hs

module Numeric.Integration.Simplex.Simplex
  where
import Data.Matrix (detLU, elementwiseUnsafe, fromLists)

type Simplex = [[Double]]
type Simplices = [Simplex]

isValidSimplex :: Simplex -> Bool
isValidSimplex simplex =
  (length simplex == dim + 1) &&
    all ((== dim) . length) (tail simplex)
  where dim = length (head simplex)

isValidSimplices :: Simplices -> Bool
isValidSimplices simplices =
  all isValidSimplex simplices &&
    all ((== spaceDim (head simplices)) . spaceDim) (tail simplices)
  where spaceDim simplex = length (head simplex)

canonicalSimplex :: Int -> Simplex
canonicalSimplex dim =
  replicate dim 0 :
    map (\v -> map (fromIntegral.fromEnum.(== v)) [1..dim]) [1..dim]

simplexVolume :: Simplex -> Double -- rq: tu calcules le fact à chaque fois
simplexVolume s = abs (detLU v) / fromIntegral (product [1..n])
  where n = length s - 1
        m1 = fromLists (tail s)
        m2 = fromLists $ replicate n (head s)
        v = elementwiseUnsafe (-) m1 m2

jacobian :: Simplex -> Double -- not used
jacobian s = abs (detLU (elementwiseUnsafe (-) m1 m2))
  where m1 = fromLists (tail s)
        m2 = fromLists $ replicate (length s - 1) (head s)