Skip to content

Instantly share code, notes, and snippets.

@dhammack
Last active August 29, 2015 13:55
Show Gist options
  • Save dhammack/8757444 to your computer and use it in GitHub Desktop.
Save dhammack/8757444 to your computer and use it in GitHub Desktop.
Selected topics from Numerical Analysis with code and explanations in some cases.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"celltoolbar": "Raw Cell Format",
"name": "",
"signature": "sha256:3d4cbd8c73ca9add4ce44b3add7dc48e91b1b1edf09920a98eec3c7956fae456"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Numerical Analysis #\n",
"\n",
"This is an IPython Notebook where I have implemented most of the algorithms we covered in the course. Most are also explained, with some motivation and sometimes derivations.\n",
"\n",
"##Topics##\n",
"\n",
"Things in **bold** are not in the text/course, but I thought they were interesting so I included them.\n",
"\n",
"### Taylor series approximation ###\n",
"* Taylor series approximation\n",
"\n",
"### Root finding ###\n",
"* Bisection method\n",
"* Fixed point iteration\n",
"* Newton's method\n",
"* Secant method\n",
"* Method of false position\n",
" \n",
"### Function interpolation ###\n",
"* Lagrange polynomial\n",
"* Neville's method\n",
"* Divided differences\n",
"* **Radial basis function interpolation**\n",
"* **Nearest neighbor interpolation**\n",
"\n",
"### Solving Linear Systems ###\n",
"* Gaussian Elimination\n",
"* Partial pivoting\n",
"* Scaled partial pivoting\n",
"* Jacobi method\n",
"* Gauss-Sidel method\n",
"* LU decomposition\n",
"* LDL decomposition\n",
"* Cholesky decomposition\n",
"* Power method\n",
"* **Newton's method for linear least squares**\n",
" \n",
"### Numerical Calculus ###\n",
"\n",
"* Numerical Differentiation\n",
"* Richardson Extrapolation\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are some explainations and derivations scattered throughout this notebook. Usually I derived something to better understand it, and I skipped derivations for most linear algebra algorithms because it was a pain to LaTeX. \n",
"\n",
"###Derivations & Explainations###\n",
"\n",
"* [Fixed point iteration](#Fixed-Point-Method)\n",
"* [Newton's method](#Newton's-Method)\n",
"* [Secant Method](#The-Secant-Method)\n",
"* [Method of False Position](#The-method-of-false-position)\n",
"* [Lagrange interpolating polynomial](#Lagrange-interpolating-polynomial)\n",
"* [Cubic spline interpolation](#Cubic-spline-interpolation)\n",
"* [Solving a linear system with Newton's method](#Solving-a-linear-system-with-Newton's-method)\n",
"* [Richardson Extrapolation](#Richardson-extrapolation)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Polynomial (Taylor series) approximation ##\n",
"Let $f(x) = sin(x)$. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline\n",
"f = lambda x: sin(x)\n",
"xvals = arange(-5, 5, 0.05)\n",
"plot(xvals, f(xvals))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"[<matplotlib.lines.Line2D at 0x9e81ef0>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEACAYAAAC9Gb03AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcVXXeB/DPRVDDyi0VFfKmoGAqkQsuobggikpO+bik\njqXjOM04TtM8Mz7O9Eza5FbZPBVTo5M5LUZqZmIRkct1SXGD0kINVBJQcUFNM9k8zx/fcFIBL/ee\ne3/nnPt5v168Cjt4PiT36+9+z2+xaZqmgYiILMtPdQAiIvIsFnoiIotjoScisjgWeiIii2OhJyKy\nOBZ6IiKLc7vQT548GS1atEDnzp2rvWbGjBkICwtDZGQksrKy3L0lERHVgtuF/rHHHkNaWlq1/z01\nNRW5ubnIycnBkiVL8Pjjj7t7SyIiqgW3C31MTAwaN25c7X9PSUnBpEmTAADR0dE4f/48ioqK3L0t\nERE5yeM9+sLCQoSEhFz7PDg4GAUFBZ6+LRER/cgrD2Nv3GXBZrN547ZERATA39M3aN26NfLz8699\nXlBQgNatW990XWhoKA4fPuzpOEREltKuXTvk5ubWeI3HR/SJiYl46623AAAZGRlo1KgRWrRocdN1\nhw8fhqZpXv1ITtbQtKmGF1/UUFZW/XWffqrBbtcwY0bN19X08fTTT3v9+/PWh5W/N6N+f9nZGsLD\nNUyYoOHkyeqvO3JEw9ChGnr21FBYaJ7vz+p/fnp+ODNAdntEP27cOGzevBlnzpxBSEgI5syZg7Ky\nMgDAtGnTkJCQgNTUVISGhqJBgwZYtmyZu7fUxaJFwMsvAxs2AJGRNV87eDCQmQmMGweMGgW89x5Q\nv753chLdaPduYPhwYN48YMqUmq+95x7g44+BuXOBXr2AjRuBdu28k5OMw+1Cn5ycfMtrkpKS3L2N\nrpKSgFdfBT7/HAgOdu5rGjcGUlKA8eOBsWOB1auBOnU8m5PoRl9+CQwbBixdCowY4dzX2GzAU08B\nzZoBAwYAW7YAbdp4NicZi8+tjK2oAPbskZG8s0W+Ut26wPLlwKVLwBNP1O5rY2Nja/cFJmLl7w0w\nzvdXWCjFPSnJ+SL/U9OmAb/7nXztxYv/+XWjfH+eYvXvzxk2TdMMcfCIzWaDQaLc0oULQHS0jJIm\nTFCdhnxBWRnQrx+QkCA/d67SNOCXvwTOnQNWrZLRPpmbM7WThd5F+/YBAwcC27YBHTqoTkNW9+c/\ny3Oi1FTAz8334SUlMlD5zW+AqVP1yUfqsNB72D/+Ia2crVvZryfPycgAfvYz6c83b67P73ngABAT\nA+zcyYezZudM7fS5Hr2eHn9c+vYvv6w6CVlVSYnMrHnpJf2KPABERAAzZwK/+pW0c8jaOKJ3U06O\nTFvbtw9o1Up1GrKaefNkRL92rf799PJyoEcP4Mkn+azJzNi68ZJZs4CCAuDtt1UnISspLAS6dJF5\n823beuYeO3YA//VfwKFDQIMGnrkHeRYLvZdcugSEhwNr1gDdu6tOQ1YxaRLQurWM6j1p3DggLAx4\n5hnP3oc8g4Xei5YsAVasANav55Q1ct9XX8msrtxc4I47PHuvb78FoqJkVN+smWfvRfrjw1gvmjxZ\n2jfr16tOQlbw1FPysNTTRR6QVbKjRwMvvuj5e5EaHNHraPlyGdlv3qw6CZlZZiaQmCijeW/tqVQ5\nqs/JAZo29c49SR8c0XvZmDHAsWPA9u2qk5CZPfcc8Pvfe3fjvDZtgIcf5qjeqjii19mrrwKffirT\n4Yhq68gRmfJ45Ahw553evffRo0C3bjKqb9LEu/cm13FEr8Bjj8lqw6+/Vp2EzGjRItmLxttFHpAt\njUeOlMVZZC0c0XvAvHkyg+HNN1UnITM5dUr2TTpwAAgKUpPh4EHZPO3bb3nmgllwRK/Ir38NfPSR\n9OuJnJWUJLNfVBV5QNaDREbKzpZkHRzRe8jvfidT4559VnUSMoMrV4CQEHmQHxamNsu6dcDf/gbs\n2qU2BzmHI3qFpk2TU4B+PFWRqEarVwP336++yAOy5/2ZM/KsiayBhd5DOnYE2rfn7BtyzuLF8hDW\nCOrUkb3qX3lFdRLSC1s3HpScDLz+uhxbSFSd7GzZ7uDYMSAgQHUaUVws+9SrfDBMzmHrRrGHHgL2\n75cZOETVWbJEttAwSpEHZB79qFHAG2+oTkJ64Ijew2bOlH2/Fy1SnYSM6Icf5CHsnj2A3a46zfV2\n7AAefVSmXHKjPuPiiN4Apk2T+fRXrqhOQka0apVsbW20Ig8APXtKgc/IUJ2E3MVC72Ft2wKdOwMf\nf6w6CRnR0qXGeQh7I5tNRvTLlqlOQu5i68YLli6VBVRr1qhOQkby7bdA167A8eNy9rARFRbKQKWg\nAAgMVJ2GqsLWjUGMGgVs3AicPas6CRnJu+/KMX5GLfKAnHDVowfw4Yeqk5A7WOi9oGFDYMgQYOVK\n1UnIKDRNzhg2w6Hcjz4K/PvfqlOQO1jovWTiROCdd1SnIKP44guZcdO7t+okt/bgg8DevdK+IXNi\nofeS+HjZ5/vwYdVJyAjeeUdG82aYtnjbbbJ9Md+RmhcLvZcEBMgJVMuXq05CqlVUyKrp8eNVJ3He\nmDHAihWqU5CrWOi9aMIEKfQWnVxETtq0SR5yhoerTuK8AQPkBKqjR1UnIVew0HtRjx5ASYlsi0C+\n6733gHHjVKeoHX9/2dKD7RtzYqH3IptNplq+/77qJKRKWZlMVXz4YdVJam/MGBZ6s2Kh9zIWet+2\nebOslm7TRnWS2uvbVxZQ5eaqTkK1xULvZT16ABcv8vBwX7V6tfxlb0Z16kh2PpQ1HxZ6L/Pz46je\nV1VUAB98YM62TSXOvjEnFnoFWOh907ZtQKtWcqCHWfXpA5w+LWtCyDxY6BXo1UtO8Dl4UHUS8iYz\nt20q+fnJSlkekWkuLPQK+PnJ2/dVq1QnIW+5etUahR6QVbLc5MxcWOgV+dnPOCryJTt3Ao0bAx06\nqE7ivv79ga++AoqKVCchZ7HQK/LAA8CRI9woylekpMhI2Arq1ZPdWNetU52EnMVCr0hAADB0qBxI\nQtaXkgKMGKE6hX7YpzcXFnqFHnxQCgBZ2+HDcuhM9+6qk+gnIUEWf126pDoJOYOFXqH4eGDrVr5Y\nrG7dOmD4cHkIbxUNG8rssU8/VZ2EnGGhHz3zqXyxpKerTkKelJICJCaqTqG/kSN5DrJZsNArlpjI\n9o2VnTsH7NkDDBqkOon+RowA0tJkxS8ZGwu9YiNGAB9/zBeLVaWlAf36AYGBqpPoLzhY9tXPyFCd\nhG7F7UKflpaG8PBwhIWFYeHChTf9d4fDgYYNGyIqKgpRUVF49tln3b2lpbRpIy+W7dtVJyFPsNps\nmxsNGwakpqpOQbfiVqGvqKjA9OnTkZaWhuzsbCQnJ+PAgQM3XdevXz9kZWUhKysLTz31lDu3tKTh\nw/lisaKyMnlYOXy46iSeM2yYvCMlY3Or0O/atQuhoaGw2+0ICAjA2LFjsbaKybUaz86r0dCh8haf\nrCUjA7DbZSMzq+rZE8jP58I/o3Or0BcWFiIkJOTa58HBwSgsLLzuGpvNhu3btyMyMhIJCQnIzs52\n55aWFB0N5OUBJ06oTkJ6SkuTv8StrE4dmSb8ySeqk1BN/N35YpvNdstr7r//fuTn5yMwMBCffPIJ\nRo4ciW+++abKa2fPnn3t32NjYxEbG+tOPNPw95dZGZ9+Cjz6qOo0pJe0NOD//k91Cs8bNkw26Js6\nVXUS3+BwOOBwOGr1NTbNjb5KRkYGZs+ejbQf+w7z58+Hn58fZs6cWe3X3HPPPdi7dy+aNGlyfRCb\nzadbPG+8IfPp33tPdRLSQ1GRbGB2+rRsd2FlZ8/K8YinTsk+OORdztROt1o33bp1Q05ODvLy8lBa\nWooVK1Yg8YaVIUVFRddC7Nq1C5qm3VTkSd7+fvYZUF6uOgnpIT0dGDjQ+kUeAJo2BTp1ki0RyJjc\nat34+/sjKSkJ8fHxqKiowJQpUxAREYHFixcDAKZNm4b3338fr732Gvz9/REYGIj3OGStUuvW8rF7\nt6yWJXNLS5MdHn1FQoLMHBs8WHUSqopbrRs9+XrrBgBmzgTq1wfmzFGdhNxRUQEEBQF79wJ33606\njXfs3QtMnAhwroX3ebx1Q/oaMoSzF6wgMxNo3tx3ijwAREXJ84j8fNVJqCos9AbSpw9w6JC8YMi8\nfK1tA8jOnIMGyXMmMh4WegOpW1eOaeOLxdx8sdAD0p/nTqzGxEJvMGzfmFtxMbB/PxATozqJ98XF\nAevXc4M+I2KhN5ghQ2Th1NWrqpOQK9avB/r2lYfqviY4GGjRAsjKUp2EbsRCbzB2u8xLzsxUnYRc\n4attm0ps3xgTC70BsX1jTprGQs9Cb0ws9AYUHy8tADKX/fuB224DQkNVJ1Gnb1+ZU3/xouok9FMs\n9AYUEyMvlu+/V52EamP9eq4MbdAA6NGD2yEYDQu9ATVoAHTtCmzdqjoJ1cb69bK/ja9j+8Z4WOgN\natAgtm/MpLQU2LZN1kH4OhZ642GhNygWenPZuRNo315mTPm6yEhZT/Dtt6qTUCUWeoPq3l1OneJ2\nCOawYQPbNpX8/GTxFFd4GwcLvUH5+8sMho0bVSchZ6xfL+/CSAweLAv/yBhY6A2M7RtzuHgR+OIL\n2ZSOxMCBwKZNXOFtFCz0BsZCbw5btsiUwsBA1UmMIzhYnlfs3686CQEs9IYWEQGUlABHjqhOQjVh\n26ZqAwaw9WgULPQGZrPJW2CO6o2ND2KrxkJvHCz0Bsf2jbGdPCmnKnXtqjqJ8cTGyqI/HnivHgu9\nwQ0cKKMiPtQypo0bgX79ZJYUXa9ZM6BNG9nOg9RioTe44GB5wXz5peokVJUNG9ifrwnbN8bAQm8C\nbN8Yk6bxQeytsNAbAwu9CfCBrDEdPiz95w4dVCcxrr59gYwMmT1G6rDQm0C/fsCOHbJxFhlH5W6V\nNpvqJMbVsCHQsaMUe1KHhd4EGjcGwsKA3btVJ6Gf2rRJWhNUswED5FkGqcNCbxKxsVJYyBg0DXA4\n5M+FasY+vXos9CbRv78UFjKGAwdkywO7XXUS4+vTR/YCunRJdRLfxUJvEjExsuc5H2oZw6ZNPGTE\nWYGBsqBs2zbVSXwXC71JNGwoe9/s3Kk6CQEs9LXF9o1aLPQmwj69MVy9Kodfsz/vPBZ6tVjoTYR9\nemP4+mt5hxUSojqJeURHA4cOAefOqU7im1joTeSBB4A9e4ArV1Qn8W2bNnE0X1t16wK9e8s7IfI+\nFnoTueMOoFMnWTxF6jgc7M+7onKDPvI+FnqTYZ9eLfbnXcc+vTos9CbDPr1a+/bJEXmtW6tOYj5R\nUUBhIVBUpDqJ72GhN5k+fYDMTODyZdVJfBPbNq6rU0c2OeM7Uu9joTeZBg2AyEhg+3bVSXwT58+7\np39/FnoVWOhNiO0bNSoqgC1bZDdRcg0LvRos9CbEF4saX34JBAUBLVuqTmJenTsDZ89Kr568h4Xe\nhHr1kqLDTaK8i20b9/n5yTsiviP1LhZ6EwoMBO6/H/j8c9VJfAsXSumD70i9j4XepNin967yctl9\nkYXefSz03sdCb1J8sXhXVhYQHAw0b646ifndey9w8SJw7JjqJL6Dhd6kevYEvvpKXjDkeWzb6Mdm\nY5/e21joTap+faB7d2DrVtVJfAMXSumL70i9i4XexNin946yMnnwzfnz+mGh9y4WehPji8U79u4F\n2rQB7rpLdRLrCA+X7bbz8lQn8Q1uF/q0tDSEh4cjLCwMCxcurPKaGTNmICwsDJGRkcjKynL3lvSj\nHj2AgweBCxdUJ7E2tm30Z7NxJ1ZvcqvQV1RUYPr06UhLS0N2djaSk5Nx4MCB665JTU1Fbm4ucnJy\nsGTJEjz++ONuBab/qFdPTu7ZskV1EmvjQinP4DtS73Gr0O/atQuhoaGw2+0ICAjA2LFjsXbt2uuu\nSUlJwaRJkwAA0dHROH/+PIq4T6lu2Kf3rNJS2UCub1/VSaynstBrmuok1udWoS8sLETITw7ODA4O\nRuENm1hUdU1BQYE7t6Wf4KjIs/bsAUJDgSZNVCexnrAwOcjl8GHVSazP350vttlsTl2n3fBXdnVf\nN3v27Gv/Hhsbi1hOXL6l7t2B3FyguJjFyBM4f95zKvv0Dof8ZUrOcTgccNTybbxbhb5169bIz8+/\n9nl+fj6Cg4NrvKagoACtqzme56eFnpwTECCbnG3ZAowcqTqN9WzaBMyYoTqFdVW+I/3FL1QnMY8b\nB8Fz5sy55de41brp1q0bcnJykJeXh9LSUqxYsQKJiYnXXZOYmIi33noLAJCRkYFGjRqhRYsW7tyW\nbsD2jWeUlAA7d7I/70ns03uHWyN6f39/JCUlIT4+HhUVFZgyZQoiIiKwePFiAMC0adOQkJCA1NRU\nhIaGokGDBli2bJkuwek/+vcHpk5VncJ6du0COnQAGjVSncS62rYF/P2Bb76R/9fkGTbtxga6Ijab\n7aZePjmnvFwOrM7NBZo1U53GOp55BvjuO+CFF1QnsbZJk4DevYFp01QnMSdnaidXxlqAvz/wwAPA\n5s2qk1gLF0p5BxdOeR4LvUWwT6+vK1ekdRMTozqJ9VWuBeEbes9hobcIFnp9ZWQAHTsCd96pOon1\n2e3AbbcBNyyqJx2x0FvEffcBJ04AXHSsD7ZtvIsDFc9iobeIOnVkGiC3Q9AH97fxrsqFU+QZLPQW\nwoda+vjhB9mauE8f1Ul8R2Wf/upV1UmsiYXeQvj2Vx87dgCdOwN33KE6ie8ICQEaNgS+/lp1Emti\nobeQLl2AM2eA48dVJzE3tm3U4EDFc1joLcTPT46744vFPdzITA326T2Hhd5iOCpyz/ffA198wf68\nCv37y6I/9un1x0JvMSz07tm+XaaqNmigOonvadVKzuXdt091EuthobeYe+8FLl4Ejh1TncSc2J9X\niwMVz2Chtxgeuuweh4P9eZXYp/cMFnoLYqF3zaVL0jbo3Vt1Et8VGyuH6FRUqE5iLSz0FsQDw12z\nbRvQtavsu0JqBAUBLVvKA3HSDwu9BYWHy+lIR4+qTmIubNsYA/v0+mOhtyD26V3DB7HGwJ9d/bHQ\nWxRHRbXz3Xey/L5nT9VJKDZW2mjl5aqTWAcLvUXx0OXa2bYN6N4dqF9fdRJq1gy4+24gM1N1Eutg\nobeo0FD5Z26u2hxmwbaNsfAdqb5Y6C3KZuOLpTZY6I2FfXp9sdBbGAu9c86fBw4dAnr0UJ2EKvXr\nJ9tRlJWpTmINLPQWVjkqYp++Zlu3AtHRQL16qpNQpaZNgbZtgT17VCexBhZ6C7vnHileBw+qTmJs\nGzYAAweqTkE34jtS/bDQWxj79M5hoTcm/uzqh4Xe4rgdQs1OngQKCmTrAzKWmBggIwMoLVWdxPxY\n6C2ustCzT1+1DRvkWUadOqqT0I0aNwbatwd27VKdxPxY6C3u7ruBO+8E9u9XncSYNmwABg1SnYKq\nw/aNPljofcCgQcD69apTGI+myf8XFnrjYqHXBwu9D4iLY6GvSm6unE/avr3qJFSdmBhg927ghx9U\nJzE3Fnof0L+/7OVSUqI6ibFUjuZtNtVJqDp33glERspaB3IdC70PaNJE9qjfsUN1EmNZv57TKs0g\nLg747DPVKcyNhd5HsE9/vYoK6f2y0BsfC737WOh9BF8s18vKkiPrWrVSnYRupUcPIC8PKCpSncS8\nWOh9RO/eQHY2cO6c6iTGwNWw5uHvL2sdNmxQncS8WOh9RL16QJ8+nKpWidMqzYXvSN3DQu9DOM1S\nXLkiS+v79VOdhJwVFwekp3OFt6tY6H0IR0Vi+3agUyegYUPVSchZYWHSwjlwQHUSc2Kh9yGdOskh\n2Hl5qpOo9dln7M+bjc3GgYo7WOh9iJ8fp1kCwKefAkOGqE5BtcVC7zoWeh8zaJBvv1hOngSOHgV6\n9lSdhGpr4EBZIctti2uPhd7HxMXJNLWrV1UnUSM9XQqGv7/qJFRbd90lvfqMDNVJzIeF3scEBwPN\nmgFffKE6iRppaWzbmBnbN65hofdB8fFS8HxNRYWM6OPjVSchV7HQu4aF3gclJACpqapTeN/evUBQ\nEBASojoJuapPH1nhXVysOom5sND7oL59gX37fG87BLZtzK9ePdmjnqP62mGh90H168uq0PR01Um8\ni4XeGhISgE8+UZ3CXFwu9MXFxYiLi0P79u0xePBgnD9/vsrr7HY7unTpgqioKPTo0cPloKQvX2vf\nFBcDX30FPPCA6iTkrqFD5S9tX5055gqXC/2CBQsQFxeHb775BgMHDsSCBQuqvM5ms8HhcCArKwu7\neJy7Yfjai2X9emlZ1a+vOgm5q21b2b7CV2eOucLlQp+SkoJJkyYBACZNmoQPP/yw2ms17kRkOHY7\n0LQpkJmpOol3sG1jLb72jtRdLhf6oqIitGjRAgDQokULFFVzKoDNZsOgQYPQrVs3/Otf/3L1duQB\nvvJi0TQWeqsZOpR9+tqocX1gXFwcTp48edOvz50797rPbTYbbNWcsPz555+jZcuWOH36NOLi4hAe\nHo6YmJgqr509e/a1f4+NjUVsbOwt4pM7hg4F/vIX4K9/VZ3Es/bvBwIDgdBQ1UlIL337yp9rcbGc\niexLHA4HHA5Hrb7GprnYVwkPD4fD4UBQUBBOnDiB/v374+DBgzV+zZw5c3D77bfjD3/4w81BbDa2\neLyspARo3hw4fFiWl1vVc88Bx44BSUmqk5CeRowAJkwAxoxRnUQtZ2qny62bxMREvPnmmwCAN998\nEyNHjrzpmsuXL+PixYsAgO+//x7p6eno3Lmzq7ckndWrBwwYILs5WllqKts2VjR0qG+0HvXg8oi+\nuLgYo0ePxrFjx2C327Fy5Uo0atQIx48fx9SpU/Hxxx/jyJEjeOihhwAA5eXlGD9+PGbNmlV1EI7o\nlViyBNi8GVi+XHUSzzh3DmjTRnatDAxUnYb0lJcHREcDx48DdeqoTqOOM7XT5UKvNxZ6NfLzgago\noKjImi+Wd98F3nsPSElRnYQ8oUsXYPFioFcv1UnU8WjrhqwhJARo1QrYvVt1Es9ISQESE1WnIE9J\nTORf4s5goSckJAAffaQ6hf5KS+X5w7BhqpOQp7DQO4eFnvDgg8DatapT6G/rVqB9e6BlS9VJyFO6\ndZMplrm5qpMYGws9IToaOHPGei+WdetkCh5Zl5+f/BmvW6c6ibGx0BP8/OQtsJVG9ZrG/ryvYPvm\n1ljoCYC0b2rYrsh0srPlRCku27C+gQNlzyYeRlI9FnoCIAun9u8HTp1SnUQfKSnylr6anTnIQm67\nDejfn4unasJCTwBk+97Bg60z+2b1auDHtXrkAxITrfWOVG8s9HTNyJHWeLEcPSp72/TtqzoJeUti\nohwv+P33qpMYEws9XZOQADgcwKVLqpO454MP5C8t/xr3ZiUruesumT2WlqY6iTGx0NM1jRoBPXua\nf5/v998HHn5YdQrytlGjgFWrVKcwJu51Q9d5/XVZTWrWF0xBARAZKZuYBQSoTkPedOqULJA7cUIe\n0PoK7nVDtfbQQ0B6unnbNx98IP1aFnnf07w50LWr9bfddgULPV2nSROgTx/zrjR8/315C0++adQo\n+Rmg67F1Qzd5801gzRrzzcA5eRKIiJB/1qunOg2pUPkzcOKETBn2BWzdkEsefBDYuBG4cEF1ktpZ\ntQoYPpxF3pcFBcke9enpqpMYCws93aRRIyA21nx73yxfDowfrzoFqTZ2LJCcrDqFsbDQU5XGjAFW\nrFCdwnk5OXK03KBBqpOQaqNHyxTh775TncQ4WOipSomJwLZtwNmzqpM4Z/lyGclxkRQ1bSrvSFev\nVp3EOFjoqUp33CEnM5nhLbCmAe+8A0yYoDoJGcXEicDbb6tOYRws9FStRx8F/v1v1SlubedOGcl3\n7ao6CRnFsGHAl18C+fmqkxgDCz1Va+BAma62f7/qJDWrHM1zS2KqVL++bIPx7ruqkxgDCz1Vq04d\n4Oc/l3n1RlVWBqxcCTzyiOokZDSV7Rsuz2Ghp1uYNElGzGVlqpNUbe1aWSDTtq3qJGQ0ffrItsWZ\nmaqTqMdCTzXq0EGKqFH3D1m8GJg2TXUKMiI/P2DKFGDJEtVJ1OMWCHRLS5ZIoTfadLXcXKBXL3ng\n5ivL3al2TpwAOnYEvv0WuPNO1Wk8g1sgkC7GjAE2bQKOH1ed5Hqvvy7PEFjkqTotW8qkguXLVSdR\ni4WebqlhQ2DcOOCf/1Sd5D9KS2Xq5y9/qToJGd2vfgW89ppvP5RloSen/OY30sIpKVGdRHz4oTyE\n7dBBdRIyugEDgCtXgIwM1UnUYaEnp3TsCHTqZJy9vvkQlpzl5yc/K0Z6R+ptfBhLTlu7Fpg/X/3I\n6IsvZOXjkSPckpicc/YsEBoKHDokJ1FZCR/Gkq6GDweKioDdu9XmeO454IknWOTJeU2byqZ3L7+s\nOokaHNFTrTz/PJCVpW5p+dGjQLdu8k+rTpcjzzh8GIiOlneCVvrZ4YiedDdtGvDZZ8A336i5/4sv\nAlOnWuuFSt7Rrh0QF+ebC6g4oqda+9vfZLGSt/fAOX0aaN8eyM6W+dFEtWXF5zsc0ZNHzJgBpKZK\nsfempCRg1CgWeXLdfffJmbK+tlc9R/Tkkjlz5Oi+Zcu8c7/iYhnN79gBhIV5555kTVu2AI89Bhw4\nANStqzqN+5ypnSz05JLz52W62s6d0vv0tP/5H+DcOZk/T+Su+Hhg5Ejg8cdVJ3EfCz151Jw5Mi/Z\n0zNwCgqAyEg5MSg42LP3It+QmSnThXNygAYNVKdxDws9edT338sWBCtXAr17e+4+EyYAdjvw7LOe\nuwf5nvHjgXvuMf/PFQs9edzbb8silIwMOZFKb9u3y+6ZBw+af+RFxlJYKO8UvdV+9BTOuiGPGz8e\nCAwE/vEP/X/vkhLZnfKFF1jkSX+tWwN//CPw619bf2dLjujJbYcOybFte/ZIi0Uvs2fLKtwPP+TB\n3+QZZWWyWnb6dGDyZNVpXMPWDXnNCy9IQXY4AH9/93+/HTtkVkRmpoy8iDxl3z45nGTnTnOePczW\nDXnNk09vK2NUAAAG8ElEQVRKC2f2bPd/r3PngEcekamULPLkaV26AE89BYwebZzzFvTGET3ppqgI\n6NFDdpccM8a136O0FBg6VB6SvfiivvmIqqNpUugDA+XkMjO1Cj06ol+1ahXuvfde1KlTB5mZmdVe\nl5aWhvDwcISFhWHhwoWu3o5MoEULICVF+p3r19f+6ysqgClT5MHr88/rn4+oOjab7N108CDw5z+7\n9nDWyONUlwt9586dsWbNGvTt27faayoqKjB9+nSkpaUhOzsbycnJOHDggKu3NDWHw6E6gsf89HuL\njARWr5bWS2qq879HSQkwcSJw4gSQnOyZqZqusvKfHcDvr1JgIPDRR/Jz+9//DVy96vw9li6Vg+qN\nyuVCHx4ejvbt29d4za5duxAaGgq73Y6AgACMHTsWa9eudfWWpmblF9ON31vfvnIa1dSpwNy5MrOh\nJnl5QL9+cq7nunXGm0pp5T87gN/fTzVrJhMKdu4ERoyQHVNrcvmybPK3YAHwv//rVkyP8ujD2MLC\nQoSEhFz7PDg4GIWFhZ68JRlEr16yiMrhkINCVq68ueAfOwb85S9A166yK+Xq1cBttymJS3RN48bA\npk1yRnLHjsDChfL86acuX5ZRfOfOwJkz8hfDLca9StU4ES4uLg4nT5686dfnzZuHESNG3PI3t5np\niQbpLiQESE+XaZcvvST9906d5C1yfr68QMaNk7nyd9+tOi3RfwQESIF/9FFg3jzZ6iM4GAgKkg39\nDh6Ud6Gvvw707686rRM0N8XGxmp79+6t8r/t2LFDi4+Pv/b5vHnztAULFlR5bbt27TQA/OAHP/jB\nj1p8tGvX7pZ1WoelLah2ak+3bt2Qk5ODvLw8tGrVCitWrEBycnKV1+Z6+xQLIiIf4XKPfs2aNQgJ\nCUFGRgaGDRuGoUOHAgCOHz+OYcOGAQD8/f2RlJSE+Ph4dOzYEWPGjEFERIQ+yYmIyCmGWTBFRESe\nYagtEF555RVERESgU6dOmDlzpuo4HrFo0SL4+fmhuLhYdRRd/fGPf0RERAQiIyPx0EMP4cKFC6oj\n6cLKC/7y8/PRv39/3HvvvejUqRNefvll1ZF0V1FRgaioKKcmj5jN+fPnMWrUKERERKBjx47IyMio\n/mIXnr96xMaNG7VBgwZppaWlmqZp2qlTpxQn0t+xY8e0+Ph4zW63a2fPnlUdR1fp6elaRUWFpmma\nNnPmTG3mzJmKE7mvvLxca9eunXb06FGttLRUi4yM1LKzs1XH0s2JEye0rKwsTdM07eLFi1r79u0t\n9f1pmqYtWrRIe+SRR7QRI0aojqK7n//859rSpUs1TdO0srIy7fz589Vea5gR/WuvvYZZs2YhICAA\nANCsWTPFifT35JNP4rnnnlMdwyPi4uLg5yc/TtHR0SgoKFCcyH1WX/AXFBSE++67DwBw++23IyIi\nAsePH1ecSj8FBQVITU3FL37xC8vto3XhwgVs3boVk3/cW9nf3x8NGzas9nrDFPqcnBxs2bIFPXv2\nRGxsLPbs2aM6kq7Wrl2L4OBgdOnSRXUUj3vjjTeQkJCgOobbfGnBX15eHrKyshAdHa06im5+//vf\n4/nnn782ALGSo0ePolmzZnjsscdw//33Y+rUqbh8+XK11+syvdJZ1S3Amjt3LsrLy3Hu3DlkZGRg\n9+7dGD16NI4cOeLNeG6r6fubP38+0tPTr/2aGUcYziygmzt3LurWrYtHHnnE2/F05ysL/i5duoRR\no0bhpZdewu233646ji4++ugjNG/eHFFRUZbc4qG8vByZmZlISkpC9+7d8cQTT2DBggV45plnqv4C\n73STbm3IkCGaw+G49nm7du20M2fOKEykn/3792vNmzfX7Ha7ZrfbNX9/f61NmzZaUVGR6mi6WrZs\nmda7d2/thx9+UB1FF7VZ8GdWpaWl2uDBg7W///3vqqPoatasWVpwcLBmt9u1oKAgLTAwUJs4caLq\nWLo5ceKEZrfbr32+detWbdiwYdVeb5hC/89//lP761//qmmaph06dEgLCQlRnMhzrPgw9pNPPtE6\nduyonT59WnUU3ZSVlWlt27bVjh49qpWUlFjuYezVq1e1iRMnak888YTqKB7lcDi04cOHq46hu5iY\nGO3QoUOapmna008/rf3pT3+q9lqvtm5qMnnyZEyePBmdO3dG3bp18dZbb6mO5DFWbAn89re/RWlp\nKeLi4gAAvXr1wquvvqo4lXt+uuCvoqICU6ZMsdSCv88//xzvvPMOunTpgqioKADA/PnzMWTIEMXJ\n9GfF19wrr7yC8ePHo7S0FO3atcOyZcuqvZYLpoiILM56j6OJiOg6LPRERBbHQk9EZHEs9EREFsdC\nT0RkcSz0REQWx0JPRGRxLPRERBb3/1to2JucjIwxAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x9e58ba8>"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's approximate $f$ with a linear function at 0. Using a Taylor series, we know this approximation is given by $f \\approx f(x) + f'(x)x$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_d1 = lambda x: cos(x)\n",
"f_approx_linear = lambda x: f(0) + f_d1(0)*x\n",
"plot(xvals, f(xvals))\n",
"plot(xvals, f_approx_linear(xvals))\n",
"plot(0.0, f(0.0), 'b.', markersize=10)\n",
"legend(['function', 'approx'])\n",
"ylim([-2,2])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nSNz/A7YRsQoHEfVyAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x9e68f98>"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's generalize this to approximations at any point."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_approx_linear = lambda x_0, x: f(x_0) + f_d1(x_0)*(x-x_0)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can approximate $f$ at several points."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(xvals, f(xvals))\n",
"plot(xvals, f_approx_linear(-2, xvals))\n",
"plot(xvals, f_approx_linear(1, xvals))\n",
"plot(-2, f(-2), 'b.', markersize=10)\n",
"plot(1, f(1), 'b.', markersize=10)\n",
"legend(['f','approx at -2', 'approx at 1'])\n",
"ylim([-2,2])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAz3EgCybAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0xa0449b0>"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since generalization is fun, let's make this work for an arbitrary degree polynomial approximation, $P_n$."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def factorial(n):\n",
" return 1 if n==0 else n*factorial(n-1)\n",
"\n",
"def P_n(derivatives, x_0, x):\n",
" #finite taylor series, baby\n",
" return sum( f_i(x_0)*((x-x_0)**n)/factorial(n) for n,f_i in enumerate(derivatives))\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That should do it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"derivatives = [lambda x: sin(x), lambda x: cos(x), lambda x: -sin(x), lambda x: -cos(x)]\n",
"plot(xvals, f(xvals))\n",
"plot(xvals, P_n(derivatives, x_0=0.0, x=xvals))\n",
"plot(0.0, f(0.0), 'b.', markersize=10)\n",
"ylim([-2,2])\n",
"legend(['function', 'degree 3 approx at 0.5'])\n",
"show()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nV8yaNQsvX76UPHJzczFw4MAKj323o9Q7/5294+rqiri4uDLny8/Ph5OTE1xdXTF06NAyr+Xk5GDq\n1KlSvZeioqIy+86+b+bMmdDX18c///yDV69e4fvvvy930fT92J88eQInJyfJ83dxvv8zev/199+n\nk5MTkpOTy9S7Hz9+LNkaMTU1FfPmzUN0dDQ+++wzFBYWVhjz2bNnsWzZMuzduxfZ2dl4+fIlLC0t\nJeetbmaUj48PiouLy2zveP36dQQGBlZ53PuYEmr2lOi1FCV69dWqVSsYGBhg1apVKCoqwv79+3Hx\n4kXJ65988gm+++47JCQkgDGGvLw8HDlyBLm5uWjVqhX09fWxZs0aFBcX48CBA2WOrcioUaMwc+ZM\nSVLNzMyUrCY7ZMgQHDp0CMePH0dJSQnevn0LsVhc7j+Td8f99NNPyMvLQ0lJCX7//Xfs3bsXvXr1\nqrDf3NxcmJqawsLCAqmpqVi2bFmZ1xljWLduHVJTU5GVlYWFCxciIiKiTJs5c+agqKgIZ8+exZEj\nR9C/f3/Jse9r0aIFTExMsHTpUhQVFUEsFuPw4cOIiIgAYwxRUVEYMWIENm/eDEdHR8nF6//KycmB\ngYEBbG1tUVhYiHnz5pUZodetWxdJSUmVJmNTU1P06dMHs2fPRn5+Ps6dO4dDhw5VOiXz2LFjyMjI\nAAD8+++/WLBgAXr37l1hW7lUW9xRETUKRSsc/Pcg67qrZrVIbaLun6dLly6x4OBgZm5uzgYOHMgi\nIiLK1OXj4uJY06ZNmZWVFXN0dGQDBgxgOTk5kmODgoKYmZkZ69+/P+vTp4+kdv3nn38yoVBYpq/S\n0lL2zTffsPr16zNzc3Pm6enJZs2aJXn977//Zm3btmU2NjbMzs6O9ejRgz15Uv76TmZmJmvbti2z\nsrJilpaWrGnTpuzAgQOVvsdbt26xkJAQZmZmxoKDg9ny5cvLxObu7s4WL17M/P39mZWVFYuKimJv\n3ryRvA8XFxe2cOFCZmtry9zc3NiuXbskx0ZFRZW7jnHr1i3Wtm1bZmlpyQICAthvv/3GGGNs5cqV\nLCgoiBUVFTHGuGsUdnZ27Ny5c+ViLikpYdHR0czCwoI5OjqypUuXMg8PD8k1jhcvXrAPPviAWVtb\ns5CQkArfd1ZWFuvduzczNTVlbm5ubPfu3ZLXHj9+zMzMzFhycjJjjLHPP/+cOTg4MFNTU1avXj02\n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\n",
"text": [
"<matplotlib.figure.Figure at 0xa02c978>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that the linear approximation is a special case of the taylor series,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"derivatives = [lambda x: sin(x), lambda x: cos(x)]\n",
"plot(xvals, f(xvals))\n",
"plot(xvals, P_n(derivatives, x_0=0.5, x=xvals))\n",
"plot(0.5, f(0.5), 'b.', markersize=10)\n",
"ylim([-2,2])\n",
"legend(['function', 'linear approx at 0.5'])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x9e6cd68>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see if we can make a better approximation..."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"derivatives = [lambda x: sin(x), lambda x: cos(x), lambda x: -sin(x), lambda x: -cos(x)] * 3\n",
"plot(xvals, f(xvals))\n",
"plot(xvals, P_n(derivatives, x_0=0.5, x=xvals))\n",
"plot(0.5, f(0.5), 'b.', markersize=10)\n",
"ylim([-2,2])\n",
"legend(['function', 'degree 11 approx at 0.5'])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xa02b5c0>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What happens when a function has only a finite number of derivatives? I would expect that the taylor series would *exactly* equal the function."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: 0.1*x**4 - 3*x**3 + 0.1*x**2 - 5*x + 1\n",
"xvals = arange(-3, 3, 0.05)\n",
"plot(xvals, f(xvals))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n5P8B9BKUJUepUJ0AAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0xa02c518>"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"derivatives = [f,\n",
" lambda x: 0.1*4*x**3 - 3*3*x**2 + 0.1*2*x - 5,\n",
" lambda x: 0.1*4*3*x**2 - 3*3*2*x + 0.1*2,\n",
" lambda x: 0.1*4*3*2*x - 3*3*2,\n",
" lambda x: 0.1*4*3*2,\n",
" lambda x: 0]\n",
"\n",
"plot(xvals, f(xvals))\n",
"plot(xvals, P_n(derivatives, x_0=0.1, x=xvals))\n",
"legend(['function', 'approximation'])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x9e649e8>"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Roundoff Error #\n",
"\n",
"Computer arithmetic is approximate."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"0.1 + 0.2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"0.30000000000000004"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"0.1*0.1/0.1"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"0.10000000000000002"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from decimal import Decimal\n",
"Decimal(0.275)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"Decimal('0.27500000000000002220446049250313080847263336181640625')"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This section is pretty boring. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The bisection method #\n",
"\n",
"Aka, binary search over the reals. Let's approximate $\\pi$ using the bisection method. First we need a function which is zero at $\\pi$, and then we can apply a root-finding method.\n",
"\n",
"$f(x) = xsin(x)$ should do."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xvals = arange(-6, 0, 0.01)\n",
"f = lambda x: x*sin(x)\n",
"plot(xvals, f(xvals))\n",
"plot(-pi, f(-pi), 'b.', markersize=10)\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nB5M8YKYrUITjAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0xa028978>"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is zero at $-pi$, so that's fine. Let's do root-finding."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def root_find(f, a, b, tol, verbose=False):\n",
" \"\"\"\n",
" Root finding with the bisection method\n",
" \"\"\"\n",
"\n",
" f_a = f(a)\n",
" f_b = f(b)\n",
" if verbose:\n",
" print 'x_left =', a, 'x_right =', b, 'f(x_left) =', f_a, 'f(x_right) =', f_b, 'x_mid =', (a+b)/2, 'f(x_mid) =', f((a+b)/2)\n",
" if abs(f_a-f_b) < tol:\n",
" return (a+b)/2\n",
" f_mid = f((a+b)/2)\n",
" if f_mid > 0:\n",
" return root_find(f, a, (a+b)/2, tol, verbose=verbose)\n",
" else:\n",
" return root_find(f, (a+b)/2, b, tol, verbose=verbose)\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 266
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"root_find(f, -4.0, -2.0, 1e-14)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 17,
"text": [
"-3.141592653589794"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nice! We can reduce the tolerance,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print root_find(f, -4.0, -2.0, 1e-9)\n",
"print -pi"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"-3.14159265358\n",
"-3.14159265359\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cool. How about a polynomial, like $x^2 - 2$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: x**2 - 2\n",
"xvals = arange(0,2, 0.01)\n",
"plot(xvals, f(xvals))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nr169WL9+PTExMVxyySUsWbKE5ORknxTva3V1UFUFO3eagD/+UVNjplEmJUHv3ibg09LggguC7yKs\ny+XC6XTaXUbY0PfpW/o+fSugu3NmZGQ0Pk9PT+f1119v0qa0tJSEhATi4+MBGD9+PKtXr242+APh\n8GFzUfXLL6GiounP3bvNkExiogn4pCS45hrzMzY2dC6+6j8s39L36Vv6Pu3nk8uLL7/8MhMmTGjy\n+6qqKuLi4hpfx8bGsm3bNq+PZ1lw5Ii5W9Q335idKL/55sTHP/9pNi374VFdDbW10KMH/PSnEB9v\nfjqdx17HxkL79l6XJyIS1E4b/BkZGezdu7fJ72fMmMHo0aMBePzxx2nfvj033nhjk3aOVo6BjBhh\nFi7V1R37WVdneurHP7791gR0p07mZiLNPRISzBbEPXoce3TuHHzDMiIiAWd5Yf78+dYVV1xhffvt\nt82+v3XrVmvkyJGNr2fMmGHNnDmz2bY9e/a0AD300EMPPVrx6NmzZ6uz2+OLu8XFxdx3331s3LiR\nH//4x822qauro1evXvz1r3/lggsu4NJLLz3lxV0REQkMjy9XTps2jYMHD5KRkUFaWhp33HEHALt3\n72bUqFEAREVFMXv2bEaOHEnv3r0ZN26cQl9ExGZBs4BLREQCI6ATFIuLi0lKSiIxMZFZs2Y122b6\n9OkkJiaSmppKWVlZIMsLOWf6Pl0uF126dCEtLY20tDQee+wxG6oMDbfddhvR0dGkpKScso3OzZY7\n0/epc7Pl3G43Q4cOpU+fPvTt25dnn3222XatOj9bfVXAQ3V1dVbPnj2tL774wjp69KiVmppq7dix\n44Q2a9assTIzMy3LsqySkhIrPT09UOWFnJZ8n2+//bY1evRomyoMLe+88461fft2q2/fvs2+r3Oz\ndc70fercbLk9e/ZYZWVllmVZ1oEDB6yLLrrI6+wMWI//+MVc7dq1a1zMdbzCwkJyc3MBsyispqaG\n6urqQJUYUlryfQK2r4YOFYMHD6Zbt26nfF/nZuuc6fsEnZst1aNHD/r37w9Ap06dSE5OZvfu3Se0\nae35GbDgb24xV1VV1RnbVFZWBqrEkNKS79PhcLBlyxZSU1PJyspix44dgS4zbOjc9C2dm56pqKig\nrKyM9PT0E37f2vMzYBsDt3Qx18m9gNYuAosULfleLr74YtxuNx06dGDt2rXk5OSwc+fOAFQXnnRu\n+o7OzdY7ePAgY8eO5ZlnnqFTp05N3m/N+RmwHn9MTAxut7vxtdvtJjY29rRtKisriYmJCVSJIaUl\n3+fZZ5+8yiwWAAABSElEQVRNhw4dAMjMzKS2tpb9+/cHtM5woXPTt3Rutk5tbS1jxoxh4sSJ5OTk\nNHm/tednwIJ/4MCBlJeXU1FRwdGjR1m2bBnZ2dkntMnOzmbRokUAlJSU0LVrV6KjowNVYkhpyfdZ\nXV3d2AsoLS3Fsiy6d+9uR7khT+emb+ncbDnLspg0aRK9e/fm7rvvbrZNa8/PgA31HL+Yq76+nkmT\nJpGcnMzcuXMByMvLIysri6KiIhISEujYsSPz588PVHkhpyXf54oVK5gzZw5RUVF06NCBpUuX2lx1\n8JowYQIbN25k3759xMXFUVBQQG1tLaBz0xNn+j51brbc5s2befXVV+nXrx9paWmA2S/tq6++Ajw7\nP7WAS0QkwoTIDvMiIuIrCn4RkQij4BcRiTAKfhGRCKPgFxGJMAp+EZEIo+AXEYkwCn4RkQjz/wGC\nkj1TfoeA1AAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xa059198>"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print root_find(f, 0., 2., 10e-9)\n",
"print sqrt(2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1.41421356145\n",
"1.41421356237\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How about just finding a minimum?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def find_min(f, a, b, tol):\n",
" f_a, f_b = f(a), f(b)\n",
" mid = (a+b)/2\n",
" f_mid = f(mid) \n",
" \n",
" if abs(f_a-f_b) < tol:\n",
" return min( [f_a, f_b, f_mid] )\n",
" \n",
" max_cmp = max( [f_a, f_b, f_mid] )\n",
" if max_cmp == f_b:\n",
" return find_min(f, a, mid, tol)\n",
" elif max_cmp == f_a:\n",
" return find_min(f, mid, b, tol)\n",
" else:\n",
" print 'your function has multiple minima on this interval.'\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"find_min(f, -1., 1., 10e-3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": [
"-2.0"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print find_min(sin, -pi, 0.0, 10e-9)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"-1.0\n"
]
}
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xvals = arange(-pi, 0, 0.01)\n",
"plot(xvals, sin(xvals))\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x3b06438>"
]
}
],
"prompt_number": 24
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Fixed Point Method"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"A *fixed point* of a function $f$ is a point $x$ such that $f(x) = x$. With functions of one real variable, this is an intersection with the line $y=x$, and more generally it is where $f$ intersects the identity function $I(x) = x$.\n",
"\n",
"Fair enough. \n",
"\n",
"How do we know if a fixed point exists?\n",
"\n",
"**Theorem** \n",
"\n",
"If $f \\in C[a, b]$ and $\\forall x \\in [a,b]$, $f(x) \\in [a,b] $, then $f$ has at least one fixed point in $[a,b]$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What does this say, intuitively, and how might we show that it is true? \n",
"\n",
"Intuitively, since we bound the inputs and outputs with the same domain, we're looking at a *square* in the one-dimensional case, and a hypercube in the general case. The identity function $I(x) = x$ passes through the diagonal of the square, because $I(a) = a$ and $I(b) = b$. So our statement is really that if we can bound the function by a square, then the function must pass through the diagonal. \n",
"\n",
"A proof follows."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We know that $a \\le f(a) \\le b$, and $a \\le f(b) \\le b$.\n",
"\n",
"Define $g(x) = f(x) - x$. Note that $g(a) = f(a) - a \\le 0$, and $g(b) = f(b) - b \\ge 0$. \n",
"\n",
"By the intermediate value theroem, we can conlude that $\\exists p : g(p) = 0$\n",
"\n",
"At this point, $g(p) = 0 = f(p) - p$, so $f(p) = p$ and we're done."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Fixed Point Iteration ###\n",
"\n",
"The idea here is to find a fixed point, starting from an initial guess. If we guess some point, $p_0$, then we can improve our guess to $p_1$ by letting $p_1 = g(p_0)$. If $p_0$ is a fixed point, then $p_0 = g(p_0) = p_1$ and we have converged. One important note is that we are only guarenteed to reduce our error $|p - p_i|$ if the derivative of $g$ is between -1 and 1. Otherwise applying $g$ to $p_0$ will take us further than we were from the fixed point. \n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: sin(x)\n",
"p_0 = 0.5\n",
"xs = arange(-2, 2, 0.1)\n",
"plot(xs, f(xs))\n",
"plot(xs, xs)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 25,
"text": [
"[<matplotlib.lines.Line2D at 0xa366128>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEACAYAAAC08h1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVHX+P/DXKLRe8PpVUWGQ4iKIzABeWNyoYXNgxRVJ\nXbUVl6/6a0kD190ya3/tVzQl/VprGn3T7YJam5ojJvsNWS/buKUhpeNYoitSJBehMcUULQXP94+z\nIMhtmDOXMzOv5+NxHjPDfJjz7hOP97z8zDlnFIIgCCAiIrfRzdEFEBGRfbHxExG5GTZ+IiI3w8ZP\nRORm2PiJiNwMGz8RkZuR1PjLy8sRFxeHsLAwjB49Ghs3bmxz3OLFixEUFAS1Wg2DwSBll0REJJGH\nlF/29PTE+vXrERERgevXr2PMmDHQarUIDQ1tGpOfn4/z58+jpKQEx44dw8KFC1FYWCi5cCIisoyk\nxD906FBEREQAALy8vBAaGoqqqqoWY/Ly8pCamgoAiI6ORm1tLWpqaqTsloiIJLDaGn9ZWRkMBgOi\no6Nb/LyyshJKpbLpsa+vLyoqKqy1WyIi6iKrNP7r169jxowZ2LBhA7y8vFo9f+9VIRQKhTV2S0RE\nFpC0xg8At2/fxvTp05GSkoLk5ORWz/v4+KC8vLzpcUVFBXx8fFqNCwwMRGlpqdRyiIjcSkBAAM6f\nP9+l35GU+AVBwIIFCzBq1CgsWbKkzTFJSUnYtm0bAKCwsBD9+/eHt7d3q3GlpaUQBEH22/Llyx1e\ngyvUyDpZp9w3Z6nTksAsKfEfOXIE7777LlQqFSIjIwEAWVlZuHDhAgAgLS0NiYmJyM/PR2BgIHr3\n7o2cnBwpuyQiIokkNf4HH3wQd+7c6XRcdna2lN0QEZEV8czdLtJoNI4uoVPOUCPAOq2NdVqXo+s0\n1ZnwWeVnNnlthSAIsvgiFoVCAZmUQkTkULuLdyN9Xzp+F/07PPvgsx2OtaR3Sj6qh4iIrMNUZ0L6\nvnQYq43InZmLGGWMTfbDpR4iIhnYXbwbqk0q+PX1gyHNYLOmDzDxExE5lL1SfnNM/EREDqIr1tkt\n5TfHxE9EZGeOSPnNMfETEdmRo1J+c0z8RER24OiU3xwTPxGRjckh5TfHxE9EZCNySvnNMfETEdmA\n3FJ+c0z8RERWJNeU3xwTPxGRlcg55TfHxE9EJFHzlL975m5MUE5wdEkdYuInIpLg3pQv96YPMPET\nEVnEGdby28PET0TURc6ylt8eJn4iIjM5c8pvTnLinz9/Pry9vREeHt7m83q9Hv369UNkZCQiIyOx\natUqqbskIrI7Z0/5zUlO/PPmzUNGRgZ+85vftDvm4YcfRl5entRdERHZnanOhCfzn4SxxrlTfnOS\nE39sbCwGDBjQ4Rh+ly4ROaNdp3ch/PVwjOg3AifTTrpE0wfssMavUChw9OhRqNVq+Pj44KWXXsKo\nUaNsvVsiIos1T/l7Zu1xmYbfyOZH9URFRaG8vBxGoxEZGRlITk629S6JiCzmqim/OZsn/j59+jTd\nnzRpEhYtWoTLly9j4MCBrcZmZmY23ddoNNBoNLYuj4gIgPOkfL1eD71eL+k1FIIVFuDLysowZcoU\nfPHFF62eq6mpwZAhQ6BQKFBUVISZM2eirKysdSEKBT8LICKH0BXrkLEvAynhKVgZtxI9PXs6uiSz\nWdI7JSf+xx57DIcPH8alS5egVCqxYsUK3L59GwCQlpYGnU6H119/HR4eHujVqxd27NghdZdERFbh\nKsfld5VVEr81MPETkT05c8pvziGJn4jImbhrym+O1+ohIrfRePatsq/S6c++lYKJn4hcHlN+S0z8\nROTSXOkaO9bCxE9ELokpv31M/ETkcpjyO8bET0QugynfPEz8ROQSmPLNx8RPRE6NKb/rmPiJyGkx\n5VuGiZ+InA5TvjRM/ETkVJjypWPiJyKn0JjyT1afZMqXiImfiGSvecp31W/FsicmfiKSLa7l2wYT\nPxHJEtfybYeJn4hkhSnf9pj4iUg2mPLtg4mfiByOKd++JCf++fPnw9vbG+Hh4e2OWbx4MYKCgqBW\nq2EwGKTukohcCFO+/Ulu/PPmzUNBQUG7z+fn5+P8+fMoKSnBX/7yFyxcuFDqLonIBZjqTJilm4Xn\n//E8cmfmYl38Oqf9wnNnI7nxx8bGYsCAAe0+n5eXh9TUVABAdHQ0amtrUVNTI3W3ROTEmPIdy+Zr\n/JWVlVAqlU2PfX19UVFRAW9vb1vvmohkxhnX8gUBaGgA6uvFrfG+hwfg5QV07+7oCrvOLh/uCoLQ\n4rFCoWhzXGZmZtN9jUYDjUZjw6qIyJ50xTpk7MvAnPA52DJ1i0OWdW7cAM6fB77+GjCZgEuXxNvm\n9y9dErcffxSb/J07QLduYqPv3v3u7e3b4uv17g306QP07dvytn9/QKkERowA/Pzubr16Sftv0Ov1\n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\n",
"text": [
"<matplotlib.figure.Figure at 0xa3663c8>"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that there is a fixed point at 0. Assuming we start with 0.5, how would the iteration proceed?\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p_i = 0.5\n",
"for i in range(10):\n",
" p_i = f(p_i)\n",
" print 'iteration', i, 'point', p_i"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"iteration 0 point 0.479425538604\n",
"iteration 1 point 0.461269555033\n",
"iteration 2 point 0.445085336847\n",
"iteration 3 point 0.430534904682\n",
"iteration 4 point 0.417356952803\n",
"iteration 5 point 0.40534569446\n",
"iteration 6 point 0.394336465428\n",
"iteration 7 point 0.384195664011\n",
"iteration 8 point 0.374813558009\n",
"iteration 9 point 0.366099037028\n"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It looks like we're getting there. Let's run it for longer."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p_i = 0.5\n",
"for i in range(1000):\n",
" p_i = f(p_i)\n",
" if i % 100 == 0: print 'iteration', i, 'point', p_i"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"iteration 0 point 0.479425538604\n",
"iteration 100 point 0.161958606796\n",
"iteration 200 point 0.11819383448\n",
"iteration 300 point 0.0975932008598\n",
"iteration 400 point 0.0850081570339\n",
"iteration 500 point 0.076302909762\n",
"iteration 600 point 0.0698213726171\n",
"iteration 700 point 0.0647536556891\n",
"iteration 800 point 0.0606506083178\n",
"iteration 900 point 0.0572404402683\n"
]
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So it looks like we start off making good progress and then slow down quite a bit."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fixed point iteration is pretty weak. Let's look at something more powerful."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Newton's Method"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Newton's method is a root-finding technique based on a degree 1 taylor series approximation. Intuitively, we approximate the function $f$ with its degree 1 Taylor series, which is linear. This approximation is given by\n",
"\n",
"$f(x) \\approx f(x_0) + f'(x_0)(x-x_0)$ for some $x_0$ near $x$.\n",
"\n",
"Now if our goal is to find $x$ such that $f(x) = 0$, we just set the right side equal to zero.\n",
"\n",
"$0 = f(x_0) + f'(x_0)(x-x_0)$\n",
"\n",
"$-f(x_0) = f'(x_0)(x-x_0)$\n",
"\n",
"$-\\frac{f(x_0)}{f'(x_0)} = x - x_0$\n",
"\n",
"$-\\frac{f(x_0)}{f'(x_0)} + x_0 = x$\n",
"\n",
"And now we know how to take some initial guess, $x_0$, and obtain a better guess, $x$. Furthermore, since we're using a Taylor series, we can bound the error as $O(x^2)$, assuming our initial guess is close to the solution. \n",
"\n",
"Implementing this should be easy."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def newton(f, f_prime, x_0, tol):\n",
" #find a root with error tolerance tol\n",
" print x_0\n",
" x = x_0 - f(x_0)/f_prime(x_0)\n",
" if abs(f(x)) <= tol:\n",
" return x\n",
" return newton(f, f_prime, x, tol)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's test it out."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: x**2\n",
"df = lambda x: 2*x\n",
"print newton(f, df, 0.5, 1e-5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.5\n",
"0.25\n",
"0.125\n",
"0.0625\n",
"0.03125\n",
"0.015625\n",
"0.0078125\n",
"0.00390625\n",
"0.001953125\n"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So it figured out that $x^2$ has a zero at $x=0$. We can also compute $\\pi$ by desiging a function with a zero at $\\pi$."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: sin(x)\n",
"df = lambda x: cos(x)\n",
"print newton(f, df, 3.0, 1e-12)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"3.0\n",
"3.14254654307\n",
"3.1415926533\n",
"3.14159265359\n"
]
}
],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wow! Newton's method converged quickly. In fact, the bounds on the Taylor approximation give us a *quadratic* convergence guarantee (if we start close enough).\n",
"\n",
"What if, however, we don't know $f'$?"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"The Secant Method"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"A motivation for introducing the secant method is the requirement that Newton's method has for the derivative of the function we wish to find a root of. In some applications, finding $f'$ may not be feasable or tractable. \n",
"\n",
"Looking at what $f'$ means, we see by definition\n",
"\n",
"$f'(x_0) = \\lim_{x \\to x_0} \\frac{f(x) - f(x_0)}{x-x_0}$\n",
"\n",
"If we assume that $x_1$ is close to $x_0$ then we can approximate the limit,\n",
"\n",
"$f'(x_0) \\approx \\frac{f(x_1) - f(x_0)}{x_1-x_0}$\n",
"\n",
"Now plugging this approximation into Newton's method,\n",
"\n",
"$x = x_0 - \\frac{f(x_0)}{f'(x_0)}$\n",
"\n",
"$x = x_0 - \\frac{f(x_0)}{\\frac{f(x_1) - f(x_0)}{x_1-x_0}}$\n",
"\n",
"$x = x_0 - \\frac{f(x_0)(x_1-x_0)}{f(x_1)-f(x_0)}$\n",
"\n",
"Which requires only the function $f$. \n",
"\n",
"Note that this equation requires two values, $x_0$ and $x_1$. These can be found in different ways. One way is using $x_1 = x_0 + \\epsilon$ for some very small $\\epsilon$. This gives us a good approximation to the derivative, at the cost of twice as much computation.\n",
"\n",
"Another method, which is used in the text, is to use previous values of $x_0$ as $x_1$. In other words, we define the recurrence relation for our estimates as:\n",
"\n",
"$x_n = x_{n-1} - \\frac{f(x_{n-1})(x_{n-1}-x_{n-2})}{f(x_{n-1}) - f(x_{n-2})}$\n",
"\n",
"Using this method the right way can enable us to only need one function evaluation per step. Let's code it up."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def secant_method(f, f_x_0, x_0, x_1, tol):\n",
" f_x_1 = f(x_1) #for efficiency\n",
" x = x_1 - f_x_1*(x_1-x_0)/(f_x_1-f_x_0)\n",
" if abs(x-x_1) <= tol:\n",
" return x\n",
" print x\n",
" return secant_method(f, f_x_1, x_1, x, tol)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And our usual test of computing $\\pi$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: sin(x)\n",
"x_left = 3.0\n",
"x_right = 4.0\n",
"print secant_method(f, f(x_left), x_left, x_right, 1e-12)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"3.15716279248\n",
"3.13945909822\n",
"3.14159272798\n",
"3.14159265359\n",
"3.14159265359\n"
]
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not bad. One fault of the secant method is that it **isn't guaranteed to converge**. This can be improved by a neat trick, where we keep our best bound. \n",
"\n"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"The method of false position"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"The method of false position is a modification to the secant method, which guarantees convergence. It operates very similar to the bisection method, but uses additional information to speed up convergence.\n",
"\n",
"The idea is to consider a bound, $x_l$ on the left and $x_r$ on the right. We could use the bisection method to try out the point $x_m = \\frac{x_l + x_r}{2}$, but we can do better using what we learned from the secant method. In the method of false position, we draw a line from $(x_l, f(x_l))$ to $(x_r, f(x_r))$, and use the intersection of this line as $x_m$, the midpoint. \n",
"\n",
"Put another way, we approximate the function over the interval with a line such that the approximation is equal to the function at the endpoints. Here's one example of the approximation"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_l, x_r = -0.7, 1\n",
"f = lambda x: x**3\n",
"xs = arange(-0.7, 1, 0.01)\n",
"plot(xs, f(xs))\n",
"plot([x_l, x_r], [f(x_l), f(x_r)])\n",
"plot([-1, 1], [0,0])\n",
"scatter([x_l, 0.0, x_r], [f(x_l), f(0.0), f(x_r)])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\ni1Hwi4hYzP8H5/ag+j9z8soAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0xa022240>"
]
}
],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Obviously this example is a simple one, but it illustrates how we can use our bounds and the function itself to do better than use the midpoint each time. Let's modify our bisection code to use this. First we need to derive a formula for the line passing through the endpoints.\n",
"\n",
"This line, $l(x)$, must satisfy\n",
"\n",
"$l(x_r) = f(x_r)$\n",
"\n",
"and\n",
"\n",
"$l(x_l) = f(x_l)$\n",
"\n",
"Using the general form for a line, $l(x) = ax + b$, \n",
"\n",
"$ax_r + b = f(x_r)$\n",
"\n",
"$ax_l + b = f(x_l)$\n",
"\n",
"We can subtract the second from the first, \n",
"\n",
"$ax_r + b - ax_l - b = f(x_r) - f(x_l)$\n",
"\n",
"$a(x_r - x_l) = (f(x_r)-f(x_l))$\n",
"\n",
"$a = \\frac{f(x_r) - f(x_l)}{x_r - x_l}$\n",
"\n",
"We just plug this result into one of the equations to get $b$,\n",
"\n",
"$\\frac{f(x_r) - f(x_l)}{x_r - x_l} x_r + b = f(x_r)$\n",
"\n",
"$b = f(x_r) - \\frac{f(x_r) - f(x_l)}{x_r - x_l} x_r$\n",
"\n",
"And now we know $l(x)$,\n",
"\n",
"$l(x) = \\frac{f(x_r) - f(x_l)}{x_r - x_l} x + f(x_r) - \\frac{f(x_r) - f(x_l)}{x_r - x_l} x_r$\n",
"\n",
"We don't need the entire line, however. We just need to solve for when it's zero.\n",
"\n",
"$l(x) = 0 = \\frac{f(x_r) - f(x_l)}{x_r - x_l} x + f(x_r) - \\frac{f(x_r) - f(x_l)}{x_r - x_l} x_r$\n",
"\n",
"Solving this for $x$, we get\n",
"\n",
"$x = x_r - \\frac{f(x_r)(x_r - x_l)}{f(x_r) - f(x_l)}$\n",
"\n",
"This is a recurrence relation in terms of the left and right bounds, $x_l$ and $x_r$. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def false_position(f, x_l, x_r, tol):\n",
" assert sign(f(x_l)) == -1 and sign(f(x_r)) == 1, 'convergence not guarenteed'\n",
" print 'left:', x_l, 'right:', x_r\n",
" \n",
" #root finding with error tolerance tol\n",
" x_m = x_r - f(x_r)*(x_r - x_l)/(f(x_r)-f(x_l))\n",
" \n",
" #base condition\n",
" if abs(f(x_m)) <= tol:\n",
" return x_m\n",
" \n",
" #recurrence relation\n",
" if sign(f(x_m)) == -1:\n",
" return false_position(f, x_m, x_r, tol)\n",
" else:\n",
" return false_position(f, x_l, x_m, tol)\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And our test"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = lambda x: x**2 - 2\n",
"x_left = 0.0\n",
"x_right = 2.0\n",
"print false_position(f, x_left, x_right, 1e-12)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"left: 0.0 right: 2.0\n",
"left: 1.0 right: 2.0\n",
"left: 1.33333333333 right: 2.0\n",
"left: 1.4 right: 2.0\n",
"left: 1.41176470588 right: 2.0\n",
"left: 1.41379310345 right: 2.0\n",
"left: 1.41414141414 right: 2.0\n",
"left: 1.41420118343 right: 2.0\n",
"left: 1.41421143847 right: 2.0\n",
"left: 1.41421319797 right: 2.0\n",
"left: 1.41421349985 right: 2.0\n",
"left: 1.41421355165 right: 2.0\n",
"left: 1.41421356053 right: 2.0\n",
"left: 1.41421356206 right: 2.0\n",
"left: 1.41421356232 right: 2.0\n",
"left: 1.41421356236 right: 2.0\n",
"left: 1.41421356237 right: 2.0\n",
"1.41421356237\n"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This shows us a common failure of the false-position method where only one endpoint converges. There are ways to fix this, but are not covered in the text."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Interpolation #\n",
"\n",
"Let's look at polynomial interpolation. The first thing to note is that given $n+1$ points, we can construct a polynomial of degree $n$ or lower going through all the points. Intuition is enough for me, but I think we could prove it fairly easily by using the fact that $x^p$ and $x^{p+1}$ are linearly independent and considering fitting each point an axis. Another way of saying it, we could turn this into a problem with $n$ equations and $n$ unknowns, which has a unique solution."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Lagrange interpolating polynomial"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"The idea here is pretty straightforward, and we rely heavily on the fact that we can make the polynomial zero out at certain places. In other words, if the polynomial is:\n",
"\n",
"$(x-x_1)(x-x_2)(x-x_3)$ \n",
"\n",
"Then it is zero at $x_1$, $x_2$, and $x_3$. \n",
"\n",
"### The Setup ###\n",
"\n",
"We desire some polynomial, $P(x)$ of degree $n$ such that for $x_1 ... x_{n+1}$, $P(x_i) = f(x_i)$ for any function $f$. Another way to think about this is to just let $y_i = f(x_i)$ and to find a polynomial through all the points.\n",
"\n",
"How can we make sure that this polynomial fits all the points? We let the polynomial be a sum of terms, where all but one of the terms will drop out (equal zero) at each point $x_1 ... x_{n+1}$. The term which remains will reduce to $f(x_i)$.\n",
"\n",
"\n",
"Looking at one point, $x_i$, how will we get the other terms to vanish? Simple - just multiply them by $(x-x_i)$. Now if we apply this logic to the other terms, we see that the $i$th term in the sum will be the product of $(x-x_j)$ for $j \\neq i$. Let's formalize what we have so far.\n",
"\n",
"$P(x) = \\sum_{i=1}^{n}{F_i(x)}$\n",
"\n",
"And each term $F_i(x)$ is given by \n",
"\n",
"$F_i(x) = \\prod_{j \\neq i}^{n}{(x-x_j)}$\n",
"\n",
"Now that we have taken care of the zeroing, we need each term, $F_i(x)$ to equal 1 if $x = x_i$. Once we have this, we'll just multiply each term in the summation by the value that it has to equal.\n",
"\n",
"After staring at it for a few seconds, the solution appears:\n",
"\n",
"$F_i(x) = \\prod_{j \\neq i}^{n}{ \\frac{(x- x_j)}{(x_i-x_j)} } $\n",
"\n",
"Plugging in $x = x_i$, all the terms cancel and we are left with 1. The intution for $F_i(x)$ is that it's an *indicator function*, which is one whenever we're at point $x_i$ and is zero whenever we're at another point $x_j$. Putting it all together,\n",
"\n",
"$P(x) = \\sum_{i=1}^{n}{ \\prod_{j \\neq i}^{n}{ \\frac{(x- x_j)}{(x_i-x_j)} f(x_i) }} $\n",
"\n",
"To save computation, we don't need $f(x_i)$ inside the inner loop:\n",
"\n",
"$P(x) = \\sum_{i=1}^{n}{ f(x_i) \\prod_{j \\neq i}^{n}{ \\frac{(x- x_j)}{(x_i-x_j)} }} $\n",
"\n",
"\n",
"Let's implement it and see how it works."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def poly_interpolate(x_values, y_values, x_new):\n",
" #consider y = f(x). \n",
" n = x_values.shape[0]\n",
" \n",
" #This is the indicator function discussed above\n",
" F_i = lambda x,i: prod([ (x_new - x[j])/(x[i]-x[j]) for j in xrange(n) if j != i])\n",
" \n",
" #We return a weighted sum of the indicator functions centered at each point.\n",
" return sum( F_i(x_values, i)*y_i for i, y_i in enumerate(y_values))\n",
"\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's do a few examples."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_values = hstack((arange(-5, -1, 0.7), arange(1, 5, 0.7)))\n",
"y_values = sin(x_values)\n",
"plot(arange(-7, 7, 0.1), sin(arange(-7, 7, 0.1)))\n",
"plot(arange(-7,7,0.1), [poly_interpolate(x_values, y_values, xi) for xi in arange(-7,7,.1)])\n",
"scatter(x_values, y_values)\n",
"legend(['actual', 'interpolation'])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
"<matplotlib.legend.Legend at 0xa384e10>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEACAYAAAC9Gb03AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8jef/x/HXyRKJJIIQJKQSZCmxtxhBjJg1axdVtDpU\ntb5Fa7VoUaVUh9Ha1RhJrIhaaawOtYIgQRBbdnKu3x/5SUsSkpxxn3E9H4/zkJNz3/f1Js4n97nu\n674ulRBCIEmSJJksC6UDSJIkSbolC70kSZKJk4VekiTJxMlCL0mSZOJkoZckSTJxstBLkiSZOI0L\n/fDhw6lQoQK1atXK9/WoqCicnJwICAggICCAGTNmaNqkJEmSVARWmh5g2LBhjB8/nsGDBxe4TatW\nrdi6daumTUmSJEnFoPEZfYsWLXB2dn7uNvKeLEmSJOXovI9epVJx+PBhateuTadOnTh9+rSum5Qk\nSZL+Q+OumxepW7cu8fHx2NnZER4eTvfu3Tl//ryum5UkSZKeEFoQFxcn/P39C7Wth4eHuHPnTp7v\ne3p6CkA+5EM+5EM+ivDw9PR8Yd3VedfNzZs3c/voY2JiEEJQpkyZPNtdvHgRIYTBP6ZOnap4BlPI\nKHPKnIb+MJacFy9efGEd1rjrpn///uzfv5+kpCTc3d2ZPn06mZmZAIwePZpNmzaxdOlSrKyssLOz\nY926dZo2KUmSJBWBxoV+7dq1z3197NixjB07VtNmJEmSpGKSd8YWUWBgoNIRXsgYMoLMqW0yp3YZ\nS87CUAkhhNIhIGcYpoFEkSRJMhqFqZ06H14pSZJ+lSlThnv37ikdQ9IyZ2dn7t69W6x95Rm9JJkY\n+V4yTQX9XAvz85Z99JIkSSZOFnpJkiQTJwu9JEmSiZOFXpIks2JhYcGlS5eUjqFXstBLkmTQPDw8\niIyMVDqGUZOFXpIkgyZHEWlOFnpJkvRmzpw5eHl54ejoiJ+fH7/++mvua99++y2+vr65r508eZJB\ngwZx9epVunbtioODA/PmzSMqKgp3d/enjvvfs/6YmBiaNGmCs7MzlSpVYvz48bnzb5krWeglSdIb\nLy8vDh48yMOHD5k6dSqvvvoqiYmJbNy4kenTp7N69WoePnzI1q1bKVu2LKtXr6ZKlSps376dR48e\n8d577+V7XJVKlfu1lZUVCxcu5M6dOxw5coS9e/eyZMkSff0VDZIs9JJkZlQq7TyKo3fv3ri6ugLQ\np08fqlevTkxMDN999x2TJk2iXr16AHh6elKlSpVitVG3bl0aNmyIhYUFVatWZdSoUezfv794gU2E\nnAJBksyMkt3dq1at4ssvv+Ty5csAPH78mKSkJOLj4/H09NRKG+fPn+edd97h+PHjpKSkkJWVRf36\n9bVybGMlz+glSdKLK1euMGrUKL7++mvu3r3LvXv38Pf3RwiBu7s7Fy5cyHc/1TMfH+zt7UlJScl9\nnp2dze3bt3OfjxkzBl9fXy5cuMCDBw+YOXMmarVaN38pIyELvSRJepGcnIxKpaJcuXKo1Wp++OEH\nTp06hUql4rXXXmPevHmcOHECIQQXLlzg6tWrAFSoUOGpVZRq1KhBWloaYWFhZGZmMmPGDNLT03Nf\nf/z4MQ4ODtjZ2XH27FmWLl2q97+roZGFXpIkvfD19eXdd9+lSZMmuLq6curUKZo3bw7k9N1/9NFH\nDBgwAEdHR3r27Jk7A+fkyZOZMWMGzs7OfPHFFzg5ObFkyRJee+013NzcKFWq1FOjcObNm8fPP/+M\no6Mjo0aNol+/fk99Knj2E4I5kLNXSpKJke8l0yRnr5QkSZIKJAu9JEmSiZOFXpIkycTJQi9JkmTi\nZKGXJEkycbLQS5IkmThZ6CVJkkycLPSSJEkmThZ6SZL0wt/fn99++03pGC/k4eHB3r17i7XvgQMH\n8Pb21nIizclCL0mSXpw6dYqWLVu+cDullw5UqVSFnibh2fVnW7RowdmzZ3UVrdg0LvTDhw+nQoUK\n1KpVq8Bt3nzzTapXr07t2rU5efKkpk1KkmTCNJnCQQih9+kfjGG6CY0L/bBhw4iIiCjw9bCwMC5c\nuEBsbCzLly9nzJgxmjYpSZIRetIlMm3aNPr06cOQIUNwdHTE39+f48ePA+S7dCBAdHQ0TZs2xdnZ\nmTp16jy1kEhgYCBTpkyhWbNmlCpVikuXLhEYGMjkyZNp1KgRTk5OdO/ePXeSNICtW7fi5+eHs7Mz\nrVu3LvAs/HnLEj75dFK7dm0cHBzYuHFjnmUOz5w5Q2BgIM7Ozvj7+7Nt27bc14YOHcrYsWPp0qUL\njo6ONG7c+KlPB1oltCAuLk74+/vn+9ro0aPFunXrcp/XrFlTJCYm5tlOS1EkyWRdv35dhIWFiRMn\nTjx3O0N9L3l4eIg9e/aIqVOnCltbWxEeHi7UarWYPHmyaNy48VPb7d27N/d5QkKCKFu2rAgPDxdC\nCLF7925RtmxZkZSUJIQQolWrVqJq1ari9OnTIjs7W2RmZopWrVqJypUri3/++UckJyeLXr16iVdf\nfVUIIcS5c+eEvb292LNnj8jKyhKff/658PLyEpmZmXnaP378uPj9999Fdna2uHz5svDx8RELFizI\nzaZSqcTFixdzn+/bt0+4ubkJIYTIyMgQnp6eYvbs2SIzM1NERkYKBwcHce7cOSGEEEOGDBFly5YV\nR48eFVlZWWLgwIGiX79+Bf77FfRzLczPW+crTF27du2p33Bubm4kJCRQoUIFXTctSSYjMjKSkJC+\nWFnVITPzHP36hbBixVfFmnJXNV070/SKqcXrslCpVLRo0YKOHTsC8Oqrr7JgwYICt1+zZg2dOnXK\n3b5du3bUr1+fHTt2MHjwYFQqFUOHDsXHxwfI6TdXqVQMHjwYX19fAD799FPq1KnDypUrWb9+PV26\ndKFt27YAvPfeeyxcuJDDhw/nuYZQt27d3K//uyzhW2+99cK/Z3R0NMnJyXzwwQcAtG7dmi5durB2\n7VqmTp0KQM+ePXNXvxo4cCDvvPPOi/8Bi0EvSwmKZ/qwzHE+6MJITs3ko9WhxFz9k+splylvW5lA\nr8a82yOICs72SseT9GzvyQvM3PozicnXORd3BnWtkXBhMDyozPr1DRgwIDK3WBVFcQu0Nv33RM/O\nzo60tDTUajUWFnl7k69cucLGjRuf6vbIysqiTZs2uc//ezKZ3/eqVKlCZmYmSUlJ3Lhx46n1aFUq\nFe7u7ly7di3PMTRZlvD69et5clWtWpXr16/ntvvff4eSJUvy+PHjQh27qHRe6CtXrkx8fHzu84SE\nBCpXrpzvttOmTcv9OjAwkMDAQB2nU87Vq1cZOnQcZ86cxcfXh7Jtg9hy9wscsqtQt0xr2ldqw8U7\nV/nu78V8cWY8I16azdejB2BlKQdKmbqDpy7T67vx3C4RTR3Vq/iV8+PM7n/A/RY0aw1XWpId1YJL\nly4Vq9AbumdPBKtUqcKgQYNYvnx5ofcBcleoevK1tbU1Li4uVKpUib///jv3NSEE8fHx+dalMWPG\nUK9ePdavX4+9vT0LFixg8+bNhfp7VKpUifj4eIQQufmuXLmi8fDLqKgooqKiirbTCzt3CuF5ffQ7\nduwQwcHBQgghjhw5Iho1apTvdlqKYhRSU1OFm1tNYWn5qcDqD0H3rkL1uo/4eltUvtt/E3ZQ2E2o\nJ1wndBd3H6bqOa2kTzPWRQjV++VFh09nizsPUnK//9JL/gKWC6yTBW3fFkwsJ16f922+xzDU99J/\n++if9JcLkVM/VCqVyM7OFkII0bhxY7F8+fLc1+Pj44Wrq6vYuXOnyMrKEqmpqWLfvn0iISFBCCFE\nYGCgWLFixVNttWrVSri5uYnTp0+L5ORk0bt3bzFw4EAhhBBnz54V9vb2Yu/evSIjI0PMnTtXeHp6\n5ttH37BhQ/HJJ58ItVotzpw5I2rUqCGaN2+e246rq6vYtWtX7vP/9tGnp6eLatWqiTlz5oiMjAyx\nb9++PH30U6ZMyXff/BT0cy3Mz1vj08P+/fvTtGlTzp07h7u7O99//z3Lli1j2bJlAHTq1Ilq1arh\n5eXF6NGjWbJkiaZNGr1Tp07x4IEN2ZZvweA3wNoWu3VWNHMvne/2o4ObcXPWYWwsSvDS/4KJv/VQ\nz4klfRi/bC0fHx/GwmYbiZjyAWUcS+a+tn37elxd52BnXQObA9/SK+stlt36kI/XbFcwcdE9GaP+\n7Bn4f58/u3Sgm5sboaGhzJo1i/Lly1OlShXmz5//VJdwfscbNGgQQ4cOpWLFimRkZLBo0SIAatas\nyZo1axg/fjwuLi7s2LGDbdu2YWWVt4PjRcsSTps2jSFDhuDs7MymTZue+rvZ2Niwbds2wsPDcXFx\nYdy4caxevZoaNWo89W9R0L+DNsmlBBVw+vRp6jUIJq2HDzysAtu/pKStF3/9dQAvL68C98vMyqbO\nR+OIT/mH9jerk5qczLBhr9C7dy89ppd0Ye7mvUyKGcDmkL30aOaf7zZZWVkkJCRQtmxZHBwc+GFX\nDCP2dmVmvdVM7tM+dztzei8VpHXr1gwaNIjhw4crHUVr5FKCRsbb2xvrEH9QPYAdNbAr2Yng4LZ4\neno+dz9rK0vWDhrHo/upbH6YRlhYMEOGvMd33/2gp+SSLmyNPs2kmP4sbLaxwCIPYGVlhYeHBw4O\nDgAMa9+QRc03MeX4YH4/E1/gfubK3H/Z/Zcs9Ap4+4e1pFeMY2adVxkzOoEvvxzIhg0rC/WxbdWP\nq2FzO6gZDf42pKT8yKxZi/SQWtKFx6kZ9Fs/kFcrzmR8yIunB3jWuK4t6OD4Du2W9+FxaoYOEhov\nObrvX3oZXin96+/L11gc+zYrOoQzrEO9Iu+flZUNqaVgwyYY1AEur0atVusgqaQPHWd/ggNu/Pjm\na8U+xtYP3qPyewfoOPsTDn4yQ4vpjNe+ffuUjmBQ5Bm9Hgkh6PD1azRSjS1WkQcYOnQgdnaLIfEE\nnOyBquMsxo8foeWkkj78sCuGI+kr2D3+Wywsin/2aWVpQfgbyzic8Q1hMYY3oZakPFno9WjyT+u4\nk5FI+IcfFvsYderUYffuUNq02UbAw3hU7ld5XLHgC7iS4blz5w7XbyQyPvxNhlf5jJeruWp8zLrV\nK9G9zP8Y+PMbWkgomRo56kZPHqWlUHaqN9Nq/cSHr7bQ2nFnrtvJ9GNjuT/jDHa21lo7rqR9mZmZ\n9O07jB07tpHlUxeaJHHv8yM4OpTSyvHTMrIoM6kBqQv+MOn3krmSo26MwOClX+D4qCGTB2qvyAN8\n1K8DpbI8GLX0e60eV9K+zz77goiI22SIS6jbXMRidz0+nDxNa8e3tbHis9YLsbKzeWq8unyYxsPZ\n2bnY/zdkodeDi7duEHrrS5a/8jm6GAjwRafZrL3+KXcfpmr/4JLWHDhwjNTUYdBwBVxrSNbFVzl8\n+LhW2xgf0hLHka0Y8MU3uXOzy4dpPO7evVvs/xcmW+g/3PshSSlJSscAYOiK2Xg+GkLP1tV0c/z2\nDXDNasSgxYt1cnxJO2rW9MDKLhKafAH7PsHKai/Vq3tovZ3Pgz9l/fUZ3H+cpvVjS8bJZAv9zos7\nuXRPR5P4F8HlOzc49GgNSwa+r9N2lvb9lPAHc0l6kKLTdqTi++STjyjR5Caq+Jo4pI3C1fUXFiyY\npfV2RnRoRLmsAEYsKXgSMMm8mGyhd3d0J/6B8ncLjvzhc9zvDSaoieYjK54npLEvFTKaMm7Fjzpt\nR9KAlS2pdY8xudlrbNr0MWfPnqBixYo6aWpel6mE3p5HSlqmTo4vGRfTLvQPlS301x4kEnl3JV/0\n1O3Z/BP/azuRzde/ICMzWy/tSUXzxvIfKZcZwMzxg2nfvj329rpbY+DVtvUolVmNSSs36awNyXiY\nbqF3Uv6MftzqRbjcHEDPoEp6aW9M52bYZpdn8qotemlPKrysbDWbry3gw8CJemtzbL13+P7sfNRq\nOdTS3JluoVf4jD45I5ntN77lozZv62SkTX5UKnijzkSWnZqrnwalQpu7eQ8W6hKM71r0+WyKa/qA\nLmRaPOLr7Qf01qZkmEy30DspW+hnha3E6loLXu/z/Bkpte3TgSGkW95i1Z5jem1Xer4FR76ij8d4\njaY6KCorSwt6V36bWfu+0FubkmEy3UKv4MVYtVCz+PiXDHjpHaz1fLOqjbUlbUqPYubOb/TbsFSg\nyD8ucrtENPOHDtB7218MfZWbtr9x9FyC3tuWDIfJFvpKDpW4lXyLLHWW3ttef3I7yUnOfDqymd7b\nBpg/cDixVpu5cvO+Iu1LT3t/wxLqWw6jnJOd3tt2LVMKX3U/Jq2Td06bM5Mt9NaW1rjYu3D90XW9\ntz09fDH1s9+kUiVl5sP2f6kCbukdeG/VGkXal/71ODWDE9mrmfPKaMUyjKwbwr4Hy6n1civeeWcy\n6enpimWRlGGyhR6U6b6JvRPLxcd/MvWVV/Ta7rPeafk6224slSMuFDb15604pfvRpo5+r9U8kZSU\nxKdjR8Kj8pxKe4VvvjlF//5yWmtzY9qFXoELsp+EfYPd+WF0aFtCr+0+682QVqhVmfywO0bRHOZu\n9anv6VtDuXVL9+zZQ3p6PTg+FurvIjV1PVu3bpRn9WbGtAu9ns/oUzNT2XRhJYP9RmOh8L+shYWK\nlk6D+TJypbJBzNjRcwkk2UYzY6Byi7dbWVkBqfBPX6j6G9hfA8BC6f+gkl6Z9E9b32Pp1/yxnuyr\njXl76Et6a/N5pvcaxGnVBh4my7M3JXy4YSXe2X0UuQj7RIcOHXB2voK1mAznWmNR+31GjXoDa30P\nB5MUZdqFXs9dN/P2LafGw9FU080klUXWzK8qTmkv8+n67UpHMTtqtWD//ZW823aYojkcHBw4ceIg\no0eXwDvdGcuAOBYvnq9oJkn/TLvQ67Hr5vTt01x9cIW3uwTrpb3C6uU1hNV/y+4bfVsTeRwQDAtq\nqHQUypUrx1dfzePPX78lu2QS2+W6smbHtAu9Hs/ovz7yHeqTQ3ill5Ve2iusGQN6cdP2N05fuaV0\nFLOyYO9PNHEYoNc7YV/ExtqS+iUGMnvHaqWjSHpm0oW+gn0F7qXeIz1Lt33UGdkZrP5zDYFOw3F0\n1GlTReZaphRVMzrx6ebNSkcxGxmZ2fyZvY4POuv/TtgX+SB4EEfT1pCVrVY6iqRHJl3oLS0sqeRQ\niYSHur39e9u5bVje9WVUby+dtlNcA+v0I/zqeqVjmI0FofuwzaxMcIOaSkfJo0czf6yyS7M8/LDS\nUczGr79CpsLLAph0oQeoWroqVx5c0WkbX0evICN6BJ066bSZYpvUswMPS/7FsfPXlI5iFlb8/jPt\nKhje2fwTzUv35ZuD8he/PsTGwpgxKD/cWtnmda9m2ZqcTdLdxaf4B/H8nhBDD+9elCyps2Y04mhf\nAs/M7szcslHpKCbvcWoGF6x+5X89+yodpUCTOvflH/UmuUCNHmzcCL16gaWlsjk0LvQRERF4e3tT\nvXp1PvvsszyvR0VF4eTkREBAAAEBAcyYMUPTJovEp5yPTgv9j3/8iMOVvgzsY6BV/v8NbdCX3Ynr\nlI5h8uZv2UOpVF/q16isdJQCBdWrTonMiize/pvSUUzexo2g8GwogIaFPjs7m3HjxhEREcHp06dZ\nu3YtZ86cybNdq1atOHnyJCdPnmTKlCmaNFlk3uW8OZOUN5M2qIWab499T+qh12jbVidNaM3b3dqQ\nYnOJ3/6KUzqKSVtzYiPtKhnAO/sFWpXry3fRG5SOYdJiYyExEZo3VzqJhoU+JiYGLy8vPDw8sLa2\npl+/foSGhubZTgjlJtbycfHhzG3dFPrIuEjUqaXp0bguNjY6aUJr7GytqaHuxhdhvyodxWQ9Ts3g\notVWJndTbsqDwprctQ9n2Exahv6n8TYXhtJtAxoW+mvXruHu7p773M3NjWvXnr7gp1KpOHz4MLVr\n16ZTp06cPn1akyaLrIpTFe6l3eNR+iOtH/u7k99he3oEvQz/fQ1AvzrdiUqUhV5XFoRGYp9WkwY1\n3ZSO8kItX34J2wx3loUfUjqKydqwwTC6bQA0urtHVYjFUOvWrUt8fDx2dnaEh4fTvXt3zp8/n++2\n06ZNy/06MDCQwMBATeIBYKGyoEbZGpxNOkuDyg00Pt4Td1LuEHY+HPYuIchI1nSY0K0t008N5MzV\n2/hUcVE6jslZfXwTbVx7Kx2j0Jo4d2dl9K+81a2V0lFMzoULuuu2iYqKIioqqkj7aFToK1euTHz8\nv3eexsfH4+b29NmMg4ND7tfBwcG88cYb3L17lzJlyuQ53n8LvTY9uSCrzUK/+q/VeFt0xaudM7a2\nWjusTpUuZUuFx60ZNvszxjWrQ+/evbE1lvAGLi0ji1jLUL7v+j+loxTaG2260+/XENTqLwzqDl5T\nEBoKISG66bZ59iR4+vTpL9xHo66b+vXrExsby+XLl8nIyGD9+vWEhIQ8tc3Nmzdz++hjYmIQQuRb\n5HVJ2xdkhRCsOLGC7JjXjKbbBmDnzp0kHXzI7w+P8vrrK6lfvxWpqalKxzIJ30Ycxja9Cs38qiod\npdB6NPUHVPxy6G+lo5ic0FDo1k3pFP/SqNBbWVmxePFiOnTogK+vL3379sXHx4dly5axbNkyADZt\n2kStWrWoU6cOEyZMYN06/Q/x8ynno9VCH50QTVpmBud2t6RDB60dVudGjnyb7DNvQdWTJGf+Qlxc\neVaulBOeacPK6FAalQ558YYGxMJCxcs23VkSKa/baFNSEvz5JwY1Ek/jGbiCg4MJDn56xsbRo/9d\nH3Ps2LGMHTtW02Y04uOi3bH0K06soJH1azxoqcLeXmuH1bl7925DegOIbwJeO0k7609SUpLSsYye\nWi34Mz2UVe2N74a0oY27M2nfBOBjpaOYjB07oF07DKpL1+TvjAWoXqY6cffiyMzWfMKJh+kP+eXs\nL6RGD6FrVy2E06PAwLbY2EyBs13AewMlSqzSygVvcxd29CzCIoO+LesoHaXIRnZsSlqJeA79o9tp\nQszJk/55Q2IWhb6EVQncndy5eO+ixsda+/daWldtS9T2CnTpooVwerRmzTJatbqL6vxnUH0387/8\nhOaGcDeHkVu8OxRfyxCjvKBpa2OFZ1YXvgzbqnQUk5CaCnv3QufOSid5mlkUegBfF19O3Tql8XFW\nnMzptvH0hMqGe5d7vpycnNi1awvZ9+OxT6/JgzJVlI5kEg4lbaV/XQM7hSuCV17uTuQ12U+vDXv3\nQp06UK6c0kmeZjaFvlHlRhyO12xq1j8S/+BW8i1uHAoyuI9mRaFSqWhRrgc/HZNvbk2dirvJ45Jn\nGNclUOkoxfZOtyDu2R3j4vW7SkcxeoY22uYJsyn0Laq04MDVAxodY8WJFQyrM5ztWy2Nrn/+WW+2\n785p8atcgEJD87Ztxz29PQ52Bj4HxnOUc7LDNbU1c3/doXQUo6ZWw7ZtstArqkHlBpy+fZrHGY+L\ntf/jjMesPbWWFqWGk5EBtWtrOaCeBTeoiVWWIyv3HFU6ilHbGbeVLjWM+OPd/+vs2Z3tF/LOUyUV\nXkxMTpeNp6fSSfIym0Jva2VLgGsA0QnRxdp/5R8rae3RmqN73AkJgULM/mDwAuy68ePh7UrHMFpJ\nD1JILLmP90IMdMWZIpjYrQvXbHdz96G8ga64DLXbBsyo0MP/d99cKXr3jVqoWfj7QiY0nsC2bRh9\nt80TrzbqzPGH8uN6cS3cupfSKfWpVslZ6Sgaq+leDseU2izaFql0FKMlC72BaFG1BQfjDxZ5v7DY\nMBxLOFK9RDP++QdMZej5ax2akGZ7mROx15WOYpQ2/BVKYEXj77Z5oqlLZ375O1zpGEYpNhbu34f6\n9ZVOkj+zKvRN3ZsScy2myDdOLYhewITGEwgLUxEUBCVK6CigntnaWOGW3p5F4fLNXVRZ2WouWGzn\nrY6mU+hHBXbmTNYO1Grl1o8wVjt25IydV3pt2IIYaCzdKG1bmmrO1Thx40Sh94m5FsPZpLP08evD\n1q2Gd8ebpjp5dWZXnOy+KarVe49hnVmWwNrVlI6iNd2a+CFU2YQd1d3Sm6YqPByemQnGoJhVoQdo\n7dGaiAsRhd7+f/v+x5SWUxBZNuzda9g/zOJ4q0tHbthG8jg1Q+koRmXVkXBqlTT+i7D/ZWGhooaq\nE8siw5SOYlRSUuDw4Zz5bQyV2RX6oXWG8v0f35Otzn7htgevHuT8nfMMDxjOgQPg52d4d7xpyqeK\nC/Zp3iwN0+weA3Nz9H4Y/eqZ2G99oFetzhy6KQt9UezbB/XqgaOj0kkKZnaFvo5rHSrYV2DXxV3P\n3U4IwZTIKXzc8mNsLG0M/qOZJhqW7sS647L7prDOXL1NcsmzjA42vXmCxndpwz37GBJuP1Q6itEw\nhtpgdoUeYFS9USw/sfy522w+s5mbyTcZVHsQYBw/zOIa3rwzp9LlWVxhfRW2C9fU1pQqabx3wxak\nvLM9ZZObsmj7HqWjGAUhjKM2mGWh7+ffj/2X93P9Uf7DChMfJzIubBw/dPsBKwsrrlyB27dzPp6Z\non6BAWRZPiDyD81n9zQH4bHhtKli4O9sDbSs1InQ0/IXf2HExkJ6OtSqpXSS5zPLQl/KphR9/Pow\n5+CcPK8JIRi9fTQjAkbQ2K0xABER0KGD4Q6d0pSVpQWeIpglu+Wb+0WystVcsd7JuA6mW+jHBnXm\ngipMDrMshPBw6NjR8O+UN9HS9WIz28xk58WdLDm6JPd7mdmZjA0bS8LDBD5u9e+KO8bw0UxT3Xw6\nE3Vd9tO/yOq9x7DJKE8TX9Od4rltgBeW2aVY/9sfSkcxeMZSG1TiycrdClOpVOg7yqV7l2j+fXNG\nBIygsmNl1p1aRymbUvzU8yecbJ0AyMgAFxe4cCHnT1N19dYDqi504+Z7iZR3NqL1EfWs9fTpPMp4\nxLGZ85SOolMBkydQzs6F3f/7SOkoBislBSpUgIQEcHJSLkdhaqfZntEDVHOuRvjAcJIzkzl54ySd\nq3cmtF9obpEHOHQIatY07SIPUKW8E6WTG/DVdjnXyfMcvR9O37pGcAqnob51O/P7HdmV9zxRUVC3\nrrJFvrA0W3uSAAAgAElEQVQ0Xhzc2NV2rc0Xrl8U+LqxfDTThuYVOrP57x18ionM2qZl5+KTSC55\nhtEdTW9Y5bPe6NSSySdPEZtwh+puZZWOY5AiIoynNpj1GX1hmFOhH9k6mPMiXF6EK8CiHTnDKh3t\nTWSyo+dwtC+Ba2ogC7bvVDqKwTKm2iAL/XPEx8ONG9CggdJJ9KNLQx8AtsecUTiJYQqPDaeNu5G8\ns7WgtXsw4bFywrv8XLgAycnw8stKJykcWeifY+dOCAoCS0ulk+hHzlwnwXy7T765n5WVreay1U7G\nmvCwyme90b4jl612yuUm82EswyqfkIX+OYzpo5m2dPcP5tBNWeiftSbyGDaZLjT1M91hlc9q7u+B\ndWZZft5X+NlezYWx1QZZ6AuQmQl79+bcKGVOxnVuwz3730m8W7y1dU3VysPh+Jc0one2lvjbBrPy\nsPzF/1+pqXDwYM6nfWMhC30BDh8GL6+ccbLmpFJZB5yTG/LVDjnM8r/MZVjls5q41OLA9V95/fW3\n+PPPP5WOYxD274fataF0aaWTFJ4s9AWIiMjpgzNHTSsE8+speRb3hDkNq/yvw4cP893HU8gsE8uy\nVeVo2rQdx44dUzqW4oyt2wa0UOgjIiLw9vamevXqfPbZZ/lu8+abb1K9enVq167NyZMnNW1SL4zx\nh6ktI1sFcy5bDrN8ImdYZaBZDKv8r2nT5pP2eDpcaQnVapCS8jEzZy5QOpbijLE2aFTos7OzGTdu\nHBEREZw+fZq1a9dy5szTQ/PCwsK4cOECsbGxLF++nDFjxmgUWB+uX4erV6FRI6WTKKNrY19QqeWS\ncv8vPDac1mY0rPKJ1NR0oAxc6AheEUAZUlLSlY6lqIsX4dEjqFNH6SRFo1Ghj4mJwcvLCw8PD6yt\nrenXrx+hoaFPbbN161aGDBkCQKNGjbh//z43b97UpFmdi4jIudBiZab3DVtYqKguh1kC5jms8olR\no/pjZ/c+xFYArwhsS37EyJH9lI6lKGMbVvmERoX+2rVruLu75z53c3Pj2rVrL9wmISFBk2Z1zpz7\n55/o7hfMwURZ6H+KPI51Zjma+VVVOoreDRo0kAULJlOz/DzIKMnQSW/Tu3cvpWMpyhi7bUDDuW5U\nhfy19uzMagXtN23atNyvAwMDCQwMLG60YsvKgj17YOFCvTdtUMZ3acuc84NIvPsY1zKllI6jmJWH\nw6lla4TvbC0ZOXIEI0eOoPYHb3LJMkXpOIpKS4MDB2DNGmVzREVFERUVVaR9NCr0lStXJj4+Pvd5\nfHw8bm5uz90mISGBypUr53u8/xZ6pURHQ9WqULGi0kmU9d9hljMHhSgdRzFH74fzv2afKh1Dcb1q\nBzP/99nAZKWjKGb//pwpD5ydlc3x7Enw9OnTX7iPRl039evXJzY2lsuXL5ORkcH69esJCXm6KISE\nhLBq1SoAoqOjKV26NBUMeHC6Mc1Ip2vmPszyfEISj0ue5vXgFkpHUdy4zoE8tD/J1VsPlI6iGGPu\n0tWo0FtZWbF48WI6dOiAr68vffv2xcfHh2XLlrFs2TIAOnXqRLVq1fDy8mL06NEsWbLkBUdV1pOL\nLZIcZrloxy4qmOGwyvyUcSxJ2ZRmfGXGi4Yba/88mPkKU89KTAQfH7h1C6ytFY1iENRqgc2kqvza\neyddGvkoHUfvqr03iMaVmvHzO68rHcUg9Px8If/c/ptzc1coHUXv4uKgceOc2WwNbe1oucJUEe3c\nCW3byiL/hDkPs8zKVnPZ0jyHVRZkZOuOXCDCLD/hPfmkb2hFvrCMNLZuyP75vMx1mKU5D6ssSId6\nNbAQNmw5fErpKHpnzN02IAt9ruxs2LXL/GarfJHxXdpy1z7a7GazNPdhlfmxsFDhbRnMd/vN6xd/\nWlrOiJv27ZVOUnyy0P+/mBioXBmeGR1q9iqVdaB0cgO+3rFP6Sh6dfR+OH3McLbKF+nu35EjtyOU\njqFXBw6Avz+UKaN0kuKThf7/GftHM11qWj6YLWY0zDI24Y4cVlmAsZ1bc9/+KNfvPFI6it6YQm2Q\nhf7/hYVB585KpzBMr5nZMEs5rLJgrmVK4ZzciMVmtF6BLPQmIjExZ1a6Jk2UTmKYujXxQ6iyiDh2\nTukoehFmprNVFlYzM7qR7vJluHsX6tZVOolmZKEnZ7RNu3ZyWGVBngyzXB5p+m/urGw1cZYRjG0v\nC31BRrYO5rwwj0944eE5AzSMdVjlE0YeXzvCwqBTJ6VTGLYQ32AOmMEwy5/25QyrbO4vh1UWpEtD\nH0CYxXoFpnKnvNkX+iezVZrCD1OXxnduy137I9y6l6x0FJ2SwypfzFxupEtLg6go06gNZl/ojxyB\n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\nvSRJkon7P1M2MkiDpX5vAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0xa386b70>"
]
}
],
"prompt_number": 37
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wow, it looks spot on in this interval. How does it do outside the range where there were points?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_test = arange(-8, 8, 0.1)\n",
"y_interpolated = [poly_interpolate(x_values, y_values, x_new) for x_new in x_test]\n",
"plot(x_test, y_interpolated)\n",
"plot(x_test, sin(x_test))\n",
"legend(['interpolated', 'actual'])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"text": [
"<matplotlib.legend.Legend at 0xa632fd0>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xa04d780>"
]
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ah, so we can see that it's only accurate where data were available. Let's run another example, *with noise*. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_values = arange(-5, 5, 0.3)\n",
"y_values = sin(x_values) + uniform(-.2, .2, x_values.shape) #add random noise\n",
"scatter(x_values, y_values)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 39,
"text": [
"<matplotlib.collections.PathCollection at 0xa8aa400>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\ndRMyWYfLVQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xa3905f8>"
]
}
],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's fit it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_test = arange(-5, 5, 0.1)\n",
"y_interpolated = [poly_interpolate(x_values, y_values, x_new) for x_new in x_test]\n",
"plot(x_test, y_interpolated)\n",
"plot(x_test, sin(x_test))\n",
"legend(['interpolated', 'actual'])\n",
"ylim([-10, 10])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 40,
"text": [
"(-10, 10)"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xa025588>"
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This shows how this interpolation method can easily fail in real-life problems. If you have a machine learning background, you should realize that what this polynomial interpolation technique is doing is **overfitting**. If that means nothing to you - no worries. I've got some other IPython notebooks on machine learning."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Neville's method##\n",
"\n",
"Neville's (sp) method is another way to generate the polynomial approximation, but has a nice recursive form.\n",
"\n",
"Define $P_{j,j}(x) = y_j$, which is the base case of the recusion. The rule for composing two previous polynomial approximations is:\n",
"\n",
"$P_{i,j}(x) = \\frac{ (x-x_i)P_{i+1,j}(x) - (x-x_j)P_{i,j-1}(x) } { x_j - x_i } $\n",
"\n",
"Implementation should be nice."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def neville_poly(xvalues, yvalues, x, i=None, j=None):\n",
" if i is None and j is None: #first iteration\n",
" i, j = 0, yvalues.shape[0]-1\n",
" \n",
" if i != j: #descend\n",
" P_iplus1_j = neville_poly(xvalues, yvalues, x, i+1, j)\n",
" P_i_jminus1 = neville_poly(xvalues, yvalues, x, i, j-1)\n",
" #combine them\n",
" return (P_iplus1_j*(x-xvalues[i]) - P_i_jminus1*(x-xvalues[j])) / (xvalues[j] - xvalues[i])\n",
" else:\n",
" #base case\n",
" return yvalues[i]\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_values = hstack((arange(-6, -1, 0.7), arange(1, 5, 0.7)))\n",
"y_values = sin(x_values)\n",
"plot(arange(-6, 5, 0.2), [neville_poly(x_values, y_values, x) for x in arange(-6,5,.2)])\n",
"scatter(x_values, y_values)\n",
"legend(['approximation'])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 42,
"text": [
"<matplotlib.legend.Legend at 0xa890470>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xae59fd0>"
]
}
],
"prompt_number": 42
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Divided Difference Method##\n",
"\n",
"Neville's method is very wasteful of computation. In the divided difference method, we do the same amount of computation but the result is the coefficients on the polynomial; we only have to run it once.\n",
"\n",
"Since $P(x)$ is a polynomial, it can be written in the form:\n",
"\n",
"$P(x) = a_0 + a_1(x-x_0) + a_2(x-x_0)(x-x_1) + ...$\n",
"\n",
"or\n",
"\n",
"$P(x) = a_0 + \\sum_{k=1}^{n}(a_k) \\prod_{j=0}^{k-1} (x-x_j) $\n",
"\n",
"\n",
"The divided difference method is a recursive formula for determining the coefficients $a_i$. \n",
"\n",
"Define $f[x_i] = f(x_i)$ (base case) and $f[x_i ... x_j] = \\frac{ f[x_{i+1} ... x_j] - f[x_i ... x_{j-1}]} { x_j - x_i } $\n",
"\n",
"This should be easy to implement."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class lagrangepoly(object):\n",
" def __init__(self, x, a):\n",
" #the vector x is the points,\n",
" #the vector a is the coefficients\n",
" self.x = x\n",
" self.a = a\n",
" \n",
" def apply(self, x_new):\n",
" val = 0.0\n",
" for k,coef in enumerate(self.a):\n",
" val += coef*prod([(x_new - x_j) for j,x_j in enumerate(self.x) if j <= k-1])\n",
" return val\n",
" \n",
"def divided_diff_coefs(xvalues, yvalues):\n",
" #return the coefficients for the lagrange approximating polynomial\n",
" #let's do it iteratively for a change\n",
" N = xvalues.shape[0]\n",
" coef = {(i,i):yvalues[i] for i in range(N)}\n",
" for delta in range(1, N):\n",
" for i in range(0, N-delta):\n",
" coef[i,i+delta] = (coef[i+1,i+delta] - coef[i,i+delta-1]) / (xvalues[i+delta] - xvalues[i])\n",
" #ok, now construct the ones we care about\n",
" c = zeros((N,))\n",
" for j in range(N):\n",
" c[j] = coef[0,j]\n",
" return c"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 43
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x_values = hstack((arange(-6, -1, 0.7), arange(1, 5, 0.7)))\n",
"y_values = sin(x_values)\n",
"poly = lagrangepoly(x_values, divided_diff_coefs(x_values,y_values))\n",
"plot(arange(-7, 6, 0.2), [poly.apply(x) for x in arange(-7,6,.2)])\n",
"scatter(x_values, y_values)\n",
"legend(['approximation'])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 44,
"text": [
"<matplotlib.legend.Legend at 0xaed4eb8>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xa384710>"
]
}
],
"prompt_number": 44
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Interpolation with Radial Basis Functions ##\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The 'indicator function' viewpoint is a valuable one for interpolation. The idea, as we discussed before, is to make the interpolation a sum of terms,\n",
"\n",
"$P(x) = \\sum_{i=1}^{n}{y_i F(i, x)}$\n",
"\n",
"Where $F(i, x)$ is $1$ if $x = x_i$ and $F(i, x) = 0$ if $x = x_j$, where $x_j$ is another of the points in our provided set. In polynomial interpolation, we did this by carefully constructing a polynomial which would zero out at all the other points. Another way to look at it is to say that the indicator, $F(i, x)$ should only be nonzero if $x$ is close to $x_i$. To achieve, this, we'll use *radial basis functions*.\n",
"\n",
"Here's what the plot of an RBF looks like"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def rbf(x, center, width):\n",
" return exp( -norm(x - center)**2 / width)\n",
"\n",
"x = arange(-5, 5, 0.1)\n",
"y = [rbf(xi, 0.0, 0.1) for xi in x]\n",
"plot(x, y)\n",
"title('Radial basis function centered at 0')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 45,
"text": [
"<matplotlib.text.Text at 0xaef6ac8>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAEKCAYAAAAPVd6lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtYVHX+B/D3IKiA3AQUYcBZAQWv6OI93dEnhcfSX6tu\n0YU1dcksK8vd9Vc+Jfp4rawtSbP9mWauZm5udFE0rTHXVGx1LS95RwHRJEEBFWT4/P6YZZYRGG5z\nPef9ep555HDOnPOZYXjz9XO+Z0YjIgIiInJbHs4ugIiIWoZBTkTk5hjkRERujkFOROTmGORERG6O\nQU5E5OYY5G4oJycHHh4eqKqqAgCMGTMGH374YaPuq9PpsGvXrjrXPf7443j55ZdtVicAXLx4EX5+\nfmjOLNfJkyejffv2GDRokE1rakhTnk81ssfrhFqGQe4gOp0OPj4+8PPzQ1hYGFJTU3Hjxg2b7Hvr\n1q1ITU1t1LYajQYajabJ65orKioKJSUlTd7vnj17sHPnTly6dAn79++3aU01paen13rumvJ8Otvd\nf9QdoSWvE51Oh6+//trqNrt27UJcXBx8fX0xcuRIXLx4sVnHUhMGuYNoNBp88cUXKCkpwZEjR/Dj\njz9iwYIFzi6rFle5PuzChQvQ6XRo27ats0txC839uVVWVjr0eBqNxup9CwsLMWHCBCxcuBBFRUVI\nTEzEQw891KxjqQmD3Ak6duyI0aNH49ixY+bvLVmyBDExMfD390ePHj3w6aefmtdVVVXhj3/8I0JD\nQxEdHY0vv/zSYn96vR6rV68GAJw9exYjR45ESEgIQkND8dhjj+H69euNrq2wsBCjR4+Gv78/9Hq9\nxWjoueeeQ1RUFAICApCYmIh//vOf5nXZ2dlITExEQEAAwsLCMGvWLAC1R4xr165FdHQ0/P390aVL\nF2zYsKFWDatXr0ZaWhr27dsHPz8/pKenY+3atRg2bJjFdh4eHjh37hwA03/3n376adx///3w9/fH\noEGDzOsA4NixYxg1ahSCg4MRFhaGxYsXY/v27Vi8eDE2bdoEPz8/9O3bt9bzKSJYsGABdDodOnbs\niEmTJpn/J1X92NatW4fOnTsjNDQUixYtqve5vXXrFmbNmgWdTofAwEAMGzYMt2/fBgDs378fQ4YM\nQVBQEBISErB7927z/fR6PV555RXcc8898Pf3R1JSEn755RcAwPDhwwEAgYGB8PPzw4EDBwAA77//\nPrp374727dsjOTnZ4ufo4eGBFStWIDY2Ft26dQMAfPHFF0hISEBQUBCGDh2KH3/80bz94cOH0a9f\nP/j7+yMlJcVcc12svf5SU1Nx8eJFjB07Fn5+fnj99ddr3X/Lli3o2bMnJkyYgNatWyM9PR1HjhzB\nqVOn6j0mARByCJ1OJzt37hQRkdzcXOnVq5fMmzfPvH7z5s1SUFAgIiKbNm0SX19fuXz5soiIrFy5\nUuLi4iQvL0+uXbsmer1ePDw8xGg0ioiIXq+X1atXi4jImTNnZOfOnVJRUSFXr16V4cOHy8yZMy3q\n2LVrV501Tpo0Sfz8/GTPnj1SXl4uzz33nNxzzz3m9evXr5dr166J0WiUZcuWSVhYmJSXl4uIyKBB\ng2T9+vUiIlJWVib79+8XEZHz58+LRqMRo9EopaWl4u/vL6dOnRIRkcuXL8uxY8fqrGXt2rUWx16z\nZo3FsoiIRqORs2fPmmsPDg6WgwcPSmVlpTz66KOSkpIiIiI3btyQsLAweeONN6S8vFxKSkrkwIED\nIiKSnp4uqampFvut+XyuXr1aYmJi5Pz581JaWirjx483b1/92J544gm5ffu2HDlyRNq0aSMnTpyo\n8zE99dRTMmLECLl06ZIYjUbZt2+flJeXS15engQHB8u2bdtEROSrr76S4OBgKSwsFBGR3/zmNxIT\nEyOnT5+WW7duiV6vl//93/8VEZGcnBzz81vt008/lZiYGPnpp5/EaDTKggULZMiQIRbP2+jRo6Wo\nqEhu374thw4dkg4dOkh2drZUVVXJBx98IDqdTioqKqS8vFyioqLkL3/5i1RWVsrf//538fLykpdf\nfrnOx9iS15+IyLPPPitPPfWUxfd69eoln3zySb33IREGuYN07txZ2rVrJ35+fqLRaOSBBx6w+OW7\nW0JCgnz22WciIjJixAhZtWqVed2OHTssfnlrBs/d/vGPf0jfvn3Nyw0F+cMPP2xeLi0tlVatWkle\nXl6d2wcFBckPP/wgIiLDhw+XuXPnytWrVy22uTvIAwMD5ZNPPpGbN2/W+9hFagd3Q0H++OOPS1pa\nmnnd1q1bJS4uTkRENmzYIP369avzOHPnzpXHHnvM4ns1n8+RI0fKypUrzetOnjwpXl5eYjQazY8t\nPz/fvH7AgAHy0Ucf1TqO0WgUb29v8/NV05IlS2r9MUlKSpIPPvjAXM/ChQvN61asWCHJyckiYvn8\n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\n",
"text": [
"<matplotlib.figure.Figure at 0xa8b2940>"
]
}
],
"prompt_number": 45
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can make it wider, and move the center."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y = [rbf(xi, 2.0, 0.5) for xi in x]\n",
"plot(x, y)\n",
"title('Radial basis function centered at 2')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 46,
"text": [
"<matplotlib.text.Text at 0xb2ec1d0>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xa8ae320>"
]
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So now our interpolation method is pretty straightforward. We'll just use a weighted combination of radial basis functions centered at each point we have. In other words,\n",
"\n",
"$P(x) = \\sum_{i=1}^{n} { F(x, x_i)}$, where $F(x, x_i) = e^{-||x-x_i||/w}$, and $w$ is the width parameter."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def rbf_interpolate(x_new, x_values, y_values, width):\n",
" #interpolate using radial basis functions\n",
" return sum( rbf(x_new, x_i, width)*y_i for x_i, y_i in zip(x_values, y_values))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 47
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And a test,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = arange(-5, 5, 0.8)\n",
"y = sin(x)\n",
"scatter(x, y)\n",
"x_new = arange(-5, 5, 0.1)\n",
"y_interp = [rbf_interpolate(xi, x, y, 0.1) for xi in x_new]\n",
"plot(x_new, y_interp)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 48,
"text": [
"[<matplotlib.lines.Line2D at 0xb301908>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n9EREOsdET0Skc0z0REQ6x0RPRKRzTPRERDrHRE9EpHNM9EREOsdET0Skc0z0REQ6x0RPRKRzTPRE\nRDrHRE9EpHNM9EREOsdET0Skc0z0REQ6x0RPRKRzTPRERDrHRE9EpHNM9EREOsdET0Skc0z0REQ6\nx0RPRKRzTPRERDrHRE9EpHNOJ/rPPvsMHTt2hK+vL3bt2mX1vMjISHTu3BnJycno2bOns29HRERO\ncjrRd+rUCStXrsQtt9xi8zyDwQCj0Yjdu3cjOzvb2bfzeEajUesQXEbPvxvA38/T6f33s4fTiT4u\nLg6xsbF2nSuEcPZtdEPPHzY9/24Afz9Pp/ffzx4ur9EbDAb0798f3bt3x/vvv+/qtyMiolr8bB1M\nT0/H8ePHr3t+7ty5uOOOO+x6g+3bt6NNmzY4ceIE0tPTERcXhz59+jgXLREROU4olJqaKnbu3GnX\nuRkZGWLBggUWj0VHRwsA/OEPf/jDHwd+oqOj68y9Nnv09hJWavDl5eWorq5G48aNcf78eWzYsAGz\nZs2yeO6hQ4fUCIWIiGpxuka/cuVKREREICsrC4MHD8btt98OACgqKsLgwYMBAMePH0efPn3QpUsX\npKSkYMiQIRgwYIA6kRMRkV0Mwlp3nIiIdMGtZsa++eabiI+PR2JiIp5++mmtw3GJV199FT4+Pigt\nLdU6FFU9+eSTiI+PR1JSEkaMGIHTp09rHZIqMjMzERcXh5iYGMyfP1/rcFSVn5+PtLQ0dOzYEYmJ\nifjHP/6hdUiqq66uRnJyst2DRzxJWVkZRo4cifj4eCQkJCArK8v6yfbfdnWtzZs3i/79+wuTySSE\nEOL333/XOCL1/fbbb2LgwIEiMjJSnDx5UutwVLVhwwZRXV0thBDi6aefFk8//bTGESlXVVUloqOj\nRV5enjCZTCIpKUnk5ORoHZZqjh07Jnbv3i2EEOLs2bMiNjZWV7+fEEK8+uqr4t577xV33HGH1qGo\nbuzYsWLx4sVCCCEqKytFWVmZ1XPdpkf/zjvvYObMmfD39wcAtGjRQuOI1PfYY4/h5Zdf1joMl0hP\nT4ePj/w4paSkoKCgQOOIlMvOzkb79u0RGRkJf39/jBo1CqtWrdI6LNW0bt0aXbp0AQA0atQI8fHx\nKCoq0jgq9RQUFGDt2rV48MEHdTdp8/Tp0/juu+8wfvx4AICfnx9CQkKsnu82iT43Nxfffvstbrrp\nJqSmpuLHH3/UOiRVrVq1CuHh4ejcubPWobjckiVLMGjQIK3DUKywsBARERGXH4eHh6OwsFDDiFzn\n6NGj2L17N1JSUrQORTWPPvooXnnllcsdED3Jy8tDixYt8MADD6Br166YOHEiysvLrZ6vyvBKe1mb\ngDVnzhxUVVXh1KlTyMrKwg8//IC7774bR44cqc/wFLP1+7300kvYsGHD5ec8sYdhzwS6OXPmICAg\nAPfee299h6c6g8GgdQj14ty5cxg5ciTeeOMNNGrUSOtwVPH111+jZcuWSE5O1uUSCFVVVdi1axcW\nLlyIHj16YPr06Zg3bx5eeOEFyy+on2pS3W677TZhNBovP46OjhYlJSUaRqSevXv3ipYtW4rIyEgR\nGRkp/Pz8RLt27URxcbHWoalq6dKlonfv3qKiokLrUFSxY8cOMXDgwMuP586dK+bNm6dhROozmUxi\nwIAB4rXXXtM6FFXNnDlThIeHi8jISNG6dWsRFBQkxowZo3VYqjl27JiIjIy8/Pi7774TgwcPtnq+\n2yT6d999Vzz//PNCCCEOHDggIiIiNI7IdfR4M3bdunUiISFBnDhxQutQVFNZWSmioqJEXl6euHjx\nou5uxtbU1IgxY8aI6dOnax2KSxmNRjFkyBCtw1Bdnz59xIEDB4QQQsyaNUs89dRTVs+t19KNLePH\nj8f48ePRqVMnBAQE4MMPP9Q6JJfRY0ngkUcegclkQnp6OgCgV69eePvttzWOShk/Pz8sXLgQAwcO\nRHV1NSZMmID4+Hitw1LN9u3b8fHHH1/eLwIAXnrpJdx2220aR6Y+PX7n3nzzTdx3330wmUyIjo7G\n0qVLrZ7LCVNERDqnv9vRRER0DSZ6IiKdY6InItI5JnoiIp1joici0jkmeiIinWOiJyLSOSZ6IiKd\n+39WfjyJ5qQQJgAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xb301630>"
]
}
],
"prompt_number": 48
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we make each rbf function have a larger width, then the interpolation is more smooth,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = arange(-5, 5, 0.8)\n",
"y = sin(x)\n",
"scatter(x, y)\n",
"x_new = arange(-5, 5, 0.1)\n",
"y_interp = [rbf_interpolate(xi, x, y, 0.3) for xi in x_new]\n",
"plot(x_new, y_interp)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 49,
"text": [
"[<matplotlib.lines.Line2D at 0xb3166a0>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\niJY7K7rcAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0xb316940>"
]
}
],
"prompt_number": 49
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This method is far more robust under noise,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = arange(-5, 5, 0.5)\n",
"y = sin(x) + uniform(-.2, .2, x.shape)\n",
"scatter(x, y)\n",
"x_new = arange(-5, 5, 0.1)\n",
"y_interp = [rbf_interpolate(xi, x, y, 0.1) for xi in x_new]\n",
"plot(x_new, y_interp)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 50,
"text": [
"[<matplotlib.lines.Line2D at 0xb624908>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nrkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xb624c88>"
]
}
],
"prompt_number": 50
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Nearest-Neighbor Interpolation ##\n",
"\n",
"Again, this is a method not covered in the text, but it's easy to understand and practical. The idea here is that given a new point, $x$, we just approximate $f(x)$ with $f(x_i)$, for the $x_i$ which is closest to $x$. Simple."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def nn_interpolate(x_new, x_values, y_values):\n",
" #interpolate based on nearest-neighbor\n",
" closest_x_index = argmin(abs(x_values - x_new))\n",
" return y_values[closest_x_index]\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 51
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And an example"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = arange(-5, 5, 0.8)\n",
"y = sin(x)\n",
"scatter(x, y)\n",
"x_new = arange(-5, 5, 0.1)\n",
"y_interp = [nn_interpolate(xi, x, y) for xi in x_new]\n",
"plot(x_new, y_interp)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 52,
"text": [
"[<matplotlib.lines.Line2D at 0xb301cc0>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xb6130f0>"
]
}
],
"prompt_number": 52
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cool. This one is nice because it will work okay in noisy situations."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Cubic spline interpolation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Time to bite the bullet and grind this one out. When interpolating with a cubic spline, we set the following conditions:\n",
"\n",
"1. Each spline is a polynomial of degree 3 (duh)\n",
"2. Each spline agrees with the function values at two points.\n",
"3. At each point, the two splines which agree must have the same first and second derivatives\n",
"4. (natural) At the endpoints, the second derivatives are zero.\n",
"\n",
"This gives us enough unknowns to solve for all the coefficients in the splines.\n",
"\n",
"Derivation:\n",
"\n",
"Let $x_0 ... x_n$ be the points and $y_0 ... y_n$ be the function values. We have (n-1) splines, each with 4 parameters. Each spline is of the form:\n",
"\n",
"$S_j(x) = a_j + b_j(x-x_j) + c_j(x-x_j)^2 + d_j(x-x_j)^3$\n",
"\n",
"So obviously each $a_j = y_j$.\n",
"\n",
"Let's assume we know the slope of the spline $s_j'$ at each point. Also let $\\Delta x_j = x_{j+1} - x_{j}$.\n",
"\n",
"Given the slopes at each point, \n",
"\n",
"$S_j'(x_j) = s_j' = b_j$\n",
"\n",
"And furthermore, since $s_{j+1}' = S_j'(x_{j+1}) = S_{j+1}'(x_{j+1})$, \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$b_j + 2 c_j(\\Delta x) + 3 d_j(\\Delta x)^2 = b_{j+1}$\n",
"\n",
"And due to the continuity of second derivatives,\n",
"\n",
"$2 c_j + 6 d_j (\\Delta x) = 2 c_{j+1}$ (and by simplifiying), $c_j + 3 d_j (\\Delta x) = c_{j+1}$\n",
"\n",
"(Some magic happens)\n",
"\n",
"And a tridiagonal linear system emerges from the aether. $Ax = b$,\n",
"\n",
"where $x$ is the vector of derivatives at each point, which we wish to determine. $A$ is the $(n+1) \\times (n+1)$ tridiagonal matrix with elements given by \n",
"\n",
"$A_{0,0} = A_{n+1,n+1} = 1$\n",
"\n",
"$A_{i,i} = 2(\\Delta x_{i-1} + \\Delta x_i) = 2(x_{i+1} - x_{i-1})$\n",
"\n",
"$A_{i,i-1} = \\Delta x_{i-1} = (x_i - x_{i-1})$ \n",
"\n",
"$A_{i,i+1} = \\Delta x_i = (x_{i+1} - x_i)$ for $i=1...N$. All other elements of $A$ are zero.\n",
"\n",
"The vector $b$ is given by \n",
"\n",
"$b_0 = b_{n+1} = 0$\n",
"\n",
"$b_i = \\frac{3}{\\Delta x_i} (y_{i+1} - y_i) - \\frac{3}{\\Delta x_{i-1}}(y_i - y_{i-1})$ for $i=1...n$\n",
"\n",
"Which I think looks nicer written as \n",
"\n",
"$b_i = \\frac{3\\Delta y_i}{\\Delta x_i} - \\frac{3\\Delta y_{i-1}}{\\Delta x_{i-1}}$ for $i=1...n$\n",
"\n",
"\n",
"From this equation the coefficients for the splines can be derived. It's in the code below.\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class cubicpoly(object):\n",
" def __init__(self, x_j, x_jplus1, a, b, c, d):\n",
" #a,b,c,d - 0,1,2,3 degree coefficients\n",
" #x_j , x_j+1 are points\n",
" self.x_j = x_j\n",
" self.x_jplus1 = x_jplus1\n",
" self.a, self.b, self.c, self.d = a,b,c,d\n",
" \n",
" def apply(self, x):\n",
" return self.a + self.b*(x-self.x_j) + self.c*(x-self.x_j)**2 + self.d*(x-self.x_j)**3\n",
" \n",
" def __str__(self):\n",
" return 'a:' + str(self.a) + ' b:' + str(self.b) + ' c:' + str(self.c) + ' d:' + str(self.d)\n",
" \n",
"def eval_spline(spline, x):\n",
" #determine which interval to use...\n",
" for poly in spline:\n",
" if poly.x_j <= x <= poly.x_jplus1:\n",
" return poly.apply(x)\n",
" \n",
" #if it didn't fit, then predict with one of the endpoints...\n",
" if x < spline[0].x_j:\n",
" return spline[0].apply(x)\n",
" elif x > spline[-1].x_jplus1:\n",
" return spline[-1].apply(x)\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 53
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That should do it for evaluation. Let's build a random spline and see what it looks like."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"spline = []\n",
"for i in range(5):\n",
" spline.append( cubicpoly(i, i+1, randn(1), randn(1), randn(1), randn(1)))\n",
" \n",
"x = arange(-2, 2, 0.1)\n",
"y = [eval_spline(spline, xi) for xi in x]\n",
"plot(x,y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 54,
"text": [
"[<matplotlib.lines.Line2D at 0xbdb0a20>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0xb841dd8>"
]
}
],
"prompt_number": 54
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's pretty obvious that this spline disobeys our rules for interpolation (which is ok, it's random). Let's write the code to fit it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def fit_cubic_spline(x, y):\n",
" #x and y are vectors in this case.\n",
" #set up a system of equations\n",
" N = x.shape[0]-1\n",
" A = zeros((N+1,N+1))\n",
" b = zeros((N+1,))\n",
" #set the values of A. It's tridiagonal.\n",
" #first and last rows\n",
" A[0,0] = 1\n",
" A[N,N] = 1\n",
" #tridiagonal values\n",
" for i in range(1, N):\n",
" A[i,i] = 2*(-x[i-1]+x[i+1])\n",
" A[i,i-1] = x[i] - x[i-1]\n",
" A[i,i+1] = x[i+1] - x[i]\n",
" b[i] = (3.0/(x[i+1]-x[i]))*(y[i+1]-y[i]) - (3.0/(x[i]-x[i-1]))*(y[i]-y[i-1])\n",
" \n",
" \n",
" #solve the system of equations...\n",
" c = solve(A, b)\n",
"\n",
" #now construct the splines.\n",
" spline = []\n",
" for i in range(N):\n",
" a_i = y[i] #spline must agree with points!\n",
" b_i = (x[i+1]-x[i])**-1 * (y[i+1]-y[i]) - (x[i+1]-x[i])/3.0*(2*c[i]+c[i+1])\n",
" c_i = c[i]\n",
" d_i = (c[i+1] - c[i])/(3.0*(x[i+1]-x[i]))\n",
" spline.append(cubicpoly(x[i], x[i+1], a_i, b_i, c_i, d_i))\n",
" return spline\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 55
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = arange(-5,5,0.6)\n",
"y = sin(x)-0.5*cos(2*x)\n",
"scatter(x,y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 56,
"text": [
"<matplotlib.collections.PathCollection at 0xbea2518>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0xb84f9b0>"
]
}
],
"prompt_number": 56
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"s = fit_cubic_spline(x,y)\n",
"xnew = arange(-6,6,.1)\n",
"yh = [eval_spline(s, xi) for xi in xnew]\n",
"scatter(x,y)\n",
"plot(xnew,yh)\n",
"plot(xnew, sin(xnew)-.5*cos(2*xnew))\n",
"legend(['spline', 'actual'])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 57,
"text": [
"<matplotlib.legend.Legend at 0xbed35f8>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n58/jyJGLqKlNAmxvADYJqLDsjd3FH8FZ5Ixwl3AY6xorJIs6eGKhDw0Nxe3bt1v9+9KlSx97zuPx\n/je+21pcXBxsbGxw9+5dhIaGwtXVFUOGDGlz28jIyJafBQIBBALBU+ITeZkVGoK5p+8g+lImwoNd\nFNJnfkUJXv91KYTlf0DzdiCcdUOgq6OBnMpKSF68AYheAs5+gdrU2YiKOqKQQr/j+k486/Ki3PtR\ndmMcJmHn9T1YAcUU+uKSYjS5mQADggGNJqBgEHiVdSi5X4ILRRfw9pG3McVzCr4a9hWsjdT33gBt\nEQqFEAqFndupq18XnnnmGVZSUsIYY6y4uLjdoZtHRUZGslWrVrX5mhRRiJx4ffoWGxW5QiF9fbFn\nO9P4pAdzeONDdujEHSaR/PNanz6eDLwTDP2OM8x1Z5g2mL37+Tdyz5RbVMXwiSnLvl0q976U3bXc\n5uGbe5X1cu+rpKqEDdw8kOHNfgzOexnQxHi8NaxPH3cm+d8fRuH9Qrbg+ALW67tebOf1nXLPpMw6\nUju7fDI2IiICv//+OwDg999/x4QJE1ptU1tbi6qqKgBATU0Njh8/Di8vr652SRTszUETca58p8xv\nKffgwQOsWrUKCxZ8giMx0Qj8+m0sj/sGq31OI/+n7xExyvKx4aLVqxfDQP9V8HIvQPPnEGjdNcFG\n0RbsuyDfe9xG7jwA26bB6GfVS679qAIvx+bhm+/2n5RrP+fzz8Nvix8qr42C9+U4mNxZAB5PFy4u\n23Hy5KGWkQM7Ezt8G/otDk89jEXCRXg/+n2IJWK5ZlNpXf0UuXfvHhs5ciRzcXFhoaGhrKKigjHG\nWFFREQsPD2eMMZadnc18fHyYj48P8/DwYMuWLZPqU4koVpNYzLQX9GXr9yfIrM2qqirm5OTNdHUn\nM2hFMkwbwAzeGMXSc+4/cb+4uDi2cOFnbOnSZezu3bvsnQ17GG9hT7Y6KkZm2f7NdF4oW7h9l9za\nVzXT1v7IbN+bLLf2ozOjWc+VPVnAlBg2fjxjdXXNJ2VFoiefBK6oq2CC3wRs4u6JrK6xTm75lFVH\naqfSVFcq9Mpp/KplrM+7M2XW3q+//soMDccyaFczvBLG8NIEZmTq0KW2Vu2KY7yPLdmPR4/JLN9D\ncdcLGe8Tc3a/plbmbauqwrIKxvvEjCWkF8u87QPpB5jlyl7Me+wF9sorjDU0dG7/+sZ69uKuF9nY\n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\n",
"text": [
"<matplotlib.figure.Figure at 0xbddc400>"
]
}
],
"prompt_number": 57
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Solutions to systems of linear equations ##\n",
"\n",
"This will cover chapter 6 and maybe chapter 7. \n",
"\n",
"\n",
"### Gaussian Elimination ###\n",
"\n",
"The first algorithm produced in the text. Each row is used to eliminate one variable from the other rows. Implementation should be relatively straightforward:\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def gauss_elim(A):\n",
" #assume A is an augmented matrix ( [A | b])\n",
" for i in range(A.shape[0]): #for each row\n",
" for j in range(i+1, A.shape[0]): #for each following row\n",
" multiplier = A[j,i]/A[i,i]\n",
" A[j,:] = A[j,:] - multiplier*A[i,:]\n",
" return A\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 58
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"let's try it out."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[1, 3],[2,4]], float)\n",
"print gauss_elim(A)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 1. 3.]\n",
" [ 0. -2.]]\n"
]
}
],
"prompt_number": 59
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And a bigger matrix"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[1,2,4],[2,1,4],[3,4,2]], float)\n",
"print gauss_elim(A)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 1. 2. 4. ]\n",
" [ 0. -3. -4. ]\n",
" [ 0. 0. -7.33333333]]\n"
]
}
],
"prompt_number": 60
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To actually solve systems we'll need to backward substitute, so let's write some code to do that"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def back_sub(A):\n",
" #A must be an augmented matrix in row-echelon form\n",
" assert A.shape[0] == A.shape[1]-1, 'A should be square | augmented'\n",
" x = zeros(A.shape[0])\n",
" for i in reversed(range(A.shape[0])):\n",
" terms = sum( A[i,j]*x[j] for j in range(i+1,A.shape[0]) )\n",
" x[i] = (A[i,-1] - terms) / A[i,i]\n",
" return x"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 61
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some handy code for augmentation"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def augment(A, b):\n",
" return hstack((A, b.reshape((-1,1))))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 62
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[1,2,4],[2,1,4],[3,4,2]], float)\n",
"b = array([2,5,1])\n",
"A_aug = augment(A, b)\n",
"G = gauss_elim(A_aug)\n",
"x = back_sub(G)\n",
"print x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 1.63636364 -1.36363636 0.77272727]\n"
]
}
],
"prompt_number": 63
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And now if it worked, $Ax = b$ should hold."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print dot(A, x), b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 2. 5. 1.] [2 5 1]\n"
]
}
],
"prompt_number": 64
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cool."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = eye(3)\n",
"A_aug = augment(A, array([1,2,3]))\n",
"B = gauss_elim(A_aug)\n",
"x = back_sub(B)\n",
"print x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 1. 2. 3.]\n"
]
}
],
"prompt_number": 65
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can wrap these together for a matsolve function"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def matsolve(A, b):\n",
" A_aug = augment(A, b)\n",
" return back_sub(gauss_elim(A_aug))\n",
"\n",
"A = randn(20, 20)\n",
"b = arange(20)\n",
"x = matsolve(A, b) #solve the matrix\n",
"print dot(A, x) #if it worked, then this should equal b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.\n",
" 15. 16. 17. 18. 19.]\n"
]
}
],
"prompt_number": 66
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cool. Let's try the numerically unstable example in the text."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[.003, 59.14],[5.291, -6.130]])\n",
"b = array([59.17, 46.78])\n",
"print matsolve(A, b)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 10. 1.]\n"
]
}
],
"prompt_number": 67
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"No problems here. Still, let's examine pivoting strategies."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Partial Pivoting ### \n",
"\n",
"To prevent numerical problems, we can swap rows to prevent the denominator of our multiplier from becoming large. When we're going though each row, we'll just swap the current row with the one which has the largest norm component in the pivot column."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def gauss_elim_partial_pivot(A):\n",
" #assume A is an augmented matrix ( [A | b])\n",
" for i in range(A.shape[0]): #for each row\n",
" #pivoting - swap this row with another\n",
" row_ind = argmax(abs(A[i:,i]))\n",
" #swap\n",
" A[[row_ind+i, i],:] = A[[i,row_ind+i],:]\n",
" \n",
" for j in range(i+1, A.shape[0]): #for each following row\n",
" multiplier = A[j,i]/A[i,i]\n",
" A[j,:] = A[j,:] - multiplier*A[i,:]\n",
" return A"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 68
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[1, 3],[2,4]], float)\n",
"print gauss_elim_partial_pivot(A)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 2. 4.]\n",
" [ 0. 1.]]\n"
]
}
],
"prompt_number": 69
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's confirm that this works"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def matsolve(A, b):\n",
" A_aug = augment(A, b)\n",
" return back_sub(gauss_elim_partial_pivot(A_aug))\n",
"\n",
"A = randn(20, 20)\n",
"b = arange(20)\n",
"x = matsolve(A, b) #solve the matrix\n",
"print dot(A, x) #if it worked, then this should equal b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ -3.99680289e-15 1.00000000e+00 2.00000000e+00 3.00000000e+00\n",
" 4.00000000e+00 5.00000000e+00 6.00000000e+00 7.00000000e+00\n",
" 8.00000000e+00 9.00000000e+00 1.00000000e+01 1.10000000e+01\n",
" 1.20000000e+01 1.30000000e+01 1.40000000e+01 1.50000000e+01\n",
" 1.60000000e+01 1.70000000e+01 1.80000000e+01 1.90000000e+01]\n"
]
}
],
"prompt_number": 70
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Woah there, it looks like we've got a little bit of numerical error around 0, but for the most part these look good."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Scaled Partial Pivoting ###\n",
"\n",
"We can extend this even further to account for relative magnitudes of the rows. Just define a vector of *scale factors*, one for each row. The scale factor for a row is the infinity norm of the row (max of the norms of the components). "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def gauss_elim_partial_pivot_scaled(A, verbose=False):\n",
" #assume A is an augmented matrix ( [A | b])\n",
" \n",
" #compute scale factors\n",
" s = array([norm(Ai, inf) for Ai in A])\n",
" if verbose: print 'scale factors:', s\n",
" \n",
" for i in range(A.shape[0]): #for each row\n",
" #pivoting - swap this row with another\n",
" #now find the \"relative\" largest\n",
" \n",
" row_ind = argmax(abs(A[i:,i])/s[i:]) #find the row to swap the current with\n",
" if verbose: print 'swapping row', row_ind+i, 'and row', i\n",
" \n",
" if verbose: print 'before swap\\n:', A\n",
" #swap\n",
" A[[row_ind+i, i],:] = A[[i,row_ind+i],:]\n",
" s[[row_ind+i,i]] = s[[i,row_ind+i]] #also swap scale factors!\n",
" \n",
" if verbose: print 'after swap\\n:', A\n",
" #if verbose: print A\n",
" \n",
" for j in range(i+1, A.shape[0]): #for each following row\n",
" multiplier = A[j,i]/A[i,i]\n",
" A[j,:] = A[j,:] - multiplier*A[i,:]\n",
" if verbose: print 'row op:', 'row', j, '=', 'row', j, '-', multiplier, '*', 'row', i\n",
" \n",
" if verbose: print 'matrix after row ops:\\n', A\n",
" \n",
" return A"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 397
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def matsolve(A, b):\n",
" A_aug = augment(A, b)\n",
" return back_sub(gauss_elim_partial_pivot_scaled(A_aug))\n",
"\n",
"A = randn(20, 20)\n",
"b = arange(20)\n",
"x = matsolve(A, b) #solve the matrix\n",
"print dot(A, x) #if it worked, then this should equal b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ -3.55271368e-15 1.00000000e+00 2.00000000e+00 3.00000000e+00\n",
" 4.00000000e+00 5.00000000e+00 6.00000000e+00 7.00000000e+00\n",
" 8.00000000e+00 9.00000000e+00 1.00000000e+01 1.10000000e+01\n",
" 1.20000000e+01 1.30000000e+01 1.40000000e+01 1.50000000e+01\n",
" 1.60000000e+01 1.70000000e+01 1.80000000e+01 1.90000000e+01]\n"
]
}
],
"prompt_number": 72
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How about a more pathalogical case?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = randn(10, 10)\n",
"#set the diag to a very small number\n",
"A = A - diag(A) + diag(ones(10)*1e-15)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 301
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def matsolve(A, b):\n",
" A_aug = augment(A, b)\n",
" return back_sub(gauss_elim_partial_pivot_scaled(A_aug))\n",
"\n",
"b = arange(10)\n",
"x = matsolve(A, b) #solve the matrix\n",
"print dot(A, x) #if it worked, then this should equal b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 7.10542736e-15 1.00000000e+00 2.00000000e+00 3.00000000e+00\n",
" 4.00000000e+00 5.00000000e+00 6.00000000e+00 7.00000000e+00\n",
" 8.00000000e+00 9.00000000e+00]\n"
]
}
],
"prompt_number": 302
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nice. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Iterative Methods ##\n",
"\n",
"##Jacobi##\n",
"\n",
"To find a solution to $Ax = b$, let $A = D + R$, where $D$ is diagonal and $R$ has no diagonal elements. Thus\n",
"\n",
"$(D+R)x = b$\n",
"\n",
"$Dx = b - Rx$\n",
"\n",
"$x = D^{-1}(b - Rx)$, which is easily found.\n",
"\n",
"To put in normal form, let $T = -D^{-1}R$ and $c = D^{-1}b$, then\n",
"\n",
"$x^{(n)} = Tx^{(n-1)} + c$.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def jacobi_solve(A, b, max_iter=100, tol=1e-4):\n",
" assert A.shape[0] == A.shape[1], 'A must be square!'\n",
" D,R = zeros(A.shape), zeros(A.shape)\n",
" for i in range(A.shape[0]):\n",
" for j in range(A.shape[1]):\n",
" if i == j:\n",
" D[i,j] = A[i,j]\n",
" else:\n",
" R[i,j] = A[i,j]\n",
" #ok, now iterate\n",
" x_vals = [0.0*b]\n",
" D_inv = inv(D)\n",
" T = -dot(D_inv, R)\n",
" C = dot(D_inv, b)\n",
" for i in range(max_iter):\n",
" #recurrence relation\n",
" x_vals.append( dot(T, x_vals[-1]) + C)\n",
" if norm(x_vals[-1]-x_vals[-2], inf)/norm(x_vals[-1], inf) < tol:\n",
" #done\n",
" return x_vals[-1]\n",
" print x_vals[-1]\n",
" return x_vals[-1]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 75
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[16,3],\n",
" [7,-11]])\n",
"b = array([11,13])\n",
"x = jacobi_solve(A, b)\n",
"print 'x =',x\n",
"print 'Now, Ax should equal b.'\n",
"print dot(A,x), b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 0.6875 -1.18181818]\n",
"[ 0.90909091 -0.74431818]\n",
"[ 0.82705966 -0.60330579]\n",
"[ 0.80061983 -0.65550749]\n",
"[ 0.81040765 -0.67233283]\n",
"[ 0.81356241 -0.66610422]\n",
"[ 0.81239454 -0.66409665]\n",
"[ 0.81201812 -0.66483984]\n",
"[ 0.81215747 -0.66507938]\n",
"[ 0.81220238 -0.6649907 ]\n",
"x = [ 0.81218576 -0.66496212]\n",
"Now, Ax should equal b.\n",
"[ 11.00008574 12.99988361] [11 13]\n"
]
}
],
"prompt_number": 76
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 76
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"###Gauss-Sidel###\n",
"\n",
"In Gauss-Sidel, we just update our previous approximation as we go. In other words, we don't do batch updates like Jacobi. \n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def g_s_solve(A, b, max_iter=100, tol=1e-4, verbose=False):\n",
" assert A.shape[0] == A.shape[1], 'A must be square!'\n",
" D = diag(diag(A)) #matrix of diagonal elements\n",
" R = A - D #remainder\n",
" \n",
" if verbose: print 'A decomposed into D + R\\n', D, '\\n', R\n",
" \n",
" #ok, now iterate\n",
" x_vals = [0.0*b]\n",
" D_inv = inv(D) #inverse of a diagonal is 1 / the diagonal elements!\n",
" T = -dot(D_inv, R)\n",
" C = dot(D_inv, b)\n",
" \n",
" if verbose: print 'Linear iteration matrix T:\\n', T\n",
" if verbose: print 'Linear iteration vector C:\\n', C\n",
" \n",
" for i in range(max_iter):\n",
" #recurrence relation\n",
" if verbose: print 'x at iteration', i+1, x_vals[-1]\n",
" x_new = x_vals[-1]\n",
" for i in range(x_new.shape[0]):\n",
" if verbose: print 'updating x[', i, '], old:', x_new[i]\n",
" if verbose: print x_new, 'dot', T[i,:], '+', C[i], '=', dot(x_new, T[i,:])+C[i]\n",
" x_new[i] = (dot(T, x_new) + C)[i] #an efficient implementation wouldn't redo this work\n",
" if verbose: print 'x[', i, '] =', x_new[i]\n",
" x_vals.append( x_new )\n",
" \n",
" #convergence check\n",
" #if norm(x_vals[-1]-x_vals[-2], inf)/norm(x_vals[-1], inf) < tol:\n",
" #done\n",
" # return x_vals[-1]\n",
" #print x_vals[-1]\n",
" return x_vals[-1]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 322
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[16,3],\n",
" [7,-11]])\n",
"b = array([11,13])\n",
"x = g_s_solve(A, b)\n",
"print 'x =',x\n",
"print 'Now, Ax should equal b.'\n",
"print dot(A,x), b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"x = [ 0.6875 -0.74431818]\n",
"Now, Ax should equal b.\n",
"[ 8.76704545 13. ] [11 13]\n"
]
}
],
"prompt_number": 78
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##LU decomposition##\n",
"\n",
"In LU decomposition, we decompose a square matrix $A$ into the product of a unit-lower matrix and an upper triangular matrix. The intuition is that each step of Gaussian Elimination is just a linear operation, and as such can be represented as a matrix. Composing these operations results in an upper triangular matrix, $U$. I.e.\n",
"\n",
"\n",
"$E_1 E_2 ... E_n A$ = $U$\n",
"\n",
"Where $E_i$ is the $i$th row operation. Thus,\n",
"\n",
"$A = (E_n)^{-1} ... (E_2)^{-1} (E_1)^{-1} U$\n",
"\n",
"And since the inverse of a unit lower triangular matrix is just the negative of the off diagonal elements, and the multiplication of unit lower triangular matricies is lower triangular, we have:\n",
"\n",
"$A = LU$\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def lu_decomp(A):\n",
" #very similar to gaussian elimination, but we save the row operations.\n",
" U = copy(A)\n",
" L = eye(A.shape[0])\n",
" \n",
" for i in range(A.shape[0]): #for each row\n",
" for j in range(i+1, A.shape[0]): #for each following row\n",
" multiplier = U[j,i]/U[i,i]\n",
" U[j,:] = U[j,:] - multiplier*U[i,:]\n",
" L[j,i] = multiplier\n",
" return L,U\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 156
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[1, 3],[2,4]], float)\n",
"L,U = lu_decomp(A)\n",
"print L\n",
"print U\n",
"print 'LU should equal A\\n', dot(L,U),'\\n', A"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 1. 0.]\n",
" [ 2. 1.]]\n",
"[[ 1. 3.]\n",
" [ 0. -2.]]\n",
"LU should equal A\n",
"[[ 1. 3.]\n",
" [ 2. 4.]] \n",
"[[ 1. 3.]\n",
" [ 2. 4.]]\n"
]
}
],
"prompt_number": 158
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = randn(5,5)\n",
"L,U = lu_decomp(A)\n",
"print 'LU should equal A\\n', dot(L,U)- A"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"LU should equal A\n",
"[[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00]\n",
" [ 0.00000000e+00 0.00000000e+00 -5.55111512e-17 0.00000000e+00\n",
" 0.00000000e+00]\n",
" [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.44089210e-16\n",
" 3.33066907e-16]\n",
" [ 0.00000000e+00 0.00000000e+00 1.11022302e-16 -4.44089210e-16\n",
" 2.22044605e-16]\n",
" [ 0.00000000e+00 0.00000000e+00 5.55111512e-17 4.44089210e-16\n",
" -1.56125113e-16]]\n"
]
}
],
"prompt_number": 160
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##LDL' Decomposition##\n",
"\n",
"This is a decomposition method for symmetric positive-definite matricies. It decomposes\n",
"\n",
"$A = L D L^{T}$,\n",
"\n",
"with $L$ lower triangular and $D$ diagonal. The method is similar to GE, using row operations."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def ldl_decomp(A):\n",
" #A should be symmetric positivedefinite\n",
" assert array_equal(A, A.T), 'A not symmetric'\n",
" L = eye(A.shape[0])\n",
" U = copy(A)\n",
" for i in range(A.shape[0]): #for each row\n",
" for j in range(i+1, A.shape[0]): #for each following row\n",
" multiplier = U[j,i]/U[i,i]\n",
" U[j,:] = U[j,:] - multiplier*U[i,:]\n",
" L[j,i] = multiplier\n",
" \n",
" #turn U into unit upper triangular\n",
" d = diag(U).reshape((-1,1))\n",
" U = U / d\n",
" D = diag(d.ravel())\n",
" \n",
" assert array_equal(U, L.T), 'A not positive definite!' + array_str(U) + '\\n' + array_str(L)\n",
" return L, D "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 200
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[3,2,1],[2,4,5],[1,5,6]],float)\n",
"print A\n",
"L,D = ldl_decomp(A)\n",
"print 'L:\\n', L\n",
"print 'D:\\n', D\n",
"print 'LDL.T should equal A\\n', dot(dot(L,D), L.T),'\\n', A"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 3. 2. 1.]\n",
" [ 2. 4. 5.]\n",
" [ 1. 5. 6.]]\n",
"L:\n",
"[[ 1. 0. 0. ]\n",
" [ 0.66666667 1. 0. ]\n",
" [ 0.33333333 1.625 1. ]]\n",
"D:\n",
"[[ 3. 0. 0. ]\n",
" [ 0. 2.66666667 0. ]\n",
" [ 0. 0. -1.375 ]]\n",
"LDL.T should equal A\n",
"[[ 3. 2. 1.]\n",
" [ 2. 4. 5.]\n",
" [ 1. 5. 6.]] \n",
"[[ 3. 2. 1.]\n",
" [ 2. 4. 5.]\n",
" [ 1. 5. 6.]]\n"
]
}
],
"prompt_number": 201
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Cholesky Decomposition##\n",
"\n",
"A trivial change of the $LDL^T$ method gives \n",
"\n",
"$L D L^{T}$ = $L D^{1/2} D^{1/2} L^{T} = L_{*} L_{*}^{T}$ for $L_* = L D^{1/2}$\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def cholesky_decompose(A, verbose=False):\n",
" #A should be symmetric positive definite\n",
" assert array_equal(A, A.T), 'A not symmetric'\n",
" \n",
" L = eye(A.shape[0])\n",
" U = copy(A)\n",
" for i in range(A.shape[0]): #for each row\n",
" if verbose: print 'current U:\\n', U\n",
" if verbose: print 'current L:\\n', L\n",
" \n",
" for j in range(i+1, A.shape[0]): #for each following row\n",
" multiplier = U[j,i]/U[i,i]\n",
" U[j,:] = U[j,:] - multiplier*U[i,:]\n",
" L[j,i] = multiplier\n",
" if verbose: print 'row op:', 'U row', j, '=', 'U row', j, '-', multiplier, '* U row', i\n",
" if verbose: print 'setting L[', j, ',', i, '] =', multiplier\n",
" \n",
" #turn U into unit upper triangular\n",
" d = diag(U).reshape((-1,1))\n",
" U = U / d\n",
" D = diag(d.ravel())\n",
" \n",
" if verbose: print 'matrix D:\\n', D\n",
" \n",
" assert array_equal(U, L.T), 'A not positive definite!' + array_str(U) + '\\n' + array_str(L)\n",
" #we're doing cholesky now\n",
" L = dot(L, D**0.5)\n",
" \n",
" if verbose: print '(L D**0.5) =\\n', L\n",
" return L"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 304
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[7,2,1],[2,6,5],[1,5,6]],float)\n",
"L = cholesky_decompose(A)\n",
"print 'L:\\n', L\n",
"print 'LL.T should equal A\\n', dot(L, L.T),'\\n', A"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"L:\n",
"[[ 2.64575131 0. 0. ]\n",
" [ 0.75592895 2.32992949 0. ]\n",
" [ 0.37796447 2.02335982 1.32783956]]\n",
"LL.T should equal A\n",
"[[ 7. 2. 1.]\n",
" [ 2. 6. 5.]\n",
" [ 1. 5. 6.]] \n",
"[[ 7. 2. 1.]\n",
" [ 2. 6. 5.]\n",
" [ 1. 5. 6.]]\n"
]
}
],
"prompt_number": 206
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Power method for the largest eigenvector/eigenvalue##\n",
"\n",
"We have $Ax = \\lambda x$\n",
"\n",
"So, $ AAx = A \\lambda x = \\lambda^2 x$\n",
"\n",
"And generally $A^n x = \\lambda^n x$ for an eigenvector $x$ and value $\\lambda$\n",
"\n",
"If we assume that A has a largest eigenvalue, $\\lambda_0$, then by eigendecomposition,\n",
"\n",
"$A^n x = \\lambda_0^n x + \\lambda_1^n x + ...$\n",
"\n",
"Since $\\lambda_0$ is largest, it dominates the right hand side for an arbitrary $x$.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def power_method(A, max_iter=100):\n",
" x = ones(A.shape[0])\n",
" x_norm = inf \n",
" lambda_est = inf\n",
" \n",
" for i in range(max_iter):\n",
" x_next = dot(A,x)\n",
" x_next_norm = norm(x_next)\n",
" lambda_est_next = x_next_norm\n",
" x_next /= x_next_norm\n",
" if abs(lambda_est_next - lambda_est) < 1e-5:\n",
" return x_next, lambda_est_next\n",
" else:\n",
" x = x_next\n",
" x_norm = x_next_norm\n",
" lambda_est = lambda_est_next\n",
"\n",
" return x_next, lambda_est_next"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 216
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = array([[7,2,1],[2,6,5],[1,5,6]],float)\n",
"print power_method(A)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(array([ 0.39899057, 0.66640463, 0.6298503 ]), 11.922709493687325)\n"
]
}
],
"prompt_number": 217
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"eigv, eigx = eig(A)\n",
"print eigx[:,0], eigv[0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 0.39873773 0.66645864 0.62995326] 11.9227107582\n"
]
}
],
"prompt_number": 219
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Symmetric power method##\n",
"\n",
"Not yet implemented."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##QR Method##"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not yet implemented.\n"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Solving a linear system with Newton's method"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"Newton's method (see above) is a way to find roots of a function. By applying it in a clever way, however, we can get an iterative method for solving linear systems.\n",
"\n",
"Consider the system $Ax = b$. For an iterative method, we'd like **the error**, $||Ax - b||^2$ to be lower after each iteration. In other words, we want to find a point of zero error, a zero of the error function. Since such a point may not exist, we'd like to get as close as possible, or find a minimum of the error function. A minimum of the error function occurs where the derivative is zero. Thus we'll use newton's method on the derivative.\n",
"\n",
"Recall that Newton's method approximated the function with it's first order polynomial expansion, and then solved that:\n",
"\n",
"$f(x) \\approx f(x_0) + f'(x_0)(x-x_0)$\n",
"\n",
"$-\\frac{f(x_0)}{f'(x_0)} + x_0 = x$\n",
"\n",
"So in our case the function we're approximating is the derivative of the error, which is given by:\n",
"\n",
"$f'(x) = \\frac{d}{dx} (Ax-b)^{T} (Ax-b)$\n",
"\n",
"$f'(x) = \\frac{d}{dx} (x^{T}A^{T}Ax - x^{T}A^{T}b - b^{T}Ax + b^{T}b)$\n",
"\n",
"$f'(x) = 2A^{T}Ax - 2A^{T}b$\n",
"\n",
"And we're going to need the derivative of this function with respect to $x$, so\n",
"\n",
"$f''(x) = A^{T}A$\n",
"\n",
"And now we can construct the update:\n",
"\n",
"$x^{(n)} = x^{(n-1)} - \\frac{f'(x^{(n-1)})}{f''(x^{(n-1)})}$\n",
"\n",
"Or\n",
"\n",
"$x^{(n)} = x^{(n-1)} - (A^{T}A)^{-1} (A^{T}Ax^{(n-1)} -A^{T}b)$\n",
"\n",
"Simplifying,\n",
"\n",
"\n",
"$x^{(n)} = (A^{T}A)^{-1}A^{T}b$\n",
"\n",
"Interestingly, this has no dependence on the previous value of $x$, so it's a closed-form solution.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def newton_solve(A,b):\n",
" \"\"\"Closed-form solution from doing newton's method on a linear system\"\"\"\n",
" return dot(inv(dot(A.T,A)), dot(A.T,b))\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 136
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"A = randn(8,8)\n",
"b = arange(8)\n",
"x = newton_solve(A,b)\n",
"print 'Ax =', around(dot(A,x),5), '\\nb = ', b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Ax = [ 0. 1. 2. 3. 4. 5. 6. 7.] \n",
"b = [0 1 2 3 4 5 6 7]\n"
]
}
],
"prompt_number": 142
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you have a stats or machine learning background, you'll recognize this as the pseudoinverse of A, and the problem is linear least squares. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Numerical Differentiation ##\n",
"\n",
"Given a function $f$, we wish to approximate $f'$ and $\\int f $ numerically.\n",
"\n",
"The definition of each gives an idea for how an approximation can be made. Consider $f'$.\n",
"\n",
"$f'(x) = \\lim_{h \\to 0} \\frac{ f(x+h)-f(x) } {h}$\n",
"\n",
"So simply approximate $f'(x)$ by $g(x,h)$, where \n",
"\n",
"$g(x,h) = \\frac{ f(x+h)- f(x)}{h}$\n",
"\n",
"Which will be more accurate for smaller values of $h$, until roundoff errors start to kick in."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_prime = lambda f, x, h: (f(x+h)-f(x))/h\n",
"\n",
"xs = arange(-5, 5, .1)\n",
"plot(xs, [f_prime(sin, xi, 0.1) for xi in xs])\n",
"plot(xs, cos(xs))\n",
"ylim([-1.5, 1.5])\n",
"legend(['Approximate derivative', 'actual derivative'])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEACAYAAAC9Gb03AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4TOf///HnZLEmSBAiCSFErBH70hAl1thau4qIvahW\nF/1UF1pUW0pbRWyx77VvRTWoIna1ryGSUMSSSGS9f3/M1/waa2Q7M5P347rmusycM+e8Tkzeuec+\n9zm3TimlEEIIYbYstA4ghBAie0mhF0IIMyeFXgghzJwUeiGEMHNS6IUQwsxJoRdCCDOX6UIfGBhI\niRIlqFat2nOXh4SEULhwYby8vPDy8mLcuHGZ3aUQQojXYJXZDfTt25fhw4fj7+//wnWaNGnChg0b\nMrsrIYQQGZDpFr23tzd2dnYvXUeuyRJCCO1kex+9Tqfj77//xtPTkzZt2nDmzJns3qUQQoj/yHTX\nzavUrFmT8PBwChQowNatW+nYsSMXLlzI7t0KIYR4QmWBq1evqqpVq6ZrXVdXV3X37t1nXndzc1OA\nPOQhD3nI4zUebm5ur6y72d51c+vWLUMffWhoKEop7O3tn1nv8uXLKKXM9vHVV19pnkGOTY5Pjs/8\nHpcvX35lHc50102PHj3YvXs3d+7cwcXFhbFjx5KUlATAoEGDWL16NTNmzMDKyooCBQqwfPnyzO5S\nCCHEa8h0oV+2bNlLlw8dOpShQ4dmdjdCCCEySK6MzSE+Pj5aR8g25nxsIMdn6sz9+NJDp5RSWocA\n/TBMI4kihBAmIz21M9uHVwqRE+zt7bl3757WMYTINnZ2dkRHR2fovdKiF2ZBPj/C3L3oM56ez770\n0QshhJmTQi+EEGZOCr0QQpg5KfRCCIMhQ4aYzJwRPj4+zJ07N8Pvt7W1JSwsLOsC/Z+9e/fi4eGR\n5dvNDBl1I0QO8vHx4eTJk9y8eZM8efJoHecZM2bMyLZtW1hYcOnSJcqVK5cl29PpdOh0ugy/PyYm\nJktyPH1c3t7enDt3Lku2nVWkRS9EDgkLCyM0NBQHB4dsnYgnJSUl27adWcYwMio5OTnLt2kMx/Uy\nUuiFyCELFy6kefPm9O7dmwULFqRZFhAQwODBg2nRogWFChXCx8eH69evG5ZbWFjwyy+/4ObmRvHi\nxfnkk08MxWX+/Pk0atSIkSNHUqxYMcaOHcvDhw/x9/fHwcEBV1dXxo8fj1KK6OhoXFxc2LRpEwCx\nsbGUL1+exYsXG3J88cUXgH4aUGdnZ3744QccHBwoVaoU69atY8uWLbi7u1O0aFEmTpxoyBgaGkqD\nBg2ws7OjVKlSDB8+3HDfq8aNGwPg6emJra0tq1atAmDTpk3UqFEDOzs7GjVqxD///PPCn9+OHTvw\n8PCgSJEiDB8+3HBTryfmzZtH5cqVsbe3p1WrVs/8/KZPn06FChWoWLGi4bUrV65w8OBBHB0d02xr\n7dq1eHp6Zui4QkJCcHFxAeC7776jS5cuaY5jxIgRjBgxAoAHDx7Qr18/SpUqhbOzM1988QWpqakv\n/BlkmDISRhRFmCBT+Py4ubmpxYsXqwsXLihra2t169Ytw7I+ffooW1tbtXfvXpWQkKBGjBih3njj\nDcNynU6n3nzzTXXv3j11/fp15e7urubMmaOUUio4OFhZWVmpadOmqZSUFBUfH6969+6tOnbsqGJj\nY1VYWJhyd3dXc+fOVUoptX37dlWyZEn177//qv79+6suXboY9hMQEKC++OILpZRSf/75p7KyslLf\nfPONSk5OVrNnz1ZFixZVPXv2VLGxser06dMqf/78KiwsTCml1JEjR9TBgwdVSkqKCgsLU5UqVVJT\np05NcwyXL182PD969KhycHBQoaGhKjU1VS1YsEC5urqqhISEZ352t2/fVra2tuq3335TycnJasqU\nKcrKyspwTOvWrVPly5dX586dUykpKWrcuHGqYcOGafbdokULde/ePfX48eNn8ri5uakdO3YY1u/c\nubP67rvvMnRcf/75p3J2dlZKKRUWFqYKFCigYmJilFJKJScnK0dHR3Xw4EGllFIdO3ZUgwcPVnFx\ncerff/9VdevWVUFBQc/59Lz4M56ez77R/HaYwi+qMF7p+rCTNY+M2Lt3r8qXL596+PChUkopT09P\nNWXKFMPyPn36qB49ehiex8bGKktLS3Xjxg2llL6Y/P7774bl06dPV82aNVNK6Qt96dKlDcuSk5NV\nnjx51NmzZw2vBQUFKR8fH8Pz4cOHq6pVqypnZ2cVHR1teD0gIEB9/vnnSil9wcqfP79KTU1VSin1\n8OFDpdPpVGhoqGH9WrVqqXXr1j33mKdMmaI6depkeP50QRw8eLDhj8oTFStWVLt3735mWwsWLFAN\nGjRI85qzs7Oh0Ldq1crwb6WUSklJUQUKFFDXr1837PvPP/9M8/7/5vn8889VYGCg4TgLFixoeO/r\nHtd/C71SSr3xxhtq4cKFSin9H9kn94+/efOmyps3r4qPjzesu3TpUtW0adPn7jczhV66bkSukVWl\nPiMWLFhAixYtsLW1BaBLly5pum90Oh3Ozs6G5wULFsTe3p7IyEjDa0+6AwBKly79wmV37twhKSmJ\nMmXKpFk/IiLC8HzAgAGcPn2agICAl875XLRoUcMJz/z58wNQokQJw/L8+fPz6NEjAC5cuICfnx+O\njo4ULlyY0aNHc/fu3Rdu+9q1a0yePBk7OzvD48aNG0RFRT2zbmRkZJqfz9PHfO3aNUaMGGHYTtGi\nRQHSHPN/139ajx49WLNmDYmJiaxZs4ZatWoZ1n/d43paz549DXf5Xbp0Kb169TJkTkpKwtHR0ZB7\n8ODB3L59O93bTi8p9EJks/j4eFauXMmuXbtwdHTE0dGRyZMnc+LECU6ePAnoT+aFh4cb3hMbG0t0\ndDSlSpUyvPbfPufr16/j5ORkeP7f0SfFihXD2to6zdDB69evGwplSkoKAwcOxN/fn19//fWZiSsy\nOpJlyJAhVK5cmUuXLvHgwQPGjx//0v7m0qVLM3r0aO7du2d4xMbG0q1bt2fWLVWqVJqfz9M/r9Kl\nSzNr1qw023r06BH169dP13FVrlyZMmXKsHXrVpYuXUrPnj0zfFxP69y5MyEhIURERLBu3TrDtl1c\nXMibNy937941ZH7w4MFLz1NklBR6IbLZunXrsLKy4uzZs5w4cYITJ05w9uxZvL29WbhwoWG9LVu2\nsG/fPhITE/niiy9o0KBBmmI+adIk7t+/T3h4OD///PNzCyKApaUlXbt2ZfTo0cTGxnLt2jWmTJnC\nO++8A8CECROwtLQkODiYjz/+GH9/f0PhUk+d4HwdsbGx2NraUqBAAc6dO/fMUM0SJUqk+aMyYMAA\nZs6caZh57tGjR2zevJnY2Nhntt22bVtOnz7N2rVrSU5O5ueff+bmzZuG5YMHD2bChAmcOXMG0J/k\nfHLCN7169uzJ1KlT2bt3b5oTqK97XE8rXrw4Pj4+BAQEUK5cOcPJYEdHR1q0aMHIkSOJiYkhNTWV\ny5cvs2fPntfKnS6v7NzJIUYURZggY/78tGrVSn300UfPvL5y5Url6OiokpOTVUBAgBo8eLDy9fVV\nNjY2qkmTJoaTnErp+4F/+eUXVa5cOVW0aFH10UcfGfrO58+fr7y9vdNs+969e+qdd95RxYsXVy4u\nLuqbb75Rqamp6vDhw8rOzs7Qp5ySkqIaNWqkJkyYoJR69mSsi4uLYZtJSUnKwsJCXbt2zfDaG2+8\noZYsWaKUUmrPnj3Kw8ND2djYKG9vb/Xll1+myTVz5kzl6OioihQpolatWqWUUmrbtm2qTp06qkiR\nIsrR0VF17drVcOLyadu2bVPu7u6qcOHCatiwYcrHxydNv/yiRYtUtWrVVKFChZSLi4vq16+fYZmF\nhUWafvTnvXb9+nVlYWGh/Pz80qz3uscVEhKS5uf2JJtOp1OTJk1K8/qDBw/UkCFDlLOzsypcuLDy\n8vJSK1aseO7xv+gznp7Pvty9UpgFU//89O3bF2dnZ7755pvnLs/qi42E6ZG7Vwph4kz5j5QwflLo\nhTACr7qcPzOX+gshXTfCLMjnR5g76boRQgjxQlLohRDCzEmhF0IIMyeFXgghzJwUeiGEMHNS6IXI\nRZ7cgz09xowZQ+/evTO8rzZt2rBo0aIMv/9lsmsaQHMlhV4II+bq6squXbs02Xdmx+5v2bIlU38o\nnnje3LAxMTG4urpmetu5RaYLfWBgICVKlKBatWovXOe9996jQoUKeHp6cuzYsczuUohcwxSvD1CZ\nuDHa88jFYpmX6ULft29ftm3b9sLlW7Zs4dKlS1y8eJFZs2YxZMiQzO5SCJMzceJEypcvT6FChahS\npQrr1q1Ls3z27NlUrlzZsPzYsWP07t2b69ev065dO2xtbZk0aVKaaeqe+G+r/2XT3r3K1atXadKk\nCYUKFaJFixbcuXMnzfIDBw7QsGFD7OzsqFGjBrt37zYs8/Hx4fPPP6dRo0bY2Nhw5coVQ0s8ISGB\nIkWKcPr0acP6t2/fpkCBAty5c4d79+7h5+eHg4MD9vb2tGvXznAf+dGjR7N3716GDRuGra0t7733\nHpD+aQBTU1MNP/tixYrRrVs37t27l66fh1l55W3P0uHq1auqatWqz102aNAgtXz5csPzihUrqps3\nbz6zXhZFEbmUsX9+Vq1apaKiopRSSq1YsUIVLFjQ8HuwcuVK5eTkpA4fPqyUUurSpUuGO0S6urqq\nP/74w7Cdp2cvenqd15327r/q16+vPvzwQ5WYmKj27NmjbG1tVe/evZVSSt24cUMVLVpUbd26VSml\n1I4dO1TRokXVnTt3lFJKNWnSRJUpU0adOXNGpaSkqKSkpDR3lwwMDFSjR4827GvatGmqdevWSiml\n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\nT2WSj4+POnLkSLrWHTNmjJo0adJzl7m5uSlAHvKQhzzk8RoPNze3V9bel7bo00u9oA8+Li6OlJQU\nbG1tefToEdu3b+err7567rqXLl3KiihCCCGekuE++rVr1+Li4sKBAwdo27YtrVu3BiAyMpK2bdsC\ncPPmTby9valRowb16tXDz8+PFi1aZE1yIYQQ6aJTL2qOCyGEMAtGdWXsL7/8QqVKlahatSqjRo3S\nOk62mDx5MhYWFkRHR2sdJUt9/PHHVKpUCU9PT9566y0ePHigdaQssW3bNjw8PKhQoQLfffed1nGy\nVHh4OE2bNqVKlSpUrVqVn3/+WetIWS4lJQUvL690Dx4xJffv36dz585UqlSJypUrc+DAgRevnP7T\nrtlr165dqnnz5ioxMVEppdS///6rcaKsd/36ddWyZUvl6uqq7t69q3WcLLV9+3aVkpKilFJq1KhR\natSoURonyrzk5GTl5uamrl69qhITE5Wnp6c6c+aM1rGyTFRUlDp27JhSSqmYmBjl7u5uVsenlFKT\nJ09WPXv2VO3atdM6Spbz9/dXc+fOVUoplZSUpO7fv//CdY2mRT9jxgz+97//YW1tDUDx4sU1TpT1\nRo4cyffff691jGzh6+uLhYX+41SvXj1u3LihcaLMCw0NpXz58ri6umJtbU337t1Zv3691rGyTMmS\nJalRowYANjY2VKpUicjISI1TZZ0bN26wZcsW+vfvb3YXbT548IC9e/cSGBgIgJWVFYULF37h+kZT\n6C9evMiePXuoX78+Pj4+HD58WOtIWWr9+vU4OztTvXp1raNku3nz5tGmTRutY2RaREQELi4uhufO\nzs5ERERomCj7hIWFcezYMerVq6d1lCzzwQcf8MMPPxgaIObk6tWrFC9enL59+1KzZk0GDBhAXFzc\nC9fPkuGV6fWiC7DGjx9PcnIy9+7d48CBAxw6dIiuXbty5cqVnIyXaS87vm+//Zbt27cbXjPFFkZ6\nLqAbP348efLkoWfPnjkdL8vpdDqtI+SI2NhYOnfuzE8//YSNjY3WcbLEpk2bcHBwwMvLyyxvgZCc\nnMzRo0eZNm0aderU4f3332fixIl8/fXXz39DzvQmvVqrVq1USEiI4bmbm5u6c+eOhomyzj///KMc\nHByUq6urcnV1VVZWVqpMmTLq1q1bWkfLUsHBwaphw4YqPj5e6yhZYv/+/aply5aG5xMmTFATJ07U\nMFHWS0xMVC1atFBTpkzROkqW+t///qecnZ2Vq6urKlmypCpQoIDq3bu31rGyTFRUlHJ1dTU837t3\nr79Dat0AAAEuSURBVGrbtu0L1zeaQj9z5kz15ZdfKqWUOn/+vHJxcdE4UfYxx5OxW7duVZUrV1a3\nb9/WOkqWSUpKUuXKlVNXr15VCQkJZncyNjU1VfXu3Vu9//77WkfJViEhIcrPz0/rGFnO29tbnT9/\nXiml1FdffaU++eSTF66bo103LxMYGEhgYCDVqlUjT548LFy4UOtI2cYcuwSGDx9OYmIivr6+ADRo\n0IDp06drnCpzrKysmDZtGi1btiQlJYV+/fpRqVIlrWNlmX379rF48WLDfBEA3377La1atdI4WdYz\nx9+5X375hV69epGYmIibmxvBwcEvXFcumBJCCDNnfqejhRBCpCGFXgghzJwUeiGEMHNS6IUQwsxJ\noRdCCDMnhV4IIcycFHohhDBzUuiFEMLM/T/WpRYUc8kOlgAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xc4f3320>"
]
}
],
"prompt_number": 225
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can obtain a more accurate approximation by using the central difference,\n",
"\n",
"$f'(x) \\approx \\frac{ f(x+h) - f(x-h) }{2h}$\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_prime_cent = lambda f, x, h: (f(x+h)-f(x-h))/2/h\n",
"\n",
"plot(xs, [f_prime_cent(sin, xi, 0.1) for xi in xs])\n",
"plot(xs, cos(xs))\n",
"legend(['Approx', 'actual'])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nBfi9UAAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0xc490828>"
]
}
],
"prompt_number": 224
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Comparing the error at a point,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print 'actual', cos(.5)\n",
"print 'forward difference, h=0.1', f_prime(sin, .5, .1)\n",
"print 'forward difference, h=0.01', f_prime(sin, .5, .01)\n",
"print 'forward difference, h=0.0001', f_prime(sin, .5, .0001)\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"actual 0.87758256189\n",
"forward difference, h=0.1 0.852169347908\n",
"forward difference, h=0.01 0.87517082787\n",
"forward difference, h=0.0001 0.877558589151\n"
]
}
],
"prompt_number": 226
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print 'actual', cos(.5)\n",
"print 'central difference, h=0.1', f_prime_cent(sin, .5, .1)\n",
"print 'central difference, h=0.01', f_prime_cent(sin, .5, .01)\n",
"print 'central difference, h=0.0001', f_prime_cent(sin, .5, .0001)\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"actual 0.87758256189\n",
"central difference, h=0.1 0.876120655432\n",
"central difference, h=0.01 0.877567935587\n",
"central difference, h=0.0001 0.877582560428\n"
]
}
],
"prompt_number": 227
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Shows that the central difference method is much more accurate. It turns out that the central difference method results from doing a degree 2 polynomial interpolation and then taking its derivative. \n",
"\n",
"Because it is mentioned in the text, the formula for a 3-point derivative at an endpoint is different, because we can't use information on one side of the point. Thus we have\n",
"\n",
"\n",
"$f'(x) \\approx \\frac{ -3f(x) + 4f(x+h) - f(x+2h)}{2h}$\n",
"\n",
"Which is the approximation on a left endpoint. The right endpoint is the same with $+h$ replaced with $-h$."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_prime_left = lambda f, x, h: (-3*f(x) + 4*f(x+h) - f(x+2*h))/2/h\n",
"f_prime_right = lambda f, x, h: (3*f(x) - 4*f(x-h) + f(x-2*h))/2/h\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 347
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Richardson extrapolation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Richardson Extrapolation is a sequence acceleration method which we will use for accelerating the convergence of numerical integration techniques. The idea is to combine two approximations in such a way that their errors cancel out.\n",
"\n",
"Consider an approximation, $A(x)$ to some true value $A^*$. Suppose that the approximation has an error term of the form:\n",
"\n",
"$A^{*} - A(x) = \\alpha_0 x + O(x^2)$, for some constant $\\alpha$, and this formula just says that the error decreases linearly as $x \\to 0$.\n",
"\n",
"Consider another evaluation of the sequence at a smaller value of $x$, $A(\\frac{x}{t})$. Just by plugging things in,\n",
"\n",
"$A^{*} - A(\\frac{x}{t}) = \\alpha_0 \\frac{x}{t} + O(\\frac{x^2}{t^2})$\n",
"\n",
"We want to combine $A(\\frac{x}{t})$ and $A(x)$ to get the $\\alpha_0 x$ term to cancel.\n",
"\n",
"So multiply $A(\\frac{x}{t})$ by $t$, to get\n",
"\n",
"$tA^{*} = tA(\\frac{x}{t}) + \\alpha_0 x + O(\\frac{x^2}{t})$\n",
"\n",
"Now, subtracting $A(x)$ from both sides\n",
"\n",
"\n",
"$tA^{*} - A^{*} = tA(\\frac{x}{t}) + \\alpha_0 x + O(\\frac{x^2}{t}) - A(x) - \\alpha_0 x - O(x^2)$\n",
"\n",
"Note that the $\\alpha_0 x$ terms cancel and we have\n",
"\n",
"$(t-1)A^{*} = tA(\\frac{x}{t}) + O(\\frac{x^2}{t}) - A(x) - O(x^2)$\n",
"\n",
"We can group the $x^2$ terms,\n",
"\n",
"$(t-1)A^{*} = tA(\\frac{x}{t}) - A(x) + O(x^2)$\n",
"\n",
"Dividing by $(t-1)$ gives the formula:\n",
"\n",
"$A^{*} = \\frac{tA(\\frac{x}{t}) - A(x)}{t-1} + O(x^2)$\n",
"\n",
"What we have, then, is a way to increase the speed of convergence from $O(x)$ to $O(x^2)$, at the cost of an additional function evaluation. Note that this method can be extended as far as you'd like, just replace $x$ with $x^n$ and $t$ with $t^n$ in the error terms and we can still increase the convergence speed.\n"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment