|
|
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
|
|