numeric-ode-0.0.0.0: src/Math/Integrators/SympleticEuler.hs
{-# LANGUAGE FlexibleContexts #-}
module Math.Integrators.SympleticEuler
where
import Linear
import Control.Lens
import Math.Integrators.Implicit
eps :: Floating a => a
eps = 1e-10
sympleticEuler1 :: (Metric f, Num (f a), Floating a, Ord a)
=> (f a -> f a -> f a)
-> (f a -> f a -> f a)
-> a -- ^ Step size
-> V2 (f a) -- ^ Current \((p,q)\) as a 2-dimentional vector
-> V2 (f a) -- ^ New \((p, q)\) as a 2-dimetional vector
sympleticEuler1 f g = \h prev ->
-- explicit coordinate
let u' = (prev^._x) ^+^ h *^ (f (prev^._x) v')
-- implicit coordinate
v' = fixedPoint (\x -> (prev^._y) ^+^ h *^ (g (prev^._x) x))
(\x1 x2 -> breakNormIR (x1^-^x2) eps) (prev^._x)
in V2 u' v'
{-
sEuler2 :: ((a->a->a),(a->a->a)) -> Double -> (a,a) -> (a,a)
sEuler2 (a,b) h (u,v) =
let u' = u + ( h * (a u' v) )
v' = v + ( h * (b u' v) )
in (u',v')
-}