packages feed

dynobud-1.0.0.0: src/Dyno/Dae.hs

{-# OPTIONS_GHC -Wall #-}

module Dyno.Dae
       ( Dae
       , ExplicitOde
       , ImplicitOde
       , SemiExplicitDae
       , Integrator
       , forwardEuler
       , rk4
       ) where

import Dyno.Vectorize

--type Dae x z u p r a = x a -> x a -> z a -> u a -> p a -> a -> r a
type Dae x z u p r a = x a -> z a -> u a -> p a -> r a

type ExplicitOde x u p a = Dae x None u p x a
type ImplicitOde x u p r a = Dae x None u p r a
type SemiExplicitDae x z u p r a = Dae x z u p (Tuple x r) a

type Integrator x z u p r a = Dae x z u p r a -> a -> x a -> u a -> p a -> x a

-- x0 + dx - xf == 0
forwardEuler :: (Vectorize x, Num a) => Integrator x None u p x a
forwardEuler f ts x0 u p = vzipWith (+) x0 deltaX
  where
    deltaX = fmap (*ts) xdot
    xdot = f x0 None u p

rk4 :: (Vectorize x, Fractional a) => Integrator x None u p x a
rk4 f h x0 u p = vzipWith (+) x0 deltaX
  where
    deltaX = mul (h/6) (k1  `add` mul 2 k2 `add` mul 2 k3 `add` k4)
    k1 = f x0 None u p
    k2 = f (x0 `add` mul (h/2) k1) None u p
    k3 = f (x0 `add` mul (h/2) k2) None u p
    k4 = f (x0 `add` mul h     k3) None u p

    mul y = fmap (y*)
    add = vzipWith (+)