Adding a huge question for lab exercise 4.
\documentclass{article}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{color}
\usepackage{listings}
\usepackage{url}
%\definecolor{darkgreen}{rgb}{0,0.5,0}
\lstset{language=Python,
basicstyle=\ttfamily\bfseries,
commentstyle=\color{red}\itshape,
stringstyle=\color{green},
showstringspaces=false,
keywordstyle=\color{blue}\bfseries}
\title{A Glimpse at Scipy}
\author{FOSSEE}
\date{June 2010}
\begin{document}
\maketitle
\begin{abstract}
This document shows a glimpse of the features of Scipy that will be
explored during this course.
\end{abstract}
\section{Introduction}
SciPy is open-source software for mathematics, science, and
engineering.
SciPy (pronounced ``Sigh Pie'') is a collection of mathematical
algorithms and convenience functions built on the Numpy extension for
Python. It adds significant power to the interactive Python session by
exposing the user to high-level commands and classes for the
manipulation and visualization of data. With SciPy, an interactive
Python session becomes a data-processing and system-prototyping
environment rivaling sytems such as \emph{Matlab, IDL, Octave, R-Lab,
and Scilab}. \cite{scipy}
%% \begin{quote}
%% In 1998, ... I came across Python and its numerical extension
%% (Numeric) while I was looking for ways to analyze large data sets
%% ... using a high-level language. I quickly fell in love with
%% Python programming which is a remarkable statement to make about a
%% programming language. If I had not seen others with the same view,
%% I might have seriously doubted my sanity. -- Travis Oliphant, Creator of Numpy
%% \end{quote}
\subsection{Sub-packages of Scipy}
SciPy is organized into subpackages covering different scientific
computing domains. These are summarized in the \underline{table
\ref{subpkg}}.
\begin{table}
\caption{Sub-packages available in Scipy}
\label{subpkg}
\begin{tabular}{|l|l|}
\hline
\textbf{Subpackage} & \textbf{Description}\\
\hline
\texttt{cluster} & Clustering algorithms\\
\hline
\texttt{constants} & Physical and mathematical constants\\
\hline
\texttt{fftpack} & Fast Fourier Transform routines\\
\hline
\texttt{integrate} & Integration and ordinary differential equation
solvers\\
\hline
\texttt{interpolate} & Interpolation and smoothing splines\\
\hline
\texttt{io} & Input and Output\\
\hline
\texttt{linalg} & Linear algebra\\
\hline
\texttt{maxentropy} & Maximum entropy methods\\
\hline
\texttt{ndimage} & N-dimensional image processing\\
\hline
\texttt{odr} & Orthogonal distance regression\\
\hline
\texttt{optimize} & Optimization and root-finding routines\\
\hline
\texttt{signal} & Signal processing\\
\hline
\texttt{sparse} & Sparse matrices and associated routines\\
\hline
\texttt{spatial} & Spatial data structures and algorithms\\
\hline
\texttt{special} & Special functions\\
\hline
\texttt{stats} & Statistical distributions and functions\\
\hline
\texttt{weave} & C/C++ integration\\
\hline
\end{tabular}
\end{table}
\subsection{Use of Scipy in this course}
Following is a partial list of tasks we shall perform using Scipy, in
this course.
\begin{enumerate}
\item Plotting \footnote{using \texttt{pylab} - see Appendix
\ref{mpl}}
\item Matrix Operations
\begin{itemize}
\item Inverse
\item Determinant
\end{itemize}
\item Solving Equations
\begin{itemize}
\item System of Linear equations
\item Polynomials
\item Non-linear equations
\end{itemize}
\item Integration
\begin{itemize}
\item Quadrature
\item ODEs
\end{itemize}
\end{enumerate}
\section{A Glimpse of Scipy functions}
This section gives a brief overview of the tasks that are going to be
performed using Scipy, in future classes of this course.
\subsection{Matrix Operations}
Let $\mathbf{A}$ be the matrix
\(
\begin{bmatrix}
1 &3 &5\\
2 &5 &1\\
2 &3 &8
\end{bmatrix}
\)
To input $\mathbf{A}$ matrix into python, we do the following in
\texttt{ipython}\footnote{\texttt{ipython} must be started with
\texttt{-pylab} flag}\\
\begin{lstlisting}
In []: A = array([[1,3,5],[2,5,1],[2,3,8]])
\end{lstlisting}
\subsubsection{Inverse}
The inverse of a matrix $\mathbf{A}$ is the matrix $\mathbf{B}$ such
that $\mathbf{A}\mathbf{B} = \mathbf{I}$ where $\mathbf{I}$ is the
identity matrix consisting of ones down the main diagonal. Usually
$\mathbf{B}$ is denoted $\mathbf{B} = \mathbf{A}^{-1}$ . In SciPy, the
matrix inverse of matrix $\mathbf{A}$ is obtained using
\lstinline+inv(A)+.
\begin{lstlisting}
In []: inv(A)
Out[]:
array([[-1.48, 0.36, 0.88],
[ 0.56, 0.08, -0.36],
[ 0.16, -0.12, 0.04]])
\end{lstlisting}
\subsubsection{Determinant}
The determinant of a square matrix $\mathbf{A}$ is denoted
$\left|\mathbf{A}\right|$. Suppose $a_{ij}$ are the elements of the
matrix $\mathbf{A}$ and let
$\mathbf{M}_{ij}=\left|\mathbf{A}_{ij}\right|$ be the determinant of
the matrix left by removing the $i^{th}$ row and $j^{th}$ column from
$\mathbf{A}$. Then for any row $i$
\[ \left|\mathbf{A}\right|=\sum_{j}\left(-1\right)^{i+j}a_{ij}\mathbf{M}_{ij} \]
This is a recursive way to define the determinant where the base case
is defined by accepting that the determinant of a $1\times1$ matrix is
the only matrix element. In SciPy the determinant can be calculated
with $det$ . For example, the determinant of
\[ \mathbf{A}=\begin{bmatrix} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8\end{bmatrix}\]
is
\begin{eqnarray*}
|\mathbf{A}| & = & 1\begin{vmatrix} 5 & 1\\ 3 & 8\end{vmatrix}
-3\begin{vmatrix} 2 & 1\\ 2 & 8\end{vmatrix}
+5\begin{vmatrix}2 & 5\\ 2 & 3\end{vmatrix}\\
& = & 1(5\cdot8-3\cdot1)-3(2\cdot8-2\cdot1)+5(2\cdot3-2\cdot5)=-25
\end{eqnarray*}
In SciPy, this is computed as shown below
\begin{lstlisting}
In []: A = array([[1, 3, 5], [2, 5, 1], [2, 3, 8]])
In []: det(A)
Out[]: -25.0
\end{lstlisting}
\subsection{Solving Equations}
\subsubsection{Linear Equations}
Solving linear systems of equations is straightforward using the scipy
command \lstinline+solve+. This command expects an input matrix and a
right-hand-side vector. The solution vector is then computed. An
option for entering a symmetrix matrix is offered which can speed up
the processing when applicable. As an example, suppose it is desired
to solve the following simultaneous equations:
\begin{eqnarray} x+3y+5z & = & 10\\ 2x+5y+z & = & 8\\ 2x+3y+8z & = & 3\end{eqnarray}
We could find the solution vector using a matrix inverse:
\[ \left[\begin{array}{c} x\\ y\\ z\end{array}\right]=\left[\begin{array}{ccc} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8\end{array}\right]^{-1}\left[\begin{array}{c} 10\\ 8\\ 3\end{array}\right]=\frac{1}{25}\left[\begin{array}{c} -232\\ 129\\ 19\end{array}\right]=\left[\begin{array}{c} -9.28\\ 5.16\\ 0.76\end{array}\right] \]
However, it is better to use the solve command which can be faster and
more numerically stable. In this case it however gives the same
answer.
\begin{lstlisting}
In []: A = array([[1, 3, 5], [2, 5, 1], [2, 3, 8]])
In []: b = array([[10], [8], [3]])
In []: dot(inv(A), b)
Out[]:
array([[-9.28],
[ 5.16],
[ 0.76]])
In []: solve(A,b)
Out[]:
array([[-9.28],
[ 5.16],
[ 0.76]])
\end{lstlisting}
\subsubsection{Polynomials}
Solving a polynomial is straightforward in scipy using the
\lstinline+roots+ command. It expects the coefficients of the
polynomial in their decreasing order. For example, let's find the
roots of $x^3 - 2x^2 - \frac{1}{2}x + 1$ are $2$, $\sqrt{2}$ and
$-\sqrt{2}$. This is easy to see.
\begin{align*}
x^3 - 2x^2 - \frac{1}{2}x + 1 = 0\\
x^2(x-2) - \frac{1}{2}(x-2) = 0\\
(x-2)(x^2 - \frac{1}{2}) = 0\\
(x-2)(x - \frac{1}{\sqrt{2}})(x + \frac{1}{\sqrt{2}}) = 0
\end{align*}
We do it in scipy as shown below:
\begin{lstlisting}
In []: coeff = array([1, -2, -2, 4])
In []: roots(coeff)
\end{lstlisting}
\subsubsection{Non-linear Equations}
To find a root of a set of non-linear equations, the command
\lstinline+fsolve+ is needed. For example, the following example finds
the roots of the single-variable transcendental equation
\[ x+2\cos\left(x\right)=0,\]
and the set of non-linear equations
\begin{align}
x_{0}\cos\left(x_{1}\right) &= 4,\\
x_{0}x_{1}-x_{1} &= 5
\end{align}
The results are $x=-1.0299$ and $x_{0}=6.5041,\, x_{1}=0.9084$ .
\begin{lstlisting}
In []: def func(x):
...: return x + 2*cos(x)
In []: def func2(x):
...: out = [x[0]*cos(x[1]) - 4]
...: out.append(x[1]*x[0] - x[1] - 5)
...: return out
In []: from scipy.optimize import fsolve
In []: x0 = fsolve(func, 0.3)
In []: print x0
-1.02986652932
In []: x02 = fsolve(func2, [1, 1])
In []: print x02
[ 6.50409711 0.90841421]
\end{lstlisting}
\subsection{Integration}
% To be done in the lab.
\subsubsection{Quadrature}
The function \texttt{quad} is provided to integrate a function of one
variable between two points. The points can be $\pm\infty$ ($\pm$
\texttt{inf}) to indicate infinite limits. For example, suppose you
wish to integrate the expression $e^{\sin(x)}$ in the interval
$[0,2\pi]$, i.e. $\int_0^{2\pi}e^{\sin(x)}dx$, it could be computed
using
\begin{lstlisting}
In []: def func(x):
...: return exp(sin(x))
In []: from scipy.integrate import quad
In []: result = quad(func, 0, 2*pi)
In []: print result
(7.9549265210128457, 4.0521874164521979e-10)
\end{lstlisting}
\subsubsection{ODE}
We wish to solve an (a system of) Ordinary Differential Equation. For
this purpose, we shall use \lstinline{odeint}. As an illustration, let
us solve the ODE
\begin{align}
\frac{dy}{dt} = ky(L-y)\\
L = 25000,\,k = 0.00003,\,y(0) = 250 \nonumber
\end{align}
We solve it in scipy as shown below.
\begin{lstlisting}
In []: from scipy.integrate import odeint
In []: def f(y, t):
...: k, L = 0.00003, 25000
...: return k*y*(L-y)
...:
In []: t = linspace(0, 12, 60)
In []: y0 = 250
In []: y = odeint(f, y0, t)
\end{lstlisting}
Note: To solve a system of ODEs, we need to change the function to
return the right hand side of all the equations and the system and the
pass the required number of initial conditions to the
\lstinline{odeint} function.
\appendix
\section{Plotting using Pylab}\label{mpl}
The following piece of code, produces the plot in Figure \ref{fig:sin}
using \texttt{pylab}\cite{pylab} in \texttt{ipython}\footnote{start
\texttt{ipython} with \texttt{-pylab} flag}\cite{ipy}
\begin{lstlisting}
In []: x = linspace(0, 2*pi, 50)
In []: plot(x, sin(x))
In []: title('Sine Curve between 0 and $\pi$')
In []: legend(['sin(x)'])
\end{lstlisting}
\begin{figure}[h!]
\begin{center}
\includegraphics[scale=0.4]{sine}
\end{center}
\caption{Sine curve}
\label{fig:sin}
\end{figure}
\begin{thebibliography}{9}
\bibitem{scipy}
Eric Jones and Travis Oliphant and Pearu Peterson and others,
\emph{SciPy: Open source scientific tools for Python}, 2001 -- ,
\url{http://www.scipy.org/}
\bibitem{pylab}
John D. Hunter, ``Matplotlib: A 2D Graphics Environment,''
\emph{Computing in Science and Engineering}, vol. 9, no. 3,
pp. 90-95, May/June 2007, doi:10.1109/MCSE.2007.55
\bibitem{ipy}
Fernando Perez, Brian E. Granger, ``IPython: A System for
Interactive Scientific Computing,'' \emph{Computing in Science and
Engineering}, vol.~9, no.~3, pp.~21-29, May/June 2007,
doi:10.1109/MCSE.2007.53.
\end{thebibliography}
\end{document}