{-# LANGUAGE RecursiveDo #-} module Model (model) where import Simulation.Aivika import Simulation.Aivika.SystemDynamics import Simulation.Aivika.Experiment model :: Simulation Results model = mdo x <- memoRandomNormalDynamics 3 0.8 sumX <- diffsum x 0 sumX2 <- diffsum (x * x) 0 -- it would be much more efficient to say: -- let n = fmap fromIntegral integIteration n <- diffsum 1 0 let avg = ifDynamics (n .>. 0) (sumX / n) 0 let std = ifDynamics (n .>. 1) (sqrt ((sumX2 - sumX * avg) / (n - 1))) 0 return $ results [resultSource "t" "time" time, resultSource "n" "n" n, resultSource "x" "x" x, resultSource "sumX" "sum x" sumX, resultSource "sumX2" "sum x^2" sumX2, resultSource "avg" "Ex" avg, resultSource "std" "sqrt(Dx)" std]