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
r <- IO (Ptr Double)
forall a. Storable a => IO (Ptr a)
malloc
e <- malloc
fp <- mkfun (\Double
y Ptr ()
_ -> Double -> Double
f Double
y)
c_deriv c fp x h r e // check "deriv"
vr <- peek r
ve <- peek e
let result = (Double
vr,Double
ve)
free r
free e
freeHaskellFunPtr fp
return 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))