{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Plain.LorenzAttractor where

import qualified Algebra.Module as Module
import qualified Algebra.Ring   as Ring

import NumericPrelude.Numeric
import NumericPrelude.Base


computeDerivatives :: (Ring.C y) =>
   (y, y, y) -> (y, y, y) -> (y, y, y)
computeDerivatives :: forall y. C y => (y, y, y) -> (y, y, y) -> (y, y, y)
computeDerivatives (y
a,y
b,y
c) (y
x,y
y,y
z) =
   let x' :: y
x' = y
ay -> y -> y
forall a. C a => a -> a -> a
*(y
yy -> y -> y
forall a. C a => a -> a -> a
-y
x)
       y' :: y
y' = y
xy -> y -> y
forall a. C a => a -> a -> a
*(y
by -> y -> y
forall a. C a => a -> a -> a
-y
z) y -> y -> y
forall a. C a => a -> a -> a
- y
y
       z' :: y
z' = y
xy -> y -> y
forall a. C a => a -> a -> a
*y
y y -> y -> y
forall a. C a => a -> a -> a
-y
cy -> y -> y
forall a. C a => a -> a -> a
*y
z
   in  (y
x',y
y',y
z')

explicitEuler :: (Module.C a v) =>
   a -> (v -> v) -> v -> [v]
explicitEuler :: forall a v. C a v => a -> (v -> v) -> v -> [v]
explicitEuler a
h v -> v
phi v
s =
   let ys :: [v]
ys = v
s v -> [v] -> [v]
forall a. a -> [a] -> [a]
: (v -> v) -> [v] -> [v]
forall a b. (a -> b) -> [a] -> [b]
map (\v
y -> v
y v -> v -> v
forall a. C a => a -> a -> a
+ a
h a -> v -> v
forall a v. C a v => a -> v -> v
*> v -> v
phi v
y) [v]
ys
   in  [v]
ys


equilibrium :: (Double, Double, Double)
equilibrium :: (Double, Double, Double)
equilibrium = (Double -> Double
forall a. C a => a -> a
sqrt Double
72, Double -> Double
forall a. C a => a -> a
sqrt Double
72, Double
27.001)

example0 :: [(Double, Double, Double)]
example0 :: [(Double, Double, Double)]
example0 =
   Double
-> ((Double, Double, Double) -> (Double, Double, Double))
-> (Double, Double, Double)
-> [(Double, Double, Double)]
forall a v. C a v => a -> (v -> v) -> v -> [v]
explicitEuler (Double
0.01::Double)
      ((Double, Double, Double)
-> (Double, Double, Double) -> (Double, Double, Double)
forall y. C y => (y, y, y) -> (y, y, y) -> (y, y, y)
computeDerivatives (Double
10, Double
28, Double
8Double -> Double -> Double
forall a. C a => a -> a -> a
/Double
3)) (Double, Double, Double)
equilibrium

example :: [(Double, Double, Double)]
example :: [(Double, Double, Double)]
example =
   Double
-> ((Double, Double, Double) -> (Double, Double, Double))
-> (Double, Double, Double)
-> [(Double, Double, Double)]
forall a v. C a v => a -> (v -> v) -> v -> [v]
explicitEuler (Double
0.01::Double)
      ((Double, Double, Double)
-> (Double, Double, Double) -> (Double, Double, Double)
forall y. C y => (y, y, y) -> (y, y, y) -> (y, y, y)
computeDerivatives (Double
10, Double
28, Double
8Double -> Double -> Double
forall a. C a => a -> a -> a
/Double
3)) (Double
8.5, Double
8.6, Double
27)