.. Automatically generated reST file from Doconce source
(http://code.google.com/p/doconce/)
Experiments with Schemes for Exponential Decay
==============================================
:Author: Hans Petter Langtangen (hpl at simula.no)
:Date: August 20, 2012
*Summary.* This report investigates the accuracy of three finite difference
schemes for the ordinary differential equation :math:`u'=-au` with the
aid of numerical experiments. Numerical artifacts are in particular
demonstrated.
.. Section with multi-line equation.
.. _math:problem:
Mathematical problem
====================
.. index:: model problem
.. index:: exponential decay
We address the initial-value problem
.. math::
u'(t) &= -au(t), \quad t \in (0,T], \\
u(0) &= I,
where :math:`a`, :math:`I`, and :math:`T` are prescribed parameters, and :math:`u(t)` is
the unknown function to be estimated. This mathematical model
is relevant for physical phenomena featuring exponential decay
in time.
.. Section with single-line equation and a bullet list.
.. _numerical:problem:
Numerical solution method
=========================
.. index:: mesh in time
.. index:: :math:`\theta`-rule
.. index:: numerical scheme
.. index:: finite difference scheme
We introduce a mesh in time with points :math:`0= t_0< t_1 \cdots < t_N=T`.
For simplicity, we assume constant spacing :math:`\Delta t` between the
mesh points: :math:`\Delta t = t_{n}-t_{n-1}`, :math:`n=1,\ldots,N`. Let
:math:`u^n` be the numerical approximation to the exact solution at :math:`t_n`.
The :math:`\theta`-rule is used to solve (:ref:`ode`) numerically:
.. math::
u^{n+1} = \frac{1 - (1-\theta) a\Delta t}{1 + \theta a\Delta t}u^n,
for :math:`n=0,1,\ldots,N-1`. This scheme corresponds to
* The Forward Euler scheme when :math:`\theta=0`
* The Backward Euler scheme when :math:`\theta=1`
* The Crank-Nicolson scheme when :math:`\theta=1/2`
.. Section with computer code taken from a part of
.. a file. The fromto: f@t syntax copies from the
.. regular expression f up to the line, but not
.. including, the regular expression t.
Implementation
==============
The numerical method is implemented in a Python function:
.. code-block:: python
def theta_rule(I, a, T, dt, theta):
"""Solve u'=-a*u, u(0)=I, for t in (0,T] with steps of dt."""
N = int(round(T/float(dt))) # no of intervals
u = zeros(N+1)
t = linspace(0, T, N+1)
u[0] = I
for n in range(0, N):
u[n+1] = (1 - (1-theta)*a*dt)/(1 + theta*dt*a)*u[n]
return u, t
.. Section with figures.
Numerical experiments
=====================
.. index:: numerical experiments
We define a set of numerical experiments where :math:`I`, :math:`a`, and :math:`T` are
fixed, while :math:`\Delta t` and :math:`\theta` are varied.
In particular, :math:`I=1`, :math:`a=2`, :math:`\Delta t = 1.25, 0.75, 0.5, 0.1`.
.. Subsection with inline figure (figure without caption).
The Backward Euler method
-------------------------
.. index:: BE
.. figure:: BE.png
:width: 800
.. Subsection with inline figure (figure without caption).
The Crank-Nicolson method
-------------------------
.. index:: CN
.. figure:: CN.png
:width: 800
.. Subsection with inline figure (figure without caption).
The Forward Euler method
------------------------
.. index:: FE
.. figure:: FE.png
:width: 800
Error vs :math:`\Delta t`
-------------------------
.. Exemplify referring to a figure with label and caption.
.. index:: error vs time step
How :math:`E` varies with :math:`\Delta t` for :math:`\theta=0,0.5,1`
is shown in Figure :ref:`fig:E`.
.. _fig:E:
.. figure:: error.png
:width: 400
*Error versus time step*