{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "toc": "true" }, "source": [ "# Table of Contents\n", "

1  Lecture 14: Iterative methods for large scale eigenvalue problems
1.1  Previous lecture
1.2  Partial eigenvalue problem
1.3  Power method and related methods
1.3.1  Power method
1.3.2  Inverse iteration
1.3.3  Rayleigh quotient (RQ) iteration
1.3.4  Inexact inverse iteration framework
1.3.5  Block power method
1.3.6  Accelerating convergence of the block power method
1.4  Ritz approximation
1.4.1  Properties of the Ritz approximation
1.4.2  Rayleigh-Ritz method
1.5  Lanczos and Arnoldi methods
1.5.1  Why is \\theta_\\max \\approx \\lambda_\\max?
1.5.2  Demo: approximating largest eigenvalue with Lanczos
1.5.3  Practical issues and stability
1.5.4  More problems with the Lanczos method
1.6  PINVIT (preconditioned inverse iteration)
1.6.1  Derivation
1.6.2  Convergence theory
1.6.3  Block case
1.7  LOBPCG (Locally Optimal Block Preconditioned CG)
1.7.1  Locally optimal PCG (not \"Block\" so far :))
1.7.2  LOPCG (stable version)
1.7.3  Locally optimal block PCG
1.7.4  LOBPCG summary
1.8  Jacobi-Davidson (JD) method
1.8.1  JD derivation
1.8.2  Jacobi correction equation
1.8.3  Solving Jacobi correction equation
1.8.4  Connection to the Rayleigh quotient iteration
1.8.5  Preconditioning of Jacobi equation
1.8.6  Subspace acceleration in JD
1.8.7  The block case of JD
1.8.8  Jacobi-Davidson: summary
1.9  Software
1.10  Take-home message
1.11  Next lecture
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Lecture 14: Iterative methods for large scale eigenvalue problems" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Previous lecture\n", "\n", "- Finalizing iterative methods for linear systems (minres, bicg, bicgstab)\n", "\n", "- Jacobi, Gauss-Seidel, SSOR methods as preconditioners\n", "\n", "- Incomplete LU for preconditioning, three flavours: ILU(k), ILUT, ILU2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Partial eigenvalue problem\n", "\n", "- Recall that to find eigenvalues of matrix of size $N\\times N$ one can use, e.g. the QR algorithm.\n", "\n", "- However, in some applications matrix is so large, that we even can not store it exactly.\n", "\n", "- Typically such matrices are given as a **black-box** that is able only to multiply matrix by vector (sometimes even without access to matrix elements). This is what we assume today.\n", "\n", "- In this case the best we can do is to solve partial eigenvalue problem, e.g.\n", "\n", " - Find $k\\ll N$ smallest or largest eigenvalues (and eigenvectors if needed)\n", " - Find $k\\ll N$ eigenvalues closest to a given number $\\sigma$\n", "\n", "- For simplicity we will consider the case when matrix is normal and thus has orthonormal basis of eigenvectors. \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Power method and related methods\n", "\n", "### Power method\n", "\n", "Recall that the simplest method to find the largest eigenvalue is the **power method**\n", "\n", "$$\n", " x_{i+1} = \\frac{Ax_{i}}{\\|Ax_{i}\\|}\n", "$$\n", "\n", "The convergence is linear with rate $q = \\left|\\frac{\\lambda_1}{\\lambda_2}\\right|$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Inverse iteration\n", "\n", "To find the smallest eigenvalue one may run power method for $A^{-1}$:\n", "\n", "$$x_{i+1} = \\frac{A^{-1}x_{i}}{\\|A^{-1}x_{i}\\|}.$$\n", "\n", "To accelerate convergence shift-and-invert strategy can be used:\n", "\n", "$$x_{i+1} = \\frac{(A-\\sigma I)^{-1}x_{i}}{\\|(A-\\sigma I)^{-1}x_{i}\\|},$$\n", "\n", "where $\\sigma$ should be close to the eigenvalue we want to find." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Rayleigh quotient (RQ) iteration\n", "\n", "In order to get superlinear convergence one may use adaptive shifts:\n", "\n", "$$x_{i+1} = \\frac{(A-R(x_i) I)^{-1}x_{i}}{\\|(A-R(x_i) I)^{-1}x_{i}\\|},$$\n", "\n", "where $R(x_k) = \\frac{(x_i, Ax_i)}{(x_i, x_i)}$ is Rayleigh quotient. \n", "\n", "The method converges **cubically for Hermitian matrices** and quadratically for non-Hermitian case." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Inexact inverse iteration framework\n", "\n", "- Matrices $(A- \\sigma I)$ as well as $(A-R(x_i) I)$ are ill-conditioned if $\\sigma$ or $R(x_i)$ are close to eigenvalues.\n", "\n", "- Thus, if you are not given e.g. LU factorization of such matrix you might face a problem.\n", "\n", "- In practice you can solve systems only with some accuracy. Recall also that condition number is an upper bound and is overestimated for cosistent rhs. So, even in RQ iteration letting\n", "the shift tend to the eigenvalue [does not harm](http://www.sciencedirect.com/science/article/pii/S0024379505005756) significantly\n", "the performance of the iterative methods.\n", "\n", "- If accuracy of solution of systems increases from iteration to iteration, superlinear convergence for RQ iteration can still be present, see [Theorem 2.1](http://www.sciencedirect.com/science/article/pii/S0024379505005756).\n", "Otherwise, you will get linear convergence." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Block power method\n", "\n", "The block power method (also known as subspace iteration method or simultaneous vector iteration) is a natural generalization of the power method for several largest eigenvalues.
\n", "It looks as:\n", "\n", "1. $Y_0$ is $N\\times k$ matrix of rank $k$, $Y_0 = X_0 R_0$ (QR-decomposition)\n", "2. $Y_i = AX_{i-1}$ \n", "3. $Y_i = X_i R_i$ (QR-decomposition)\n", "\n", "QR-decomposition plays role of normalization in the standard power method. \n", "\n", "Moreover, orthogonalization prevents the columns of the $X_i$ from converging all to the eigenvector corresponding to the largest modulus eigenvalue." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Accelerating convergence of the block power method\n", "\n", "* For Hermitian matrices convergence of the $j$-column is **linear** as for the power method with $q=\\frac{|\\lambda_{j}|}{|\\lambda_{j+1}|}$. \n", "\n", "\n", "* Hence, applying the block power method to the matrix $(A-\\sigma I)^{-1}$ will accelerate convergence (shift-and-invert strategy).\n", "\n", "\n", "* You can also accelerate the convergence by applying the **Rayleigh-Ritz procedure** discussed below." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEKCAYAAAAFJbKyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xd4VFX+x/H3Nx2SkEAKLUBoobcQegvdBhZkaVZURBcEXN1Vd1fdVXdZxd476k8BFxuIK02aiFQBqQmd0AKBhISQfn5/3EkIISFtJpNMvq/nmWfu3Llz75lcyCfnnHvPEWMMSimlVEm5ObsASimlqhYNDqWUUqWiwaGUUqpUNDiUUkqVigaHUkqpUtHgUEopVSoaHEoppUpFg0MppVSpaHAopZQqFQ9nF8ARgoODTXh4uLOLoZRSVcrmzZvPGGNCitvOpYJDREYAI1q0aMGmTZucXRyllKpSRORwSbZzqaYqY8xCY8ykgIAAZxdFKaVclksFh1JKKcfT4FBKKVUqLtXHoZQqvczMTOLi4khLS3N2UVQF8fHxISwsDE9PzzJ93qWCI3/nuFKqZOLi4vD39yc8PBwRcXZxlIMZY0hISCAuLo6mTZuWaR8u1VSlneNKlV5aWhpBQUEaGtWEiBAUFFSuGqZLBYdSqmw0NKqX8p5vDY58lu06xXur9zu7GEopValpcOSzKuY0Ly+NJS0z29lFUapaee6552jXrh0dO3akc+fOrF+/3inlSExM5K233ir1555++mlmzZpV4u0XLFjAzJkzS32cqzl06BDt27e36z6LosGRz+A2oVzMzGbd/gRnF0WpamPdunV8//33bNmyhe3bt7Ns2TIaNWrksONlZWUV+V5Zg6O0Ro4cyWOPPebw4ziKSwWHiIwQkfeSkpLK9PmezYKo6eXOst2n7FwypVRRTpw4QXBwMN7e3gAEBwfToEEDADZv3syAAQPo2rUrw4cP58SJEwBER0czffp0evfuTfv27dmwYQMAGzZsoHfv3nTp0oXevXuzd+9eAGbPns3o0aMZMWIEw4YNIyUlhcGDBxMZGUmHDh347rvvAHjsscfYv38/nTt35tFHHwXghRdeoFu3bnTs2JGnnnoqr9zPPfccrVq1YsiQIXnHKej06dOMGjWKbt260a1bN9auXZtXnilTpgCwf/9+evbsSbdu3XjyySfx8/MDYMyYMfzwww95+7rrrrv46quvOHToEP369SMyMpLIyEh++eWXK467c+dOunfvTufOnenYsSOxsbFlOTVFcqnLcY0xC4GFUVFR95Xl8z6e7vRtEcxPe+IxxmiHoap2/rFwJ7uOn7frPts2qMVTI9oV+f6wYcP45z//SUREBEOGDGHMmDEMGDCAzMxMpk6dynfffUdISAjz5s3jr3/9Kx999BEAFy5c4JdffmH16tVMnDiRHTt20Lp1a1avXo2HhwfLli3jiSee4KuvvgKsms327dupU6cOWVlZfPPNN9SqVYszZ87Qs2dPRo4cycyZM9mxYwdbt24FYMmSJcTGxrJhwwaMMYwcOZLVq1fj6+vL3Llz+e2338jKyiIyMpKuXbte8d2mTZvGjBkz6Nu3L0eOHGH48OHs3r37im2mTZvGuHHjeOedd/LWjx07lnnz5nHdddeRkZHB8uXLefvttzHGsHTpUnx8fIiNjWXcuHFXjM33zjvvMG3aNCZMmEBGRgbZ2fZtfnep4LCHIW3qsmTXKXadOE+7BnpZr1KO5ufnx+bNm1mzZg0rVqxgzJgxzJw5k6ioKHbs2MHQoUMByM7Opn79+nmfGzduHAD9+/fn/PnzJCYmkpyczJ133klsbCwiQmZmZt72Q4cOpU6dOoB1L8MTTzzB6tWrcXNz49ixY5w6dWVLw5IlS1iyZAldunQBICUlhdjYWJKTk7n55pupWbMmYDU9FWbZsmXs2rUr7/X58+dJTk6+bJt169bx7bffAjB+/HgeeeQRAK699loeeugh0tPT+fHHH+nfvz81atQgKSmJKVOmsHXrVtzd3YmJibniuL169eK5554jLi6OW265hZYtW17tFJSaBkcBA1uHIgLLd8drcKhq52o1A0dyd3cnOjqa6OhoOnTowCeffELXrl1p164d69atK/QzBVsERIS///3vDBw4kG+++YZDhw4RHR2d976vr2/e8ueff87p06fZvHkznp6ehIeHF3pfgzGGxx9/nPvvv/+y9a+88kqJWiRycnJYt24dNWrUKHbbgnx8fIiOjmbx4sXMmzcvLyhffvll6taty7Zt28jJycHHx+eKz44fP54ePXqwaNEihg8fzgcffMCgQYNKXYaiuFQfhz2E+HvTKSyQ5drPoVSF2Lt372Vt8Fu3bqVJkya0atWK06dP5wVHZmYmO3fuzNtu3rx5APz8888EBAQQEBBAUlISDRs2BKx+hKIkJSURGhqKp6cnK1as4PBhazRxf3//y2oEw4cP56OPPiIlJQWAY8eOER8fT//+/fnmm2+4ePEiycnJLFy4sNDjDBs2jDfeeOOy71ZQz54985rT5s6de9l7Y8eO5eOPP2bNmjUMHz48r+z169fHzc2Nzz77rNBmqAMHDtCsWTMeeughRo4cyfbt24v8WZSFBkchBrcOZVtcEvHJOnaPUo6WkpLCnXfeSdu2benYsSO7du3i6aefxsvLi/nz5/OXv/yFTp060blz58s6gmvXrk3v3r2ZPHkyH374IQB//vOfefzxx+nTp89V2/UnTJjApk2biIqK4vPPP6d169YABAUF0adPH9q3b8+jjz7KsGHDGD9+PL169aJDhw7ceuutJCcnExkZyZgxY+jcuTOjRo2iX79+hR7ntddeY9OmTXTs2JG2bdte1oeR65VXXuGll16ie/funDhxgvwjXwwbNozVq1czZMgQvLy8AHjwwQf55JNP6NmzJzExMZfVpHLNmzeP9u3b07lzZ/bs2cMdd9xRgjNRcmKMsesOK4OoqChTnomcdh0/z3WvreE/ozowpltjO5ZMqcpn9+7dtGnTxtnFKJXo6GhmzZpFVFSUs4tSbqmpqdSoUQMRYe7cucyZMyfvKi9HKuy8i8hmY0yxP1Tt4yhEm/r+NAjwYdnueA0OpZRDbd68mSlTpmCMITAwMO+qscqs0geHiPgCbwEZwEpjzOcVcEwGt6nL/M1xpGVm4+Pp7uhDKqVKYeXKlc4ugt3069ePbdu2ObsYpeKUPg4R+UhE4kVkR4H114jIXhHZJyK5t1XeAsw3xtwHFH7NmwPoXeRKKVU4Z3WOzwauyb9CRNyBN4FrgbbAOBFpC4QBR22bVdggUr2aB+Hr5c5SvbpKKaUu45TgMMasBs4WWN0d2GeMOWCMyQDmAjcCcVjhARVYXm8Pd/q1DGH57lO44gUESilVVpXpctyGXKpZgBUYDYGvgVEi8jZQ+MXSgIhMEpFNIrLp9OnTdinQkLZ1OXU+nR3H7DsEg1JKVWWVKTgKuw3TGGMuGGPuNsY8cLWOcWPMe8aYKGNMVEhIiF0KNLBVCCLooIdKOdjJkycZO3YszZs3p23btlx33XXExMSUa6jw2bNnc/z4cTuX9JLw8HDOnDlT4u3vvffey4YfsYfSDuduL5UpOOKA/GMphwGlOuvlHR23oCA/b7o2rq3BoZQDGWO4+eabiY6OZv/+/ezatYt//etfhY4dVRplCY6rDbleXh988AFt27Z12P4rUmUKjo1ASxFpKiJewFhgQWl24Ig5xwe3qcvO4+c5kXTRbvtUSl2yYsUKPD09mTx5ct66zp07X3E3dv6hyAFuuOEGVq5cSXZ2NnfddRft27enQ4cOvPzyy8yfP59NmzYxYcIEOnfuzMWLF686RPsTTzzBgAEDePXVV4scCj0hIYFhw4bRpUsX7r///iL7PpcsWUKvXr2IjIxk9OjRecOVREdH541i++GHHxIREUF0dDT33XcfU6ZMISkpifDwcHJycgDrxsBGjRqRmZnJ+++/T7du3ejUqROjRo0iNTX1iuO+9tpreXffjx07tqyno0Scch+HiMwBooFgEYkDnjLGfCgiU4DFgDvwkTFm51V2U9h+RwAjWrRoYbeyDm0byn9+3MOy3fHc3rOJ3farVKX0v8fg5O/23We9DnBt0bPd7dixo9AhyUtq69atHDt2jB07rKv7ExMTCQwM5I033si7u7y4IdoTExNZtWoVYA0QWNhQ6P/4xz/o27cvTz75JIsWLeK99967oixnzpzh2WefZdmyZfj6+vKf//yHl156iSeffDJvm+PHj/PMM8+wZcsW/P39GTRoEJ06dSIgIIBOnTqxatUqBg4cyMKFCxk+fDienp7ccsst3HefNVvE3/72Nz788EOmTp162bFnzpzJwYMH8fb2JjExscw/z5JwSnAYY8YVsf4H4IfC3ivhfss1H0dhmof40SSoJst3n9LgUKoSatasGQcOHGDq1Klcf/31DBs27Ipt9u7de9Uh2seMGZO3XNRQ6KtXr+brr78G4Prrr6d27dpXHOfXX39l165d9OnTB4CMjAx69ep12TYbNmxgwIABeUO8jx49Om9o9DFjxjBv3jwGDhzI3LlzefDBBwErXP/2t7+RmJhISkpK3oCH+XXs2JEJEyZw0003cdNNN5XgJ1d2lf7O8dJwRI1DRBjSpi6frTtMYmoGgTW97LZvpSqdq9QMHKVdu3bMnz+/2O08PDzymnGAvGHQa9euzbZt21i8eDFvvvkmX3755RXDdhhjrjpEe/6BAq82FHpxQ6kbYxg6dChz5sy56jZF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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import copy\n", "%matplotlib inline\n", "\n", "n = 100\n", "k = 10\n", "A = np.diag(1./(1. + np.arange(n))) # diagonal matrix with well-separated maximum eigenvalues\n", "A_clustered = np.diag(1 - 1./(1. + np.arange(n))) # diagonal matrix with clustered maximum eigenvalues\n", "\n", "def subspace_iter(A, Y0, num_iter=100):\n", " Y0, _ = np.linalg.qr(Y0)\n", " Y = Y0.copy()\n", " Y_old = Y0.copy()\n", " err = []\n", " for i in range(num_iter):\n", " X = A.dot(Y)\n", " Y, _ = np.linalg.qr(X)\n", " err.append(np.linalg.norm(Y_old - Y.dot(Y.T.dot(Y_old))))\n", " Y_old = Y.copy()\n", " return Y, err\n", "\n", "Y0 = np.random.random((n, k))\n", "Y, err = subspace_iter(A, Y0, num_iter=100)\n", "Y, err_clustered = subspace_iter(A_clustered, Y0, num_iter=100) #np.diag((diagonal - sigma)**(-1))\n", "plt.semilogy(err, label='Separated eigvals')\n", "plt.semilogy(err_clustered, label='Clustered eigvals')\n", "plt.xlabel('Number of iterations')\n", "plt.ylabel('Error')\n", "plt.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Before we go to advanced methods let us discuss the important concept of **Ritz approximation**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Ritz approximation\n", "\n", "Given subspace spanned by columns of unitary matrix $Q_k$ of size $N\\times k$ we consider the projected matrix $Q_k^* A Q_k$.\n", "\n", "Let $\\Theta_k=\\mathrm{diag}(\\theta_1,\\dots,\\theta_k)$ and $S_k=\\begin{bmatrix}s_1 & \\dots & s_k \\end{bmatrix}$ be matrices of eigenvalues and eigenvectors of $(Q_k^* A Q_k)$: \n", "\n", "$$(Q_k^* A Q_k)S_k = S_k \\Theta_k$$\n", "\n", "then $\\{\\theta_i\\}$ are called **Ritz values** and $y_i = Q_k s_i$ - **Ritz vectors**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Properties of the Ritz approximation\n", "\n", "- Note that they are not eigenpairs of the initial matrix $AY_k\\not= Y_k \\Theta_k$, but the following equality holds:\n", "\n", " $$Q_k^* (AY_k - Y_k \\Theta_k) = Q_k^* (AQ_k S_k - Q_k S_k \\Theta_k) = 0,$$\n", "\n", " so the residual for the Ritz approximation is **orthogonal** to the subspace spanned by columns of $Q_k$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- $\\lambda_\\min(A) \\leq \\theta_\\min \\leq \\theta_\\max \\leq \\lambda_\\max(A)$. Indeed, using Rayleigh quotient:\n", "\n", " $$\\theta_\\min = \\lambda_\\min (Q_k^* A Q_k) = \\min_{x\\not=0} \\frac{x^* (Q_k^* A Q_k) x}{x^* x} = \\min_{y\\not=0:y=Q_k x} \\frac{y^* A y}{y^* y}\\geq \\min_{y\\not= 0} \\frac{y^* A y}{y^* y} = \\lambda_\\min(A).$$\n", "\n", " Obviously, $\\lambda_\\min (Q_k^* A Q_k) = \\lambda_\\min(A)$ if $k=N$, but we want to construct a basis $k\\ll N$ such that $\\lambda_\\min (Q_k^* A Q_k) \\approx \\lambda_\\min(A)$.\n", "\n", " Similarly, $\\theta_\\max \\leq \\lambda_\\max(A)$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Rayleigh-Ritz method\n", "\n", "Thus, if a subspace $V$ approximates first $k$ eigenvectors, then one can use the **Rayleigh-Ritz method**:\n", "\n", "1. Find orthonormal basis $Q_k$ in $V$ (e.g. by using QR decomposition)\n", "2. Calculate $Q_k^*AQ_k$\n", "3. Compute Ritz values and vectors\n", "4. Note that alternatevly one could use $V$ with no orthogonalization, but then generalized eigenvalue problem $(V^*AV)s_i = \\theta_i (V^*V)s_i$ has to be solved.\n", "\n", "The question is how to find a good subspace $V$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Lanczos and Arnoldi methods\n", "\n", "The good choice for $V$ is the Krylov subspace.\n", "\n", "Recall that in the power method we used only one Krylov vector \n", "\n", "$$x_k = \\frac{A^k x_0}{\\|A^k x_0\\|}.$$\n", "\n", "In this case $\\theta_k = \\frac{x_k^* A x_k}{x_k^* x_k}$ is nothing but a Ritz value. Natural idea is to use a bigger Krylov subspace.\n", "\n", "As a result we can find more eigenvalues (power method only gives $\\lambda_\\max$). Moreover,convergence of the eigenvalue corresponding to $\\lambda_\\max$ will be faster." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "For Hermitian matrices from the Arnoldi relation we have\n", "\n", "$$\n", "Q_k^*AQ_k = T_k,\n", "$$\n", "\n", "where $Q_k$ is orthogonal basis in the Krylov subspace generated by the Lanczos procedure and $T_k$ is triangular matrix.\n", "\n", "According to the Rayleigh-Ritz method we expect that eigenvalues of $T_k$ approximate eigenvalues of $A$. This method is called the **Lanczos method**. For nonsymmetric matrices it is called the **Arnoldi method** and instead of tridiagonal $T_k$ we would get upper=Hessenberg matrix.\n", "\n", "Let us show that $\\theta_\\max \\approx\\lambda_\\max$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Why is $\\theta_\\max \\approx \\lambda_\\max$?\n", "\n", "Let us denote $\\theta_1 \\equiv \\theta_\\max$ and $\\lambda_1 \\equiv \\lambda_\\max$. Then\n", "\n", "$$\n", " \\theta_1 = \\max_{y\\in \\mathcal{K}_i, y\\not=0}\\frac{(y,Ay)}{(y,y)} = \\max_{p_{i-1}} \\frac{(p_{i-1}(A)x_0, A p_{i-1}(A)x_0)}{(p_{i-1}(A)x_0, p_{i-1}(A)x_0)},\n", "$$\n", "\n", "where $p_{i-1}$ is a polynomial of degree not greater than $i-1$ such that $p_{i-1}(A)x_0\\not=0$.\n", "\n", "Expand $x_0 = \\sum_{j=1}^N c_j v_j$, where $v_j$ are eigenvectors of $A$ (form orthonormal basis).\n", "\n", "Since $\\theta_1 \\leq \\lambda_1$ we get\n", "$$\n", " \\lambda_1 - \\theta_1 \\leq \\lambda_1 - \\frac{(p_{i-1}(A)x_0, A p_{i-1}(A)x_0)}{(p_{i-1}(A)x_0, p_{i-1}(A)x_0)}\n", "$$\n", "for any polynomial $p_{i-1}$. Hence\n", "$$\n", "\\lambda_1 - \\theta_1 \\leq \\lambda_1 - \\frac{\\sum_{k=1}^N \\lambda_k |p_{i-1}(\\lambda_k)|^2 |c_k|^2}{\\sum_{k=1}^N |p_{i-1}(\\lambda_k)|^2 |c_k|^2} =\n", "$$\n", "$$\n", "= \\frac{\\sum_{k=2}^N (\\lambda_1 - \\lambda_k) |p_{i-1}(\\lambda_k)|^2 |c_k|^2}{|p_{i-1}(\\lambda_1)|^2 |c_1|^2 + \\sum_{k=2}^N |p_{i-1}(\\lambda_k)|^2 |c_k|^2} \\leq \n", "(\\lambda_1 - \\lambda_n) \\frac{\\max_{2\\leq k \\leq N}|p_{i-1}(\\lambda_k)|^2}{|p_{i-1}(\\lambda_1)|^2 }\\gamma, \\quad \\gamma = \\frac{\\sum_{k=2}^N|c_k|^2}{|c_1|^2}\n", "$$\n", "\n", "Since the inequality holds for any polynomial $p_{i-1}$ we will choose a polynomial: \n", "\n", "$$|p_{i-1}(\\lambda_1)| \\gg \\max_{2\\leq k \\leq N}|p_{i-1}(\\lambda_k)|.$$\n", "\n", "This holds, e.g. for the Chebyshev polynomial on $[\\lambda_n,\\lambda_2]$. Thus, $\\theta_1 \\approx \\lambda_1$ or more precisely (Paige-Kaniel error bound, check it!):\n", "$$\n", " \\lambda_1 - \\theta_1 \\leq \\frac{\\lambda_1 - \\lambda_n}{T_{i-1}^2(1 + 2\\mu)}\\gamma, \\quad \\mu = \\frac{\\lambda_1 - \\lambda_2}{\\lambda_2 - \\lambda_n},\n", "$$\n", "where $T_{i-1}$ is a Chebyshev polynomial." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Demo: approximating largest eigenvalue with Lanczos" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k=10, err = 0.1097290322596427\n", "k=20, err = 0.02941322892533016\n", "k=100, err = 4.511147011498906e-11\n" ] } ], "source": [ "import scipy as sp\n", "import scipy.sparse\n", "from scipy.sparse import csc_matrix, csr_matrix\n", "import matplotlib.pyplot as plt\n", "import scipy.linalg\n", "import scipy.sparse.linalg\n", "import copy\n", "n = 40\n", "ex = np.ones(n)\n", "lp1 = sp.sparse.spdiags(np.vstack((ex, -2*ex, ex)), [-1, 0, 1], n, n, 'csr')\n", "e = sp.sparse.eye(n)\n", "A = sp.sparse.kron(lp1, e) + sp.sparse.kron(e, lp1)\n", "\n", "def lanczos(A, m):\n", " n = A.shape[0]\n", " v = np.random.random((n, 1))\n", " v = v / np.linalg.norm(v)\n", " v_old = np.zeros((n, 1))\n", " beta = np.zeros(m)\n", " alpha = np.zeros(m)\n", " for j in range(m-1):\n", " w = A.dot(v)\n", " alpha[j] = w.T.dot(v)\n", " w = w - alpha[j] * v - beta[j] * v_old\n", " beta[j+1] = np.linalg.norm(w)\n", " v_old = v.copy()\n", " v = w / beta[j+1]\n", " w = A.dot(v)\n", " alpha[m-1] = w.T.dot(v)\n", " A = np.diag(beta[1:], k=-1) + np.diag(beta[1:], k=1) + np.diag(alpha[:], k=0)\n", " l, _ = np.linalg.eigh(A)\n", " return l\n", "\n", "# Approximation of the largest eigenvalue for different k\n", "l_large_exact = sp.sparse.linalg.eigsh(A, k=99, which='LM')[0][0]\n", "print('k=10, err = {}'.format(np.abs(l_large_exact - lanczos(A, 10)[0])))\n", "print('k=20, err = {}'.format(np.abs(l_large_exact - lanczos(A, 20)[0])))\n", "print('k=100, err = {}'.format(np.abs(l_large_exact - lanczos(A, 100)[0])))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Practical issues and stability\n", "\n", "- The Lanczos vectors may loose orthogonality during the process due to floating-point errors, thus all practical implementations of it use **restarts**.\n", "\n", "- A very good introduction to the topic is given in the book of **Golub and Van-Loan (Matrix Computations)**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### More problems with the Lanczos method\n", "\n", "- Applying Lanczos directly to $A$ may result into a very slow convergence if $\\lambda_i\\approx \\lambda_{i+1}$
(typically holds for smallest eigenvalues that are not well-separated)\n", "\n", "\n", "- To accelerate the convergence one may apply Lanczos to $(A-\\sigma I)^{-1}$, but in this case systems have to be solved **very accurately**.
\n", "Otherwise the Arnoldi relation does not hold anymore.\n", "\n", "An alternative to this approach are the so-called preconditioned iterative methods that include:\n", "1. PINVIT (Preconditioned Inverse Iteration)\n", "2. LOBCPG (Locally optimal block preconditioned CG)\n", "3. Jacobi-Davidson method" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## PINVIT (preconditioned inverse iteration)\n", "\n", "### Derivation\n", "\n", "Consider Rayleigh quotient $R(x) = \\frac{(x,Ax)}{(x,x)}$. Then\n", "$$\n", "\\nabla R(x) = \\frac{2}{(x,x)} (Ax - R(x) x),\n", "$$\n", "\n", "so the simplest gradient descent method with a preconditioner $B$ reads\n", "\n", "$$\n", " x_{i+1} = x_{i} - \\tau_i B^{-1} (Ax_i - R(x_i) x_i),\n", "$$\n", "\n", "$$\n", " x_{i+1} = \\frac{x_{i+1}}{\\|x_{i+1}\\|}.\n", "$$\n", "\n", "Typically $B\\approx (A-\\sigma I)$, where $\\sigma$ is called shift.\n", "\n", "The closer $\\sigma$ to the required eigenvalue is, the faster the convergence." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- Parameter $\\tau_k$ is chosen to minimize the $R(x_{i+1})$ over $\\tau_k$ (steepest descent method).\n", "\n", "- One can think of this minimization procedure as minimization in basis $V = [x_i, r_i]$, where $r_{i}=B^{-1} (Ax_i - R(x_i) x_i)$.\n", "\n", "- This results into the generalized eigenvalue problem $(V^*AV)\\begin{bmatrix}1 \\\\ -\\tau_i \\end{bmatrix} = \\theta (V^*V) \\begin{bmatrix}1 \\\\ -\\tau_i \\end{bmatrix}$ (Rayleigh-Ritz procedure with no orthogonalization of $V$). Here $\\theta$ is the closest to the required eigenvalue." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "### Convergence theory\n", "\n", "**Theorem** ([Knyazev and Neymeyr](http://www.sciencedirect.com/science/article/pii/S002437950100461X)) \n", "\n", "Let \n", "- $R(x_{i})\\in [\\lambda_j,\\lambda_{j+1}]$\n", "- $R(x_{i+1})\\in [R(x_{i}),\\lambda_{j+1}]$ (case $R(x_{i+1})\\in [\\lambda_{j}, R(x_{i})]$ is similar)\n", "- $\\|I - B^{-1} A\\|_A \\leq \\gamma < 1$\n", "\n", "then\n", "\n", "$$\n", "\\left|\\frac{R(x_{i+1}) - \\lambda_j}{R(x_{i+1}) - \\lambda_{j+1}}\\right| < \\left[ 1 - (1-\\gamma)\\left(1 - \\frac{\\lambda_j}{\\lambda_{j+1}}\\right) \\right]^2 \\cdot \\left|\\frac{R(x_{i}) - \\lambda_j}{R(x_{i}) - \\lambda_{j+1}}\\right|\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Block case\n", "\n", "To find, e.g. $k$ eigenvalues one can do a one step of PINVIT for each vector:\n", "\n", "\n", "$$\n", " x^{(j)}_{i+1} = x^{(j)}_{i} - \\tau^{(j)}_i B^{-1} (Ax^{(j)}_i - R(x^{(j)}_i) x^{(j)}_i), \\quad j=1,\\dots,k\n", "$$\n", "\n", "$$\n", " x^{(j)}_{i+1} = \\frac{x^{(j)}_{i+1}}{\\|x^{(j)}_{i+1}\\|}.\n", "$$\n", "\n", "And then orthogonalize them using the QR-decomposition. However, it is better to use the Rayleigh-Ritz procedure:\n", "\n", "- Set $X^{i}_k = [x^{(1)}_{i},\\dots, x^{(k)}_{i}]$ and $R^{i}_k = [B^{-1}r^{(1)}_{i},\\dots, B^{-1}r^{(k)}_{i}]$, where $r^{(j)}_{i} = Ax^{(j)}_i - R(x^{(j)}_i) x^{(j)}_i$\n", "\n", "\n", "- Set $V = [X^{i}_k, R^{i}_k]$, use Rayleigh-Ritz procedure for $V$ to find new $X^{i+1}_k$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## LOBPCG (Locally Optimal Block Preconditioned CG)\n", "\n", "### Locally optimal PCG (not \"Block\" so far :))\n", "LOPCG method\n", "\n", "$$\n", " x_{i+1} = x_{i} - \\alpha_i B^{-1} (Ax_i - R(x_i) x_i) + \\beta_i x_{i-1} ,\n", "$$\n", "\n", "$$\n", " x_{i+1} = \\frac{x_{i+1}}{\\|x_{i+1}\\|}.\n", "$$\n", "\n", "\n", "is a superior to PINVIT method as it adds to basis not only $x_i$ and $r_i$, but also $x_{i-1}$.\n", "\n", "However, this interpretation leads to an unstable algorithm as $x_{i}$ is becoming colinear to $x_{i-1}$ as the procedure converges." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### LOPCG (stable version)\n", "\n", "Knyazev suggested an equivalent stable version, which introduces new vectors $p_i$ (conjugate gradients)\n", "\n", "$$\n", "p_{i+1} = r_{i} + \\beta_i p_{i},\n", "$$\n", "\n", "$$\n", "x_{i+1} = x_{i} + \\alpha_i p_{i+1}.\n", "$$\n", "\n", "One can check that $\\mathcal{L}(x_{i},x_{i-1},r_{i})=\\mathcal{L}(x_{i},p_{i},r_{i})$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The stable version explains name of the method:\n", "\n", "In standard CG method we would minimze Rayleigh quotient $R$ in the conjugate gradient direction $p_{i+1}$: \n", "\n", "$$\\alpha_i = \\arg\\min_{\\alpha_i} R(x_i + \\alpha_i p_{i+1}).$$\n", "\n", "In the locally-optimal CG we minimize over two parameters: \n", "\n", "$$\\alpha_i, \\beta_i = \\arg\\min_{\\alpha_i,\\beta_i} R\\left(x_i + \\alpha_i p_{i+1}\\right) = \\arg\\min_{\\alpha_i,\\beta_i} R\\left(x_i + \\alpha_i (r_{i} + \\beta_i p_{i})\\right)$$\n", "\n", "and we locally obtain more optimal solution. That is why the method is called **locally optimal**.\n", "\n", "As for PINVIT coefficients $\\alpha_i,\\beta_i$ can be found by the Rayleigh-Ritz procedure." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Locally optimal block PCG\n", "\n", "In the block version similarly to PINVIT on each iteration we are given basis $V=[X^{(i)}_k,B^{-1}R^{(i)}_k, P^{(i)}_k]$ and use Rayleigh-Ritz procedure.\n", "\n", "The overall algorithm:\n", "\n", "1. Find $\\tilde A = V^* A V$\n", "2. Find $\\tilde M = V^*V$\n", "3. Solve generalized eigenvalue problem $\\tilde A S_k = \\tilde M S_k \\Theta_k$\n", "4. $P^{(i+1)}_{k} = [B^{-1}R^{(i)}_k, P^{(i)}_k]S_k[:,k:]$\n", "5. $X^{(i+1)}_{k} = X^{(i)}_k S_k[:,:k] + P^{(i+1)}_{k}$ (equivalent to $X^{(i+1)}_{k} = VS_k$)\n", "6. Calculate new $B^{-1}R^{(i+1)}_k$\n", "7. Set $V=[X^{(i+1)}_k,B^{-1}R^{(i+1)}_k, P^{(i+1)}_k]$, goto 1.\n", "\n", "**Deflation technique** which stops iterating converged eigestates can also be applied here.\n", "\n", "The method also converges linearly, but faster than PINVIT." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### LOBPCG summary\n", "\n", "- Locally optimal preconditioned solver\n", "\n", "- Linear convergence\n", "\n", "- Preconditioner $(A-\\sigma I)$ is not always good for eigenvalue problems\n", "\n", "The next method (Jacobi-Davidson) has smart preconditioning and superlinear convergence (if systems are solved accurately)!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Jacobi-Davidson (JD) method\n", "\n", "Jacobi-Davidson method is a very popular technique for solving eigvalue problems (not only symmetric!).\n", "\n", "It consits of two **key ingredients**:\n", "\n", "- Given a preconditioner for $A-R(x_j) I$ it automatically constructs a good preconditioner for the eigevalue problem:\n", "$$\n", " B = (I - x_j x^*_j) (A - R(x_j) I) (I - x_j x^*_j),\n", "$$\n", "where $x_j$ - is approximation to the eigenvector on the $j$-th iteration.
**Note** that sometimes approximation to $(A-R(x_j) I)^{-1}$ is not a good preconditioner.\n", "\n", "\n", "- It additionally adds to a subspace $V$ solutions from previous iterations (**subspace acceleration**)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### JD derivation\n", "\n", "- Jacobi-Davidson method has a nice manifold optimization interpretation. \n", "- It is a **Riemannian Newton** method on a sphere and $P = I - x_j x^*_j$ is a projection on a tanget space of a sphere at $x_j$.\n", "\n", "But we will derive it similarly to the original paper." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Jacobi correction equation\n", "\n", "Jacobi not only presents the way to solve the eigenvalue problem by Jacobi rotations, but also proposed an iterative procedure. Let $x_j$ be the current approximation, and $t$ the correction:\n", "\n", "$$A(x_j + t) = \\lambda (x_j + t),$$\n", "\n", "and we look for the correction $t \\perp x_j$ (new orthogonal vector).\n", "\n", "Then, the parallel part has the form\n", "\n", "$$x_j x^*_j A (x_j + t) = \\lambda x_j,$$\n", "\n", "which simplifies to \n", "\n", "$$R(x_j) + x^* _j A t = \\lambda.$$\n", "\n", "The orthogonal component is \n", "\n", "$$( I - x_j x^*_j) A (x_j + t) = (I - x_j x^*_j) \\lambda (x_j + t),$$\n", "\n", "which is equivalent to \n", "\n", "$$\n", " (I - x_j x^*_j) (A - \\lambda I) t = (I - x_j x^*_j) (- A x_j + \\lambda x_j) = - (I - x_j x^*_j) A x_j = - (A - R(x_j) I) x_j = -r_j.\n", "$$\n", "\n", "$r_j$ is the residual.\n", "\n", "Since $(I - x_j x^*_j) t = t$, we can rewrite this equation in the symmetric form" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "$$ (I - x_j x^*_j) (A - \\lambda I) (I - x_j x^*_j) t = -r_j.$$\n", "\n", "Now we replace $\\lambda$ by $R(x_j)$, and get the **Jacobi correction equation**:\n", "\n", "$$\n", " (I - x_j x^*_j) (A - R(x_j) I) (I - x_j x^*_j) t = -r_j.\n", "$$\n", "\n", "Since $r_j \\perp x_j$ this equation is consistent, if $(A - R(x_j) I)$ is non-singular." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Solving Jacobi correction equation\n", "\n", "Typically Jacobi equation is solved inexactly by the appropriate Krylov method.\n", "\n", "Even inexact solution of Jacobi equation ensures (why?) that the correction $t$ is orthogonal to $x_j$, which is good for computations." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Connection to the Rayleigh quotient iteration\n", "\n", "If this equation is solved exactly, we will get Rayleigh quotient iteration! Let us show that.\n", "\n", "$$ (I - x_j x^*_j) (A - R(x_j) I) (I - x_j x^*_j) t = -r_j.$$\n", "\n", "$$ (I - x_j x^*_j) (A - R(x_j) I) t = -r_j.$$\n", "\n", "$$ (A - R(x_j) I) t - \\alpha x_j = -r_j, \\quad \\alpha = x^*_j (A - R(x_j) I) x_j$$\n", "\n", "$$ t = \\alpha (A - R(x_j) I)^{-1}x_j - (A - R(x_j) I)^{-1}r_j,$$\n", "\n", "Thus, since $(A - R(x_j) I)^{-1}r_j = (A - R(x_j) I)^{-1}(A - R(x_j) I)x_j = x_j$ we get\n", "\n", "$$x_{j+1} = x_j + t = \\alpha (A - R(x_j) I)^{-1}x_j,$$\n", "\n", "which is Rayleigh quotient iteration up to normalization." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Preconditioning of Jacobi equation\n", "\n", "A popular preconditioner for solving Jacobi equation by Krylov method has the form\n", "\n", "$$\n", "\\widetilde K = (I - x_j x^*_j) K (I - x_j x^*_j)\n", "$$\n", "\n", "where $K$ is easily-inverted approximation of $(A - R(x_j) I)$.\n", "\n", "We need to derive how to solve a system with $\\widetilde K$ in terms of solving a system with $K$.\n", "\n", "We already showed that equation\n", "\n", "$$ (I - x_j x^*_j) K (I - x_j x^*_j) \\tilde t = f $$\n", "\n", "is equavelnt to \n", "\n", "$$ \\tilde t = \\alpha K^{-1}x_j + K^{-1}f $$\n", "\n", "The trick now is to forget about the value of $\\alpha$ and find it from $\\tilde t\\perp x_j$ to maintain orthogonality:\n", "\n", "$$\n", " \\alpha = \\frac{x_j^*K^{-1}f}{x_j^* K^{-1}x_j}\n", "$$\n", "Thus for each iteration of the Jacobi equation we calculate $K^{-1}x_j$ and then update only $K^{-1}f$ on each internal Krylov iteration" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Subspace acceleration in JD\n", "\n", "On each iteration of the method we expand a basis with new $t$.\n", "\n", "Namely, $V_j = [v_1,\\dots,v_{j-1},v_j]$, where $v_j$ is vector $t$ orthogonalized to $V_{j-1}$.\n", "\n", "Then standard Rayleigh-Ritz procedure is used.\n", "\n", "**Historal fact:** Initially subspace acceleration was used in the **Davidson method**.
\n", "\n", "However, instead of the Jacobi equation, equation $(\\mathrm{diag}(A) - R(x_j)I)t = -r_j$ was used.
\n", "Davidson method was very popular in quantum chemistry computations." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### The block case of JD\n", "\n", "If we want many eigenvectors, we just compute **partial Schur decomposition:**\n", "\n", "$$A Q_k = Q_k T_k, $$\n", "\n", "and then want to update $Q_k$ by one vector added to $Q_k$. We just use instead of $A$ the matrix $(I - Q_k Q^*_k) A (I - Q_k Q^*_k)$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Jacobi-Davidson: summary\n", "\n", "The correction equation can be solved only roughly, and JD method is often the fastest." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Software\n", "\n", "- The [ARPack](http://www.caam.rice.edu/software/ARPACK/) is the most widely used (it powers scipy sparse eigensolver). Includes versions of Lanczos and Arnoldi algorithms.\n", "- The [PRIMME](https://github.com/primme/primme) is the best from my experience (it employs dynamic switching between different methods including LOBPCG and JD)\n", "- [PROPACK](http://sun.stanford.edu/~rmunk/PROPACK/) works well for the SVD." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Take-home message\n", "\n", "- Arnoldi and Lanczos methods. Shift-and-invert strategy is very expensive since inversion must be done very accurately.\n", "- Preconditioned iterative methods (PINVIT, LOBPCG, JD). Good for inexact inversions. \n", "- There is a software for using them\n", "- There is a lot of technical issues hidden (restarts, spurious eigenvalues, stability)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Next lecture\n", "\n", "\n", "- Fast Fourier transform\n", "\n", "- Structured matrices (Toeplitz, Circulants)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"./styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ] } ], "metadata": { "anaconda-cloud": {}, "celltoolbar": "Slideshow", "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.6.6" }, "nav_menu": {}, "toc": { "navigate_menu": true, "number_sections": false, "sideBar": true, "threshold": 6, "toc_cell": true, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }