(Sethna, "Entropy, Order Parameters, and Complexity", ex. 5.9)
© 2017, James Sethna, all rights reserved. This exercise was developed in collaboration with Christopher Myers.
Chaotic dynamical systems have sensitive dependence on initial conditions. This is commonly described as the `butterfly effect' (due to Lorenz of the Lorenz attractor): the effects of the flap of a butterfly's wings in Brazil build up with time until months later a tornado in Texas could be launched. In this exercise, we will see this sensitive dependence for a particular system (the logistic map) and measure the sensitivity by defining the Lyapunov exponents.
Import packages
# Sometimes gives interactive new windows|
# Must show() after plot, figure() before new plot
# %matplotlib
# Adds static figures to notebook: good for printing
%matplotlib inline
# Interactive windows inside notebook! Must include plt.figure() between plots
# %matplotlib notebook
# Better than from numpy import *, but need np.sin(), np.array(), plt.plot(), etc.
import numpy as np
import matplotlib.pyplot as plt
The logistic map takes the interval $(0,1)$ into itself: \begin{equation} f(x) = 4 \mu x (1-x), \end{equation} where the time evolution is given by iterating the map: \begin{equation} x_0, x_1, x_2, \ldots = x_0, f(x_0), f(f(x_0)), \ldots . \end{equation} In particular, for $\mu=1$ it precisely folds the unit interval in half, and stretches it (non-uniformly) to cover the original domain.
def f(x,mu):
"""
Logistic map f(x) = 4 mu x (1-x), which folds the unit interval (0,1)
into itself.
"""
return 4*...
The mathematics community lumps together continuous dynamical evolution laws and discrete mappings as both being dynamical systems. (The Poincar'e section, as described in the exercise 'Jupiter', takes a continuous, recirculating dynamical system and replaces it with a once-return map, providing the standard motivation for treating maps and continuous evolution laws together. This motivation does not directly apply here, because the logistic map is not invertible, so it is not directly given by a Poincar'e section of a smooth differential equation. (Remember the existence and uniqueness theorems from math class? The invertibility follows from uniqueness.) ) The general stretching and folding exhibited by our map is often seen in driven physical systems without conservation laws.
In this exercise, we will focus on values of $\mu$ near one, where the motion is mostly chaotic. Chaos is sometimes defined as motion where the final position depends sensitively on the initial conditions. Two trajectories, starting a distance $\epsilon$ apart, will typically drift apart in time as $\epsilon e^{\lambda t}$, where $\lambda$ is the Lyapunov exponent for the chaotic dynamics.
Start with $\mu = 0.9$ and two nearby points $x_0$ and $y_0=x_0+\epsilon$ somewhere between zero and one. Investigate the two trajectories $x_0, f(x_0), f(f(x_0)), ..., f^{[n]}(x_0)$ and $y_0, f(y_0), \dots$. How fast do they separate? Why do they stop separating? Estimate the Lyapunov exponent. (Hint: $\epsilon$ can be a few times the precision of the machine (around $10^{-17}$ for double-precision arithmetic), so long as you are not near the maximum value of $f$ at $x_0 = 0.5$.)mu = 0.9
x = 0.4
eps = 3.e-17
y = x + eps
fiter1 = [x]
fiter2 = [y]
for i in range(200):
x = ...
fiter1.append(x)
y = ...
...
fiter1 = np.array(fiter1)
fiter2 = np.array(fiter2)
diff = fiter1-fiter2
diffPlot = plt.semilogy(fabs(...))
ts = np.arange(200)
lyapunov = ...
diffPlot = plt.semilogy(np.fabs(diff))
plt.semilogy(ts, eps*np.exp(...), 'r-');
Many Hamiltonian systems are also chaotic. Two configurations of classical atoms or billiard balls, with initial positions and velocities that are almost identical, will rapidly diverge as the collisions magnify small initial deviations in angle and velocity into large ones. It is this chaotic stretching, folding, and kneading of phase space that is at the root of our explanation that entropy increases.