module Numeric.GSL.Differentiation (
derivCentral,
derivForward,
derivBackward
) where
import Foreign.C.Types
import Foreign.Marshal.Alloc(malloc, free)
import Foreign.Ptr(Ptr, FunPtr, freeHaskellFunPtr)
import Foreign.Storable(peek)
import Numeric.GSL.Internal
import System.IO.Unsafe(unsafePerformIO)
derivGen ::
CInt
-> Double
-> (Double -> Double)
-> Double
-> (Double, Double)
derivGen :: CInt -> Double -> (Double -> Double) -> Double -> (Double, Double)
derivGen CInt
c Double
h Double -> Double
f Double
x = IO (Double, Double) -> (Double, Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Double) -> (Double, Double))
-> IO (Double, Double) -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ do
Ptr Double
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
Ptr Double
e <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
FunPtr (Double -> Ptr () -> Double)
fp <- (Double -> Ptr () -> Double)
-> IO (FunPtr (Double -> Ptr () -> Double))
mkfun (\Double
y Ptr ()
_ -> Double -> Double
f Double
y)
CInt
-> FunPtr (Double -> Ptr () -> Double)
-> Double
-> Double
-> Ptr Double
-> Ptr Double
-> IO CInt
c_deriv CInt
c FunPtr (Double -> Ptr () -> Double)
fp Double
x Double
h Ptr Double
r Ptr Double
e IO CInt -> (IO CInt -> IO ()) -> IO ()
forall x y. x -> (x -> y) -> y
// String -> IO CInt -> IO ()
check String
"deriv"
Double
vr <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
r
Double
ve <- Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
e
let result :: (Double, Double)
result = (Double
vr,Double
ve)
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
r
Ptr Double -> IO ()
forall a. Ptr a -> IO ()
free Ptr Double
e
FunPtr (Double -> Ptr () -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Ptr () -> Double)
fp
(Double, Double) -> IO (Double, Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Double, Double)
result
foreign import ccall safe "gsl-aux.h deriv"
c_deriv :: CInt -> FunPtr (Double -> Ptr () -> Double) -> Double -> Double
-> Ptr Double -> Ptr Double -> IO CInt
derivCentral :: Double
-> (Double -> Double)
-> Double
-> (Double, Double)
derivCentral :: Double -> (Double -> Double) -> Double -> (Double, Double)
derivCentral = CInt -> Double -> (Double -> Double) -> Double -> (Double, Double)
derivGen CInt
0
derivForward :: Double
-> (Double -> Double)
-> Double
-> (Double, Double)
derivForward :: Double -> (Double -> Double) -> Double -> (Double, Double)
derivForward = CInt -> Double -> (Double -> Double) -> Double -> (Double, Double)
derivGen CInt
1
derivBackward ::Double
-> (Double -> Double)
-> Double
-> (Double, Double)
derivBackward :: Double -> (Double -> Double) -> Double -> (Double, Double)
derivBackward = CInt -> Double -> (Double -> Double) -> Double -> (Double, Double)
derivGen CInt
2
foreign import ccall safe "wrapper" mkfun:: (Double -> Ptr() -> Double) -> IO( FunPtr (Double -> Ptr() -> Double))