{-# 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
aforall a. C a => a -> a -> a
*(y
yforall a. C a => a -> a -> a
-y
x)
       y' :: y
y' = y
xforall a. C a => a -> a -> a
*(y
bforall a. C a => a -> a -> a
-y
z) forall a. C a => a -> a -> a
- y
y
       z' :: y
z' = y
xforall a. C a => a -> a -> a
*y
y forall a. C a => a -> a -> a
-y
cforall 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 forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (\v
y -> v
y forall a. C a => a -> a -> a
+ a
h 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 = (forall a. C a => a -> a
sqrt Double
72, forall a. C a => a -> a
sqrt Double
72, Double
27.001)

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

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