The archetypal chaotic dynamical system is the Lorentz system, defined
by the differential equation system
where , and are real constants. On the
face of it, this looks like a fairly innocuous set of differential
equations. However, as is well known, for a wide range of choices for
the parameters , and , this system of
equations has chaotic orbits, with sensitive dependence on initial
conditions and an attractor of fractal dimension.
Determining whether a given dynamical system will exhibit chaotic
behaviour is, in general, difficult .
The orbit structure of chaotic systems can be very complex, and it can
be difficult to distinguish true chaos from a number of related
phenomena.
One approach to characterising the orbit structure of dynamical
systems is via Lyapunov exponents, a spectrum of values that
measure the stretching and squashing of orbits -- "normal" chaotic
systems normally have at least one positive Lyapunov exponent and are
dissipative, which means that the sum of all of their Lyapunov
exponents is negative. While it is relatively straightforward to
define Lyapunov exponents, in practice calculating them is tricky.
We'll see how to do this in some practical cases in this and the next
couple of articles, following mostly the approach of
Rangarajan et
al. (1998).
The motivation for this series of articles was basically that I have
recently been wondering about how practical it would be to use Haskell
for more "traditional" mathematics: there is a big body of work and
code relating to category theory and type theory in Haskell, but I've
not seen so much about matrix algebra, differential equations,
dynamical systems and so on. I implemented the Rangarajan method in
Mathematica some years ago and thought it might be a good test case.
I'm going to gloss over a lot of technical details about the
computation of Lyapunov exponents since my main interest is in the
Haskell implementation issues.