%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tutorial slides on Python.
%
% Author: Prabhu Ramachandran <prabhu at aero.iitb.ac.in>
% Copyright (c) 2005-2009, Prabhu Ramachandran
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass[14pt,compress]{beamer}
%\documentclass[draft]{beamer}
%\documentclass[compress,handout]{beamer}
%\usepackage{pgfpages} 
%\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]

% Modified from: generic-ornate-15min-45min.de.tex
\mode<presentation>
{
  \usetheme{Warsaw}
  \useoutertheme{split}
  \setbeamercovered{transparent}
}

\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
%\usepackage{times}
\usepackage[T1]{fontenc}

% Taken from Fernando's slides.
\usepackage{ae,aecompl}
\usepackage{mathpazo,courier,euler}
\usepackage[scaled=.95]{helvet}

\definecolor{darkgreen}{rgb}{0,0.5,0}

\usepackage{listings}
\lstset{language=Python,
    basicstyle=\ttfamily\bfseries,
    commentstyle=\color{red}\itshape,
  stringstyle=\color{darkgreen},
  showstringspaces=false,
  keywordstyle=\color{blue}\bfseries}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Macros
\setbeamercolor{emphbar}{bg=blue!20, fg=black}
\newcommand{\emphbar}[1]
{\begin{beamercolorbox}[rounded=true]{emphbar} 
      {#1}
 \end{beamercolorbox}
}
\newcounter{time}
\setcounter{time}{0}
\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\tiny \thetime\ m}}

\newcommand{\typ}[1]{\lstinline{#1}}

\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}}  }

%%% This is from Fernando's setup.
% \usepackage{color}
% \definecolor{orange}{cmyk}{0,0.4,0.8,0.2}
% % Use and configure listings package for nicely formatted code
% \usepackage{listings}
% \lstset{
%    language=Python,
%    basicstyle=\small\ttfamily,
%    commentstyle=\ttfamily\color{blue},
%    stringstyle=\ttfamily\color{orange},
%    showstringspaces=false,
%    breaklines=true,
%    postbreak = \space\dots
% }


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Title page
\title[]{Numerical Computing with Numpy \& Scipy}

\author[FOSSEE Team] {Asokan Pichai\\Prabhu Ramachandran}

\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
\date[] {11, October 2009}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo}
%\logo{\pgfuseimage{iitmlogo}}


%% Delete this, if you do not want the table of contents to pop up at
%% the beginning of each subsection:
\AtBeginSubsection[]
{
  \begin{frame}<beamer>
    \frametitle{Outline}
    \tableofcontents[currentsection,currentsubsection]
  \end{frame}
}

\AtBeginSection[]
{
  \begin{frame}<beamer>
    \frametitle{Outline}
    \tableofcontents[currentsection,currentsubsection]
  \end{frame}
}

% If you wish to uncover everything in a step-wise fashion, uncomment
% the following command: 
%\beamerdefaultoverlayspecification{<+->}

%\includeonlyframes{current,current1,current2,current3,current4,current5,current6}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DOCUMENT STARTS
\begin{document}

\begin{frame}
  \maketitle
\end{frame}

\begin{frame}[fragile]
  \frametitle{Broadcasting}
  \begin{itemize}
    \item Used so that functions can take inputs that are not of the same shape.
    \item 2 rules -
      \begin{enumerate}
      \item 1 (repeatedly) pre-pended to shapes of smaller arrays
      \item Size 1 in a dimension -> Largest size in that dimension
      \end{enumerate}
  \end{itemize}
  \begin{columns}
    \column{0.65\textwidth}
    \hspace*{-1.5in}
    \begin{lstlisting}
      >>> x = np.arange(4)
      >>> x+3
      array([3, 4, 5, 6])
    \end{lstlisting}
    \column{0.35\textwidth}
    \includegraphics[height=0.7in, interpolate=true]{data/broadcast_scalar}
  \end{columns}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Broadcasting in 3D}
    \begin{lstlisting}
      >>> x = np.zeros((3, 5))
      >>> y = np.zeros(8)
      >>> (x[..., None] + y).shape
      (3, 5, 8)
    \end{lstlisting}
    \begin{figure}
      \begin{center}
      \includegraphics[height=1.5in, interpolate=true]{data/array_3x5x8}        
      \end{center}
    \end{figure}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Copies \& Views}
  \begin{lstlisting}
    >>> a = array([[1,2,3], [4,5,6],     
                   [7,8,9]])
    >>> a[0,1:3]
    array([2, 3])
    >>> a[0::2,0::2]
    array([[1, 3],
          [7, 9]])
  \end{lstlisting}
  \begin{itemize}
  \item Slicing and Striding just reference the same memory
  \item They produce views of the data, not copies
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Copies contd \ldots}
  \begin{lstlisting}
    >>> a[np.array([0,1,2])]
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
  \end{lstlisting}
  \begin{itemize}
  \item Index arrays or Boolean arrays produce copies
  \end{itemize}
