module Numeric.Interpolation.Private.Basis where

import Numeric.Interpolation.Private.Piece (sqr)

import qualified Data.List.Match as Match


_hermite1Split :: [a] -> [b] -> [(b, b)]
_hermite1Split :: [a] -> [b] -> [(b, b)]
_hermite1Split [a]
xs = ([b] -> [b] -> [(b, b)]) -> ([b], [b]) -> [(b, b)]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [b] -> [b] -> [(b, b)]
forall a b. [a] -> [b] -> [(a, b)]
zip (([b], [b]) -> [(b, b)]) -> ([b] -> ([b], [b])) -> [b] -> [(b, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [b] -> ([b], [b])
forall b a. [b] -> [a] -> ([a], [a])
Match.splitAt [a]
xs

hermite1Split :: [a] -> [b] -> [(b, b)]
hermite1Split :: [a] -> [b] -> [(b, b)]
hermite1Split [a]
_ = [b] -> [(b, b)]
forall a. [a] -> [(a, a)]
pairs

pairs :: [a] -> [(a,a)]
pairs :: [a] -> [(a, a)]
pairs (a
x0:a
x1:[a]
xs) = (a
x0,a
x1) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [a] -> [(a, a)]
forall a. [a] -> [(a, a)]
pairs [a]
xs
pairs [] = []
pairs [a]
_ = [Char] -> [(a, a)]
forall a. HasCallStack => [Char] -> a
error [Char]
"pairs: odd number of elements"


parabolaDerivative ::
   (Fractional a) => (a,a) -> (a,a) -> (a,a) -> a -> (a,a)
parabolaDerivative :: (a, a) -> (a, a) -> (a, a) -> a -> (a, a)
parabolaDerivative (a
x0,a
y0) (a
x1,a
y1) (a
x2,a
y2) a
x =
   let l0 :: a
l0 = (a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Num a => a -> a -> a
*(a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x2)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x2))
       l1 :: a
l1 = (a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x2)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2))
       l2 :: a
l2 = (a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x1))
       dl0 :: a
dl0 = (a
2a -> a -> a
forall a. Num a => a -> a -> a
*a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x2))
       dl1 :: a
dl1 = (a
2a -> a -> a
forall a. Num a => a -> a -> a
*a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2))
       dl2 :: a
dl2 = (a
2a -> a -> a
forall a. Num a => a -> a -> a
*a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x1))
   in  (a
y0a -> a -> a
forall a. Num a => a -> a -> a
*a
l0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
y1a -> a -> a
forall a. Num a => a -> a -> a
*a
l1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
y2a -> a -> a
forall a. Num a => a -> a -> a
*a
l2, a
y0a -> a -> a
forall a. Num a => a -> a -> a
*a
dl0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
y1a -> a -> a
forall a. Num a => a -> a -> a
*a
dl1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
y2a -> a -> a
forall a. Num a => a -> a -> a
*a
dl2)

parabolaBasisDerivativeLeft,
   parabolaBasisDerivativeCenter,
   parabolaBasisDerivativeRight ::
      (Fractional a) => a -> a -> a -> a
parabolaBasisDerivativeLeft :: a -> a -> a -> a
parabolaBasisDerivativeLeft   a
x0 a
x1 a
x2 = (a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x2))
parabolaBasisDerivativeCenter :: a -> a -> a -> a
parabolaBasisDerivativeCenter a
x0 a
x1 a
x2 = a
1a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)
parabolaBasisDerivativeRight :: a -> a -> a -> a
parabolaBasisDerivativeRight  a
x0 a
x1 a
x2 = (a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x1))

parabolaDerivativeCenterNode ::
   (Fractional a) => (a,a) -> (a,a) -> (a,a) -> a
parabolaDerivativeCenterNode :: (a, a) -> (a, a) -> (a, a) -> a
parabolaDerivativeCenterNode (a
x0,a
y0) (a
x1,a
y1) (a
x2,a
y2) =
   a
y0 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a -> a -> a
forall a. Fractional a => a -> a -> a -> a
parabolaBasisDerivativeLeft   a
x0 a
x1 a
x2 a -> a -> a
forall a. Num a => a -> a -> a
+
   a
y1 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a -> a -> a
forall a. Fractional a => a -> a -> a -> a
parabolaBasisDerivativeCenter a
x0 a
x1 a
x2 a -> a -> a
forall a. Num a => a -> a -> a
+
   a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a -> a -> a
forall a. Fractional a => a -> a -> a -> a
parabolaBasisDerivativeRight  a
x0 a
x1 a
x2


parabola2ndDerivativeCenterNode ::
   (Fractional a) => (a,a) -> (a,a) -> (a,a) -> (a,a) -> a
parabola2ndDerivativeCenterNode :: (a, a) -> (a, a) -> (a, a) -> (a, a) -> a
parabola2ndDerivativeCenterNode (a
xl,a
yl) (a
x0,a
y0) (a
x1,a
y1) (a
x2,a
y2) =
   let dy0 :: a
dy0 =
          a
yl a -> a -> a
forall a. Num a => a -> a -> a
* (a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
xla -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
xla -> a -> a
forall a. Num a => a -> a -> a
-a
x1)) a -> a -> a
forall a. Num a => a -> a -> a
+
          a
y0 a -> a -> a
forall a. Num a => a -> a -> a
* (a
1a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
xl) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)) a -> a -> a
forall a. Num a => a -> a -> a
+
          a
y1 a -> a -> a
forall a. Num a => a -> a -> a
* (a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
xl)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
xl)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0))
       dy1 :: a
dy1 =
          a
y0 a -> a -> a
forall a. Num a => a -> a -> a
* (a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)) a -> a -> a
forall a. Num a => a -> a -> a
+
          a
y1 a -> a -> a
forall a. Num a => a -> a -> a
* (a
1a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x2)) a -> a -> a
forall a. Num a => a -> a -> a
+
          a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* (a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Fractional a => a -> a -> a
/((a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)a -> a -> a
forall a. Num a => a -> a -> a
*(a
x2a -> a -> a
forall a. Num a => a -> a -> a
-a
x1))
       d :: a
d = (a
y1a -> a -> a
forall a. Num a => a -> a -> a
-a
y0)a -> a -> a
forall a. Fractional a => a -> a -> a
/(a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0)
       x :: a
x = a
x0
   in  a
2a -> a -> a
forall a. Num a => a -> a -> a
*(a
dy0a -> a -> a
forall a. Num a => a -> a -> a
-a
d) a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Num a => a -> a
sqr (a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1) a -> a -> a
forall a. Num a => a -> a -> a
* (a
3a -> a -> a
forall a. Num a => a -> a -> a
*a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
2a -> a -> a
forall a. Num a => a -> a -> a
*a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0) a -> a -> a
forall a. Num a => a -> a -> a
+
       a
2a -> a -> a
forall a. Num a => a -> a -> a
*(a
dy1a -> a -> a
forall a. Num a => a -> a -> a
-a
d) a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Num a => a -> a
sqr (a
x1a -> a -> a
forall a. Num a => a -> a -> a
-a
x0) a -> a -> a
forall a. Num a => a -> a -> a
* (a
3a -> a -> a
forall a. Num a => a -> a -> a
*a
xa -> a -> a
forall a. Num a => a -> a -> a
-a
2a -> a -> a
forall a. Num a => a -> a -> a
*a
x0a -> a -> a
forall a. Num a => a -> a -> a
-a
x1)