Hide code cell content
import mmf_setup;mmf_setup.nbinit()
from pathlib import Path
import os
FIG_DIR = Path(mmf_setup.ROOT) / '../Docs/_build/figures/'
os.makedirs(FIG_DIR, exist_ok=True)
import logging;logging.getLogger('matplotlib').setLevel(logging.CRITICAL)
%matplotlib inline
import numpy as np, matplotlib.pyplot as plt

This cell adds /home/docs/checkouts/readthedocs.org/user_builds/physics-521-classical-mechanics-i/checkouts/latest/src to your path, and contains some definitions for equations and some CSS for styling the notebook. If things look a bit strange, please try the following:

  • Choose "Trust Notebook" from the "File" menu.
  • Re-execute this cell.
  • Reload the notebook.

Perturbation Theory#

Here we work through chapter 8 of [Percival and Richards, 1982] which provides a nice introduction to the application of perturbation theory in dynamical systems.

Example 8.1 from [Percival and Richards, 1982]#

\[\begin{gather*} \dot{x} = x + \epsilon x^2, \qquad x(0) = A. \end{gather*}\]

This example demonstrates how a perturbation can qualitatively change the nature of the solution. While the unperturbed solution is valid for all times, the perturbed solution diverges at a finite time \(t_c = \ln(1 + 1/\epsilon A)\) due to the appearance of a pole.

Asymptotic Series#

Here is another type of problem that can occur with perturbative solutions. Consider the following system:

\[\begin{gather*} \epsilon \dot{x} = -x + e^{-t}, \qquad x(0) = 1, \qquad x(t) = \frac{e^{-t} - \epsilon e^{-t/\epsilon}}{1-\epsilon}. \end{gather*}\]

Here we are faced with an example where the series fails to converge to the correct solution, even if we expand it to all orders. This is due to the non-analytic pieces \(e^{-t/\epsilon}\) whose Taylor coefficients are all zero. This is an example of an aymptotic series.

Hide code cell source
t = np.linspace(0, 2)

def x(t, epsilon):
    return (np.exp(-t) - epsilon * np.exp(-t/epsilon))/(1-epsilon)

def x_n(t, epsilon, N):
    return np.exp(-t)*sum([epsilon**n for n in range(N+1)])

fig, ax = plt.subplots()

ax.plot(t, x(t, epsilon=0.1))
for N in range(2):
    ax.plot(t, x_n(t, epsilon=0.1, N=N), label=f"${N=}$")
../_images/42cc89ce3f57fa7a8e3640cca4dd07f25818606f9f11fa1656075ad0777469cc.png