\inctime{15}
\end{frame}

\begin{frame}
  \frametitle{More Numpy Functions \& Methods}
  More functions
  \begin{itemize}
    \item \typ{take}
    \item \typ{choose}
    \item \typ{where}
    \item \typ{compress}
    \item \typ{concatenate}
  \end{itemize}
  Ufunc methods 
  \begin{itemize}
    \item \typ{reduce}
    \item \typ{accumulate}
    \item \typ{outer}
    \item \typ{reduceat}
  \end{itemize}
\inctime{5}
\end{frame}

\begin{frame}
    {Intro to SciPy}
  \begin{itemize}
  \item \url{http://www.scipy.org}
  \item Open source scientific libraries for Python
  \item Based on NumPy
    \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{SciPy}
  \begin{itemize}
  \item Provides:
    \begin{itemize}
    \item Linear algebra
    \item Numerical integration
    \item Fourier transforms
    \item Signal processing
    \item Special functions
    \item Statistics
    \item Optimization
    \item Image processing
    \item ODE solvers
    \end{itemize}
  \item Uses LAPACK, QUADPACK, ODEPACK, FFTPACK etc. from netlib
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Linear Algebra}
  \typ{>>> from scipy import linalg}
  \begin{itemize}
    \item \typ{linalg.det, linalg.norm}
    \item \typ{linalg.eig, linalg.lu}
    \item \typ{linalg.expm, linalg.logm}
    \item \typ{linalg.sinm, linalg.sinhm}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Linear Algebra \ldots}
  \begin{align*}
    3x + 2y - z  & = 1 \\
    2x - 2y + 4z  & = -2 \\
    -x + \frac{1}{2}y -z & = 0
  \end{align*}
  \begin{lstlisting}
    >>> linalg.solve(A,B)
  \end{lstlisting}
\inctime{15}
\end{frame}

\begin{frame}[fragile]
  \begin{itemize}
    \item Integrating Functions given function object
    \item Integrating Functions given fixed samples
    \item Numerical integrators of ODE systems
  \end{itemize}
  \frametitle{Integrate}
  Calculate $\int^1_0sin(x) + x^2$
  \begin{lstlisting}
    >>> def f(x):
            return np.sin(x)+x**2
    >>> integrate.quad(f, 0, 1)
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Integrate \ldots}
  Numerically solve ODEs\\
  \begin{align*}
  \frac{dx}{dt}&=-e^{(-t)}x^2(t)\\ 
           x(0)&=2    
  \end{align*}
  \begin{lstlisting}
    def dx_dt(x,t):
        return -np.exp(-t)*x**2

    x=integrate.odeint(dx_dt, 2, t)
    plt.plot(x,t)
  \end{lstlisting}
\inctime{10}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Interpolation}
  \begin{itemize}
    \item \typ{interpolate.interp1d, ...}
    \item \typ{interpolate.splrep, splev}
  \end{itemize}
  Cubic Spline of $sin(x)$
  \begin{lstlisting}
    x = np.arange(0,2*np.pi,np.pi/8)
    y = np.sin(x)
    t = interpolate.splrep(x,y,s=0)
    X = np.arange(0,2*np.pi,np.pi/50)
    Y = interpolate.splev(X,t,der=0)

    plt.plot(x,y,'o',x,y,X,Y)
    plt.show()
  \end{lstlisting}
\inctime{10}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Signal \& Image Processing}
    \begin{itemize}
     \item Convolution
     \item B-splines
     \item Filtering
     \item Filter design
     \item IIR filter design
     \item Linear Systems
     \item LTI Reresentations
     \item Waveforms
     \item Window functions
     \item Wavelets
    \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Signal \& Image Processing}
  Applying a simple median filter
  \begin{lstlisting}
    from scipy import signal, ndimage
    from scipy import lena
    A=lena().astype('float32')
    B=signal.medfilt2d(A)
    imshow(B)
  \end{lstlisting}
  Zooming an array - uses spline interpolation
  \begin{lstlisting}
    b=ndimage.zoom(A,0.5)
    imshow(b)
    \inctime{5}
  \end{lstlisting}

\end{frame}

\begin{frame}[fragile]
  \frametitle{Problems}
  The Van der Pol oscillator is a type of nonconservative oscillator with nonlinear damping. It evolves in time according to the second order differential equation:
  \begin{equation*}
  \frac{d^2x}{dt^2}+\mu(x^2-1)\frac{dx}{dt}+x= 0
  \end{equation*}
\inctime{25}
\end{frame}


\end{document}

- Numpy arrays (30 mins)
    - Matrices
    - random number generation.
    - Image manipulation: jigsaw puzzle.
    - Monte-carlo integration.


