{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Arnoldi Iteration"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import numpy.linalg as la\n",
        "\n",
        "import matplotlib.pyplot as pt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Let us make a matrix with a defined set of eigenvalues and eigenvectors, given by `eigvals` and `eigvecs`."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  11.  12.  13.  14.  15.\n",
            "  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.]\n",
            "[ 25.  24.  23.   1.   2.   3.  22.   4.  21.  20.   5.   6.   7.  19.  18.\n",
            "   8.   9.  17.  16.  10.  11.  12.  15.  14.  13.]\n"
          ]
        }
      ],
      "source": [
        "np.random.seed(40)\n",
        "\n",
        "# Generate matrix with eigenvalues 1...25\n",
        "n = 25\n",
        "eigvals = np.linspace(1., n, n)\n",
        "eigvecs = np.random.randn(n, n)\n",
        "print(eigvals)\n",
        "\n",
        "A = la.solve(eigvecs, np.dot(np.diag(eigvals), eigvecs))\n",
        "print(la.eig(A)[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Initialization"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Set up $Q$ and $H$:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 41,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "Q = np.zeros((n, n))\n",
        "H = np.zeros((n, n))\n",
        "\n",
        "k = 0"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Pick a starting vector, normalize it"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 42,
      "metadata": {
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "x0 = np.random.randn(n)\n",
        "x0 = x0/la.norm(x0)\n",
        "\n",
        "# Poke it into the first column of Q\n",
        "Q[:, k] = x0\n",
        "\n",
        "del x0"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Make a list to save arrays of Ritz values:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 43,
      "metadata": {
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "# ritz_values = []"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Algorithm"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Carry out one iteration of Arnoldi iteration.\n",
        "\n",
        "Run this cell in-place (Ctrl-Enter) until H is filled."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 68,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "24\n"
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7fdec8f59f60>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "print(k)\n",
        "\n",
        "u = A @ Q[:, k]\n",
        "\n",
        "# Carry out Gram-Schmidt on u against Q\n",
        "for j in range(k+1):\n",
        "    qj = Q[:, j]\n",
        "    H[j,k] = qj @ u\n",
        "    u = u - H[j,k]*qj\n",
        "\n",
        "if k+1 < n:\n",
        "    H[k+1, k] = la.norm(u)\n",
        "    Q[:, k+1] = u/H[k+1, k]\n",
        "\n",
        "k += 1\n",
        "\n",
        "pt.spy(H)\n",
        "\n",
        "ritz_values.append(la.eig(H)[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Check that $Q^T A Q =H$:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 69,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "1.1737482867077595e-07"
            ]
          },
          "execution_count": 69,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(Q.T @ A @ Q - H)/ la.norm(A)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Check that Q is orthogonal:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 70,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "8.1107123737065295e-07"
            ]
          },
          "execution_count": 70,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(Q.T @ Q - np.eye(n))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Plot convergence of Ritz values"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Enable the Ritz value collection above to make this work."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 74,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/lib/python3/dist-packages/numpy/core/numeric.py:474: ComplexWarning: Casting complex values to real discards the imaginary part\n",
            "  return array(a, dtype, copy=False, order=order)\n"
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7fdec8d0e978>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "for i, rv in enumerate(ritz_values):\n",
        "    pt.plot([i] * len(rv), rv, \"x\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.5.1+"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}