|  |  | You know what? Screw it. Let's start again...
data State = State {velocity, position :: !Double}
data Derivative = Derivative {dvelocity, dposition :: !Double}
evaluate :: State -> Double -> Double -> Maybe Derivative -> Derivative
evaluate s t dt Nothing = Derivative {dvelocity = acceleration s t, 
dposition = velocity s}
evaluate s t dt (Just d) =
   let
     s' = State {velocity = velocity s + dvelocity d * dt, position = 
position s + dposition d * dt}
   in  Derivative {dvelocity = acceleration s' (t+dt), dposition = 
velocity s'}
integrate :: State -> Double -> Double -> State
integrate s t dt =
   let
     a = evaluate s t dt     Nothing
     b = evaluate s t (dt/2) (Just a)
     c = evaluate s t (dt/2) (Just b)
     d = evaluate s t dt     (Just c)
     dv = (dvelocity a + 2 * (dvelocity b + dvelocity c) + dvelocity d) / 6
     dp = (dposition a + 2 * (dposition b + dposition c) + dposition d) / 6
   in  State {velocity = velocity s + dv * dt, position = position s + 
dp * dt}
acceleration :: State -> Double -> Double
acceleration = error "not implemented yet"
Does that look correct?
-- 
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
 |  |