packages feed

clifford-0.1.0.14: examples/Pendulum.hs

{-# LANGUAGE NoImplicitPrelude, NoMonomorphismRestriction, DataKinds #-}
import NumericPrelude (Double, fst, snd, ($), (.), seq)
import Prelude (getLine, putStrLn)
import Algebra.Transcendental
import Data.List.Stream
import Numeric.Clifford.Multivector
import Algebra.Ring 
import Algebra.Additive 
import Algebra.Field
import Numeric.Clifford.NumericIntegration
import Numeric.Clifford.NumericIntegration.DefaultIntegrators
import Numeric.Clifford.Blade

import Control.Lens
import Graphics.Rendering.Chart
import Data.Colour
import Data.Colour.Names
import Data.Default.Class
import Graphics.Rendering.Chart.Backend.Cairo

m = scalar 3 :: E3Vector
l = scalar 20 :: E3Vector
g = scalar 9.81 :: E3Vector

hamil _ [p,theta] =   [ (-m*g*l)* sin theta, p / (m*l*l)] 

integrator = gaussLegendreFourthOrder 0.1 hamil



tenSeconds :: [(Double,Double,Double)]
tenSeconds = map ((\ (t, ([BladeSum [Blade a []],BladeSum [Blade b []]])) -> (t,a,b) ) )  $ take 5001 $ iterate integrator (0,[zero,one/10])


chart = toRenderable layout
  where
    momentum = plot_lines_values .~ [ ( map (\(t,p,_) -> (t,p)) tenSeconds )]
                     $ plot_lines_style  . line_color .~ opaque blue
                     $ plot_lines_title .~ "momentum"
                     $ def

    angle = plot_lines_style . line_color .~ (opaque red)
                  $ plot_lines_values .~ [ ( map (\(t,_,theta) -> (t,theta)) tenSeconds )]
                  $ plot_lines_title .~ "angle"
                  $ def

    layout = layout_title .~ "Pendulum"
           $ layout_plots .~ [toPlot momentum,
                              toPlot angle]
           $ def

main = renderableToFile def  chart "pendulum.png"