{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Numerical Methods\n", "\n", "# Lecture 1: Interpolation and curve fitting" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Learning objectives:\n", "\n", "* Learn about standard methods to approximate discrete data points.\n", "* Understand the differences between interpolation and curve fitting (e.g. of noisy data).\n", "* Implement methods to compute simple polynomial interpolation in 1D (and practice our Python coding)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# some imports we will make at the start of every notebook\n", "# later notebooks may add to this with specific SciPy modules\n", "\n", "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Introduction\n", "\n", "## Interpolation vs curve-fitting\n", "\n", "Consider a discrete set of data points \n", "\n", "$$ (x_i, y_i),\\;\\;\\;\\;\\;\\; i=0,\\ldots,N,$$\n", "\n", "and suppose that we wish to approximate this data in some sense. \n", "\n", "The data may be known to be exact (e.g. we may wish to approximate a complex function, which we can evaluate exactly, by a simpler expression say), or it may have acknowledged errors from measurement/observational techniques, with known or unknown [error bars](https://en.wikipedia.org/wiki/Error_bar)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Interpolation\n", "\n", "[*Interpolation*](https://en.wikipedia.org/wiki/Interpolation) generally assumes that these data points are *exact* (e.g. no measurement errors) and at *distinct* $x$ locations, i.e. there is no ambiguity in a mapping from $x$ to $y$ (which there would be if we had multiple $y$ values for the same $x$; we will see this scenario in the case of curve-fitting covered below). \n", "\n", "[Note that sometimes we may have control over the $x$ locations, but sometimes we won't - we'll just be given arbitrary data - we'll cover both cases below].\n", "\n", "The process of interpolation then seeks to fit a function (or curve), \n", "\n", "$$ y = f(x), $$ \n", "\n", "to this data which *exactly passes through the $N+1$ discrete points*, \n", "\n", "i.e. given the data our job in interpolation is to find a suitable $f$.\n", "\n", "\n", "We can then use this function to find (or estimate) $y$ values at $x$ locations other than those provided by the data. \n", "\n", "When these new $x$ locations are within the range of known data points (i.e. for $x\\in[\\min\\{x_i\\},\\max\\{x_i\\}]$) this process is called *interpolation*. \n", "\n", "In the case where we seek new $y$ values at $x$ locations that are outside the data range this is called [*extrapolation*](https://en.wikipedia.org/wiki/Extrapolation) (which we will return to towards the end of this lecture). We will only touch on this briefly, but the take-home message is: be extremely cautious when extrapolating and ideally don't do it!!\n", "\n", "The requirement for distinct $x$ locations means that we have a constraint on the $x_i$'s which can be written as\n", "\n", "$$x_0 < x_1 < \\ldots < x_N,$$ \n", "\n", "(i.e. we will assume our data points have been sorted in $x$),\n", "\n", "and for $f$ to be an [*interpolant*](http://mathworld.wolfram.com/Interpolant.html) we require that \n", "\n", "$$y_i = f(x_i),\\;\\;\\;\\;\\;\\; \\forall i, \\;\\;\\;\\;\\;\\text{[$\\forall \\equiv$ \"for all\"]}$$\n", "\n", "i.e. the curve mapped out by $\\;y=f(x)\\;$ for all $x$ values passes through ALL our $(x_i,y_i)$ data points exactly.\n", "\n", "In this case the function $f$ is known as the *interpolating function*, or simply the *interpolant*.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Curve-fitting\n", "\n", "Alternatively, when we have data with noise (potential errors), or multiple different measurement values ($y$) at a given $x$, then we may not want to, or cannot fit a function/curve that goes through all points exactly, and rather have to perform [**curve-fitting**](https://en.wikipedia.org/wiki/Curve_fitting) - finding a function that approximates the data in some sense but does not necessarily go through all the points. \n", "\n", "In this case we *no longer* have the requirement that \n", "\n", "$$x_0 < x_1 < \\ldots < x_N,$$ \n", "\n", "and can consider the data simply as a *cloud of points*. \n", "\n", "This is the most typical case for real world data which contains variability and noise and could additionally give rise to multiple different measurements (i.e. $y$ values) at the same $x$ location.\n", "\n", "If we were to construct a single straight line:\n", "\n", "$$y = m x+c, \\;\\;\\;\\;\\; \\text{where we have only two free parameters:} \\;\\;\\; \\text{the gradient} \\;\\;\\;\\; m \n", "\\;\\;\\;\\;\\text{and the intercept} \\;\\;\\;\\; c$$ \n", "\n", "that, for example, minimised the sum of the squares of the differences to the data, this would be what is known as a [*least squares approximation*](https://en.wikipedia.org/wiki/Least_squares) to the data using a linear function. We will return to this in a section on curve-fitting below.\n", "\n", "With real data this fitting of data to a function often has the effect of *smoothing* complex or noisy data.\n", "\n", "\n", "\n", "Note that curve fitting is related to the topic of [*regression analysis*](https://en.wikipedia.org/wiki/Regression_analysis). Fitting a polynomial to data in a least squares sense is an example of what can be termed *polynomial regression*; the example immediately above is therefore an example of *linear* regression. Note that some people will use the terms interpolation, curve-fitting and regression in (wrong and) inter-changeable ways - be careful over using the correct terminology so as not to upset!\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Choice of interpolating function\n", "\n", "We have a lot of choice for how we construct the interpolating or curve-fitting function.\n", "\n", "Considerations for how to do this include the required/desired smoothness of the resulting function (i.e. how many smooth derivatives it has - cf. the piecewise polynomial case), replicating known positivity/boundedness or periodicity, the cost of evaluating it, etc.\n", "\n", "Some choices include: polynomials, piecewise polynomials, trigonometric series (sums of sines and cosines leading to an approximation similar to [*Fourier series*](https://en.wikipedia.org/wiki/Fourier_series))." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Some arbitrary test data\n", "\n", "Let's first invent a small set of arbitrary data which we shall seek to interpolate throughout this lecture using different methods, and define a function that will save us from typing the same plotting commands multiple times." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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X7++t33FihVEBJdccsmw9W3YsIFzzjmHefPmMXv2bJqamrj//vsH7TvSWhsbG1m+fDmdnZ1ERO+jo6MDgP/8z//kzDPPZNGiRdTX1zNnzhyOOeYYbr755hGNqSRNFob7GCmXyzQ2NjJt2jQaGxspl8tFlwTApz/9aW644QbOOeccLr/8cg466CCgEv7r16/nj//4j/na177Gpz71KVasWMHxxx/Pj370o97tm5ubAbjzzjt725YuXcq0adN49dVXWbZsWW/71j5btxnK5s2bOfHEE7nqqqt497vfzaWXXsqiRYt45zvfyZo1a7bpP9JaL7vsMt74xjcyb948rr322t7HwQcfDMDNN9/MY489xvvf/34uv/xyWltbWb9+PaeddhrXX3/9jg6tJE1cKaUsHkceeWQazqOPPjpo+wsvvDDstttz3XXXpfr6+gT0Purr69N11123U/vdGVdffXUC0qJFi9JLL720zfru7u5t2p555pn02te+Np188sm9bRs3bkz19fXpgx/8YG/bWWedld70pjelgw8+OH3sYx/rbT/ttNPS7rvvnl555ZV++x04vldeeWUC0oUXXtiv/atf/WoCUkNDw6hqTSmlJUuWbLP99vbz0ksvpUWLFqWDDz540G0GGuo9VJRly5YVXULWHN/acnx3DnBfGiITPXIfA62trducy+7p6aG1tbWgin7nYx/72KDfpT979uzen7u7u1m3bh11dXUcffTR3HPPPb3rdt11V4455ph+R+jLli3j+OOP5/jjj2fp0qVA5UPi8uXLWbJkCdOmbf9t9b3vfY+6ujrOP//8bWp9zWteM+pah9N3Pz09Paxbt46enh6am5tZsWIFL7zwwoj3JUkTmeE+Brq6unaofTwtWrRo0PZf/OIXnH766eyxxx7MmTOHefPmsddee3HbbbexYcOGfn2bm5t5+umnWbFiBStXrmT16tU0NzfT3NzME088wa9+9Sseeugh1q1bN+yUPMDKlSvZd999twnyGTNm8PrXv36nat2eZ599lpaWFubPn8/s2bN79/PNb34TgN/85jcj3pc0kUzU04IqzpT6rXC1snDhQjo7OwdtL9pgR+3d3d0ce+yxvPTSS3zyk5/k8MMPZ86cOUybNo0vf/nL/c6vQ//z7jNmzGCXXXbhHe94B5s2bWLatGksXbqUtWvX9uu7PSmlIb+n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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Invent some raw data - we will use the notation (xi,yi) for the\n", "# given data, where xi and yi are of length N+1 (N=len(xi)-1)\n", "xi = np.array([0.5, 2.0, 4.0, 5.0, 7.0, 9.0])\n", "yi = np.array([0.5, 0.4, 0.3, 0.1, 0.9, 0.8])\n", "\n", "# We will want to overlay a plot of the raw data a few times below so \n", "# let's do this via a function that we can call repeatedly\n", "# [Note that I've been a bit lazy in later lectures and really should\n", "# do this sort of thing more often to make code easier to read - apologies]\n", "def plot_raw_data(xi, yi, ax):\n", " \"\"\"plot x vs y on axes ax, \n", " add axes labels and turn on grid\n", " \"\"\"\n", " ax.plot(xi, yi, 'ko', label='raw data')\n", " ax.set_xlabel('$x$', fontsize=16)\n", " ax.set_ylabel('$y$', fontsize=16)\n", " ax.grid(True)\n", "\n", "\n", "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "\n", "# For clarity we are going to add a small margin to all the plots.\n", "ax1.margins(0.1)\n", "\n", "# plot the raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "# add a figure title\n", "ax1.set_title('Our simple raw data', fontsize=16)\n", "\n", "# Add a legend\n", "ax1.legend(loc='upper left', fontsize=18);\n", "# loc='best' means we let matplotlib decide the best place for the\n", "# legend to go. For other options see \n", "# https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simple interpolation example\n", "\n", "One of the simplest examples of interpolation is to simply fit a straight line between every two successive data points.\n", "\n", "This is termed *piecewise-linear* interpolation, and the resulting function is called a piecewise-linear interpolant.\n", "\n", "This is an example of the more general piecewise-polynomial interpolation - a piecewise quadratic discontinuous function was given in the example image above.\n", "\n", "Of course the default approach to plotting effectively performs piecewise-linear interpolation as we shall now see." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "ax1.margins(0.1)\n", "\n", "# Plot a piecewise-linear approximation.\n", "# We get this simply by connecting the points with straight lines\n", "# and this is the default behaviour of the plotting routine so simply\n", "# involves a call to 'plot' with our data.\n", "ax1.plot(xi, yi, 'b', label='p/w linear interpolant')\n", "\n", "# Overlay raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=18)\n", "\n", "# add a figure title\n", "ax1.set_title('Raw data and its p/w linear interpolant', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simple curve-fitting example\n", "\n", "While we could just use the default plotting method to demonstrate linear interpolation, to demonstrate linear curve-fitting we need to do a bit more work.\n", "\n", "The example below demonstrates how we can use `numpy.polyfit` to do this for us - take a look at the docs here .\n", "\n", "``` Python\n", "numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)\n", "```\n", "> Least squares polynomial fit.\n", "\n", "> Fit a polynomial p(x) = p[0] * x**deg + ... + p[deg] of degree deg to points (x, y). Returns a vector of coefficients p that minimises the squared error.\n", "\n", "So it returns the coefficients of the polynomial fit to the data. We can then use `numpy.poly1d` to turn this into a function we can easily evaluate, as seen in the next example.\n", "\n", "If we were doing this evaluation ourselves we would need to read the docs carefully to see that the first entry of the returned coefficient is the multiplier of the highest power of $x$ - i.e. in the linear case the gradient, with the second number being the intercept. Printing the coefficients out below we see this to be correct." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "poly_coeffs: [0.0508044 0.26714649]\n" ] }, { "data": { "image/png": "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UHIXJkyYwNChQ/nb3/7GrFmzOPbYY+nTpw+LFy+ulOUOOeQQVqxYUfj31VdflbmOJUuWFNa59957GT16NP/617+YP38+I0eOZPTo0dxzzz2V8voHDhzI8OHDy1U3lrbKycnhyiuv5MMPP2TKlCnUq1ePk08+mTVr1hTWWbt2LccddxzOOd58803mzZvHqFGj2GeffQrrfPrpp0Xa8fPPP8fMOPfccwvrbNiwgcMOO4yRI0fSuHHjijeGiCQG51xC/HXp0sWVZO7cuSXOq0rr1q3b5XW0atXKPfDAA0XKvvzyS9ewYUM3Z86cXV6/c85169bNDRo0qEhZu3bt3M0337zLy91+++3u0EMPrfA6rrvuusLpvn37uksuuaRInUsuucT17du3cPqFF15wDRo0cIsWLSosGzJkiDvwwAPdjz/+WOrrGDBggLv99ttLrVNWvGW1VaT169e7OnXquNdff72wbNiwYe7YY48t9zqcc+6uu+5yu+22m9u4cWNhWeRnrkmTJm7s2LFlries70dNMnXq1LBDiFtqu9hURrsBM10JObFW3KGuONdcA7NnV+02duxoTN26v00feSSMGFGxdfTo0YNPP/20SNk111zDoEGD6NSpU5Hyu+++m7vvvrvU9f3nP//hhBNOKJzeunUrn332GTfccEOReqeeeioffvhhieupyHI//PBD4U2EjjnmGO6++24OPPDAUtfx8ccfF04ff/zxjBkzhvnz59OhQwfmzp3LlClTGDZsWGGds88+m3vvvZe77rqLxx9/nPvvv5/nn3+e6dOn07Jly1LbpLxibato69evJz8/nz322KOw7NVXX6V3796cd955TJ06lf33359BgwZx1VVXFXstunOOJ598kosuuoikpKTYX5SIJKRam9zjRY8ePRgzZkzh9KuvvsqsWbN44YUXdqp7+eWXF+miLU6rVq2KTK9evZodO3bslABbtmzJe++9V+J6yrvcMcccw7hx4+jQoQOrVq3irrvu4thjj2XOnDls2bKlxHWsXLmycPqmm25i/fr1dOrUibp167J9+3YyMjK48sorC+uYGXfffTd9+/bloIMOIjMzkylTptC+fftS26MiYm2raEOHDuXII4+kR48ehWU//PADY8aM4dprr+Xmm29m9uzZDB48GICrr756p3W8++67LFy4kEGDBsX4akQkkdXa5F7RI+hYrF+/aZfvj969e3euv/561qxZQ5MmTbjhhhu47bbb2GuvvXaqu+eee7LnnnvGtJ3oo0PnXLnuXlbWcn369Ckyv3v37hx44IE8/fTTnH/++eVax4QJE3jmmWd47rnnOPTQQ5k9ezZDhw6lbdu2XHrppYX1Tj31VI4++mhuueUW3njjDY4++uhiY47u4diyZQtmxv33319YFt3DUZHXXJrrrruODz74gA8++IC6Ed06+fn5dO3atXAcQefOnVmwYAGjR48uNrk//vjjHH300Rx55JHl2q6I1C61NrnHiy5dutCgQQNmzpzJrFmzqFevHldddVWxdWPplm/RogV169blxx9/LFJv1apVpXZnx7pc06ZNOfTQQ1mwYEGp64gcSHbjjTdyww03FP4YOPzww8nNzeWee+4pktynTJnCF198gXOu1BiiezhuuukmWrVqxZAhQwrLons4duU1F7j22msZP348U6dO5cADDywyb7/99tvpNEvHjh0ZOXLkTutZtWoVr732GqNHjy5zmyJSOym513ANGzakc+fOvPHGGzz99NM899xzJT6eM5Zu+QYNGtClSxfeffddzjnnnMLyd999l7POOqvE9cS63ObNm5k/fz49e/YsdR2nn3564XReXl6Ro1yAunXrkp+fXzj9xRdf0L9/f0aNGsWbb77JsGHDePvtt4uNIbqHo1mzZuy55560a9euxLh35TWD74ofP348OTk5dOjQYaf5xx13HN98802Rsm+//Zbk5OSd6o4dO5aGDRsW/tgREdlJSSPt4u0vUUfLO+fcNddc48zMnXrqqZWyvmjjx4939evXd48//ribO3euGzJkiGvSpEmRkeejRo1yhxxySIWXu/76611OTo774Ycf3IwZM1zfvn1ds2bNCuuUtI6vv/66cB0DBgxwrVq1cpMmTXILFy50EydOdC1atCgcUb9o0SK3//77uzvuuMM559xXX33lzKzco1ErMlo+lra68sorXbNmzdzkyZPdihUrCv/Wr19fWOeTTz5x9erVc3fddZdbsGCBe+GFF1zz5s3dww8/XGT7+fn5rl27djuN2C+wfPlyN2vWLDdr1izXuHFjd8cdd7hZs2a53NzcEl+TRstrxPeuUNvFpqpHy4eelCvrL5GT+7hx41zdunWLJLzKNnr0aJecnOwaNGjgjjrqKDdt2rQi82+//XbnfwtWbLnzzjvP7bfffq5+/fpu//33d/3799/pEr7i1hHZduvWrXNDhw51bdq0cY0aNXJt27Z1w4YNc5s2bXI///yz69Chg0tPTy+yznPPPdd17969XK+9Ism9PK85uq2AYv+itzlp0iR3xBFHuIYNG7r27du7kSNHuvz8/CJ1pkyZ4gD38ccfFxvbm2++Wey2BgwYUOLrUXKvmQnq2WefdcnJyc7MXHJysnv22WfDDqlYNbHt4kFVJ3fz8+Nf165d3cyZM4udN2/ePDp27FjNEflLnnZ1QB34gWLt27evVedYK6vtaptY2i2s70dNkpOTQ2pqathhFMrOziY9PZ28vLzCsqSkJLKyskhLSwsxsp3VtLaLF5XRbmb2mXOua3HzdIe6Gio/P5+VK1dy77338tVXX3HXXXeFHZKIVJOMjIwiiR382JOMjIyQIpJ4owF1NdT//vc/evXqxSGHHMLLL79c5IYnIpLYSrqdcVm3hBYpoOReQ6WmphYZDS4itUebNm3Izc0ttlykPNQtLyJSw2RmZu50W+GkpCQyMzNDikjijZK7iEgNk5aWRlZWFsnJyZgZycnJNXIwndRc6pYXEamB0tLSlMwlZjpyFxERSTBK7iIiIglGyV1ERCTBKLmLiIgkGCV3ERGRBKPkLuXy0ksvYWZhhyEiIuWg5C5VJiUlhfvvvz/sMEREah0l9wrIzs4mJSWFOnXqkJKSQnZ2drVuf+vWrdW6PRERiU9K7uVU8AjG3NxcnHPk5uaSnp5epQk+NTWVK664ghtuuIG9996b4447DoAHH3yQI444giZNmtCqVSsGDRrE2rVrC5fbd999mTBhQuH0cccdR7Nmzdi+fTsACxYswMxYtmxZidt+5plnSE5OJikpidNOO42VK1cWmf/999/Tr18/9t13X5o0acJRRx3FpEmTisSem5vLjTfeiJkVdun//PPPXHDBBbRu3ZrGjRtz6KGHMnbs2F1vLBERKaTkXk5hPYLx2WefxTnH+++/zzPPPANAnTp1GDFiBHPmzOG5557jk08+YfDgwYXLnHTSSUydOrUwxpkzZ9KwYUMKnnefk5NDu3btaNWqVbHb/Pjjjxk4cCDp6enMnj2b008/ndtuu61InQ0bNtCnTx/effddvvjiC8466yz69+/P/PnzAZg4cSKtW7fmtttuY8WKFaxYsQKAzZs3F/4QmDNnDkOHDuWyyy5j8uTJldtwIiK1mXMuIf66dOniSjJ37twS55WXmTlgpz8zK3GZdevW7dI2TzrpJHf44YeXWe8///mPa9CggduxY4dzzrkxY8a4gw8+2Dnn3DvvvOM6dOjgLrnkEnf33Xc755y78MIL3aBBg0pc3wUXXOBOPvnkImWXXnqp8x+Xkh1zzDHuzjvvLJxOTk52//znP8uM/7zzznOXXnppkbJdbbvaKpZ2q4zvR7ybOnVq2CHELbVdbCqj3YCZroScqCP3cirpUYtV/QjGLl267FQ2ZcoUTjnlFFq3bk2zZs3o378/W7du5ccffwR8l/i3337L8uXLycnJoWfPnqSmppKTkwPAtGnTSE1NLXGb8+bNo0ePHkXKoqc3btzI//3f/9GpUyf22GMPmjZtysyZM8t83vSOHTvIzMzkiCOOYK+99qJp06ZMnDhRz6kWEalESu7lFNYjGJs0aVJkOjc3l759+9KxY0defPFFPvvsM5566ingtwF3HTt2pGXLluTk5BQm9549ezJ9+nTmzp3LsmXLSk3u/gdh6W644QZefPFF7rzzTqZNm8bs2bPp1q1bmYP+7r//fh544AFuvPFGJk+ezOzZs/nTn/6kwYIiIpVIT4Urp4KnM2VkZLB48WLatGlDZmZmtT+1aebMmWzdupWHHnqIunXrAhQZyFbgpJNO4s0332TmzJmcdNJJ7LPPPrRo0YL77ruv1PPtAJ06dWLGjBlFyqKnP/jgAy655BLOOusswJ9L//777zn44IML6zRo0IAdO3bstNzpp5/OxRdfDPgfEt9++y277757BVpBRERKoyP3CkhLS2PRokXk5+ezaNGiUB7H2L59e/Lz8xkxYgQLFy7k+eefZ8SIETvVS01NZcKECbRv35599tkH8An/2WefLfWoHWDIkCG899573HPPPSxYsIDHH3+cV155pUidgw8+mFdeeYXPP/+cr776iosuuojNmzcXqZOSksL777/PsmXLWL16deFykydP5oMPPmD+/PlcffXVLFy4cBdaREREoim5x5kjjjiCkSNH8uCDD9KpUyeeeOKJYm8U07NnT3bs2FEkkRdXVpzu3bvz5JNP8sgjj3DEEUcwceJEhg8fXqTOgw8+yD777MMJJ5xAnz596N69OyeccEKROn//+99ZsmQJBx10EHvvvTcAt9xyC926daNP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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Fit a polynomial of degree 1, i.e. a straight line, to our (xi, yi) data from above\n", "# we'll explain what's going on here later in this lecture\n", "degree = 1\n", "poly_coeffs = np.polyfit(xi, yi, degree)\n", "print('poly_coeffs: ',poly_coeffs)\n", "\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(poly_coeffs)\n", "\n", "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "ax1.margins(0.1)\n", "\n", "# Plot the linear fit - define 100 evenly spaced points (x) covering our\n", "# x extent and plot our linear polynomial evaluated at these points (p1(x))\n", "# of course 100 is overkill for this linear example\n", "x = np.linspace(0., 9.5, 100)\n", "# NB. the 'linspace' function from numpy returns evenly spaced numbers \n", "# over a specified interval. It takes three arguments; the first two \n", "# are the bounds on the range of values, and the third is the total \n", "# number of values we want.\n", "# See the docs (i.e. np.linspace?) for additional options arguments\n", "\n", "ax1.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(poly_coeffs[0], poly_coeffs[1]))\n", "\n", "# Overlay raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=14)\n", "\n", "# add a figure title\n", "ax1.set_title('Raw data and the corresponding linear best fit line', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Polynomial interpolation\n", "\n", "## Introduction\n", "\n", "1. Suppose we are given a set of $N+1$ data points $(x_i, y_i)$ (with distinct $x_i$'s). \n", "\n", "\n", "2. Now suppose we construct a polynomial of degree $N$:\n", "\n", "$$ P_N(x) := a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \\ldots a_N x^N, $$\n", "\n", "where $a_0, \\, a_1, \\, \\ldots, \\, a_N$ are the coefficients of our polynomial. \n", "\n", "\n", "- Note that there are $N+1$ of these coefficients available to us with a degree $N$ polynomial. This number of free parameters ($N+1$) agreeing exactly with the number of data points ($N+1$) is important as it's exactly the right number to allow us to determine the coefficients uniquely - essentially when we substitute in our data we can write this information as a linear matrix system we can invert (as its square system) for the coefficients.\n", "\n", "\n", "- We recognise this $\\;P_N\\;$ as the simple expression for a *polynomial* we have probably been introduced to before. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aside: how this problem leads to a square matrix system\n", "\n", "Assume we have two pieces of information and want to fit a linear line - let's write these out:\n", "\n", "\\begin{align*}\n", "(1) & \\;\\;\\;\\; y_0 = a_0 + a_1\\,x_0, \\\\[5pt]\n", "(2) & \\;\\;\\;\\; y_1 = a_0 + a_1\\,x_1. \n", "\\end{align*}\n", "\n", "We are assuming we know the $x$'s and the $y$'s, and we want to find the $a$'s.\n", "\n", "There are multiple ways we could solve this, one way is to think about how you solve simultaneous equations - e.g. rearrange the second equation to give an expression for $a_1$ in terms of $a_0$, and so on, .... [we'll return to these ideas in a later lecture].\n", "\n", "However this isn't easy to do with large amounts of data.\n", "\n", "Instead we can note that this is equivalent to forming and solving the linear system\n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & x_0 \\\\\n", "1 & x_1 \n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", "a_0\\\\\n", "a_1\n", "\\end{pmatrix}\n", "=\n", "\\begin{pmatrix}\n", "y_0\\\\\n", "y_1\n", "\\end{pmatrix}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we can also interpret this as a *linear combination* of a *basis* made up of single-term polynomials: \n", "\n", "$$1, \\; x, \\; x^2, \\; \\ldots, \\; x^N.$$ \n", "\n", "These single term polynomials are also referred to as [*monomials*](https://en.wikipedia.org/wiki/Monomial). \n", "\n", "Our linear example from earlier is an example of this with two free parameters.\n", "\n", "We will come back to monomials, as well as other (NB. a basis is not unique) potential functions/polynomials to use as basis functions later - we will see below that other basis options can be more convenient when actually implementing interpolation.\n", "\n", "\n", "#### Can we do better?\n", "\n", "While this is perhaps the simplest (it's consistent with the simplest definition of a polynomial we are used to seeing) and the most obvious way to proceed, we should ask ourselves can we do better? \n", "\n", "i.e. can we try to use a different (less obvious) basis that might mean we don't have a (potentially large, and difficult) matrix system to solve for the coefficients?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Lagrange polynomial\n", "\n", "The answer is yes, and [Lagrange polynomials](http://mathworld.wolfram.com/LagrangeInterpolatingPolynomial.html) are a particularly popular choice for constructing an interpolant for a given data set. \n", "\n", "Given a set of $(N+1)$ points as above, the Lagrange polynomial is defined as the linear combination\n", "\n", "$$L(x) := \\sum_{i=0}^{N} y_i \\ell_i(x),$$\n", "\n", "where the $\\ell_i(x)$ are a new choice for our basis functions (different to the monomials, but the same idea in that they form a *basis*), and the $y_i$ are the $N+1$ weights/coefficients corresponding to this basis.\n", "\n", "Note that this is not a typo and we are not re-using notation here - we will see that **the weights in this approach actually ARE the same as the $y_i$'s making up the data we are interpolating!**\n", "\n", "This is the whole point of this approach - we no longer have to compute the weights by inverting a matrix system as we had to above with monomials. \n", "\n", "Now, by construction in this approach, we know the weights directly from the given data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The functions $\\ell_i(x)$ are known as the *Lagrange basis polynomials* and are defined by the product\n", "\n", "$$\\ell_i(x) := \\prod_{\\begin{smallmatrix}0\\le m\\le N\\\\ m\\neq i\\end{smallmatrix}} \\frac{x-x_m}{x_i-x_m} = \\frac{(x-x_0)}{(x_i-x_0)} \\cdots \\frac{(x-x_{i-1})}{(x_i-x_{i-1})} \\frac{(x-x_{i+1})}{(x_i-x_{i+1})} \\cdots \\frac{(x-x_N)}{(x_i-x_N)},$$\n", "\n", "where $0\\le i\\le N$.\n", "\n", "If $N=0$ (*i.e.* if there is only one point in the data set), there is only one Lagrange basis polynomial defined by convention as $\\ell_0=1$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Notice from the definition of these basis functions the clear requirement that no two $x_i$ are the same, $x_i - x_m \\neq 0$, so this expression is always well-defined (i.e. we never get a divide by zero!). \n", "\n", "The reason pairs $x_i = x_j$ with $y_i\\neq y_j$ are not allowed is that no interpolation function $L$ such that $y_i = L(x_i)$ would exist; a **function** can only return a single unique value for each argument $x_i$ (this uniqueness is part of the definition of a *function*).\n", "\n", "On the other hand, if also $y_i = y_j$, then those two points would actually be one single point - we would thus have redundant data and really we could throw one away and would be looking for a degree $N-1$ degree to interpolate $N$ **distinct** data points." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For all $j\\neq i$, $\\ell_j(x)$ includes the term $(x-x_i)$ in the numerator (the thing on the top), so the whole product will be zero when evaluated at $x=x_i$:\n", "\n", "$$\\ell_{j\\ne i}(x_i) =\n", "\\prod_{\\begin{smallmatrix}0\\le m\\le N\\\\ m\\neq j\\end{smallmatrix}}\n", " \\frac{x_i-x_m}{x_j-x_m} = \\frac{(x_i-x_0)}{(x_j-x_0)} \\cdots \\frac{(x_i-x_i)}{(x_j-x_i)} \\cdots \\frac{(x_i-x_N)}{(x_j-x_N)} = 0.$$\n", "\n", "On the other hand a basis function $i$ evaluated at location $x_i$ returns 1:\n", "\n", "$$\\ell_i(x_i) = \n", "\\prod_{\\begin{smallmatrix}0\\le m\\le N\\\\ m\\neq i\\end{smallmatrix}}\n", "\\frac{x_i-x_m}{x_i-x_m} = 1.$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In other words, all of the basis functions/polynomials are zero at the exact locations of the data ($x=x_i$), except for $\\ell_i(x)$, for which it holds that $\\ell_i(x_i)=1$, because it lacks the $(x-x_i)$ term in the product.\n", "\n", "It follows that \n", "\n", "$$y_i \\ell_i(x_i)=y_i,$$ \n", "\n", "and therefore at each point $x_i$\n", "\n", "$$L(x_i)=0+0+\\dots + y_i + 0 +\\ldots +0=y_i,$$ \n", "\n", "showing that $L$ does indeed interpolate (i.e. pass through) the data points exactly.\n", "\n", "To help illustrate our discussion lets go back to our simple example from earlier." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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5S5JUu4sd0mSMmO5a1xpaWmhubm56BiSNKFZ7srKzTffzLXXXlt0DEkqlOWurFjukmS5Typvv/02fX19RceQJNWY5Z6pm2++mYjgxz/+MV/96lc55JBDmDZtGnfccQcA9957L5/4xCc4+OCDmT59OnvuuSennnoq999//6DjfPnLXyYiWL58ef/YSy+9RERQX1/PmjVr+seXLl1KRHD11VcPm2/t2rVcfPHFzJ49mxkzZtDS0sKjjz465LY7m7W5uZn777+f7u5uIqL/o6urC4B///d/54ILLmDevHk0NDQwc+ZMjj/+eO68886dmlNJmigs91FSLpdpbm6mrq6O5uZmyuVy0ZEA+PznP8/tt9/OxRdfzHXXXcdhhx0GVMp/zZo1fOpTn+Jv//Zv+dznPsfSpUs5+eST+clPftK/f2trKwD33Xdf/9jixYupq6vjnXfeYcmSJf3jW7bZss/2bNq0idNOO40bb7yRM888k2uuuYZ58+ZxyimnsHLlym2239ms1157LR/4wAeYPXs2t9xyS//H/PnzAbjzzjt55plnOPfcc7nuuutob29nzZo1nHPOOdx22227OrWSNH6llLL4OOqoo9Jwnn766SHH161bN+y+O3LrrbemhoaGBPR/NDQ0pFtvvfU9Hfe9uOmmmxKQ5s2bl9avX7/N8729vduMvfzyy+n9739/OuOMM/rHNmzYkBoaGtIf/uEf9o9deOGF6cMf/nCaP39+uuSSS/rHzznnnLTnnnumt99+e9Bxt57fG264IQHpyiuvHDT+jW98IwGpqalpRFlTSmnRokXb7L+j46xfvz7NmzcvzZ8/f8h9tra976GiLFmypOgIWXN+a8v5fW+AR9J2OtEz91HQ3t6+zbXsvr4+2tvbC0r0rksuuWTI99KfMWNG/+e9vb2sXr2a+vp6PvKRj/DQQw/1P7f77rtz/PHHDzpDX7JkCSeffDInn3wyixcvBiq/JN5///0sWrSIurodf1t9//vfp76+niuuuGKbrO973/tGnHU4A4/T19fH6tWr6evro7W1laVLl7Ju3bqdPpYkjWeW+yjo6enZpfGxNG/evCHHf/3rX3Peeeex1157MXPmTGbPns0+++zDPffcw9q1awdt29rayksvvcTSpUtZtmwZK1asoLW1ldbWVp577jl+85vf8MQTT7B69ephl+QBli1bxv77779NkU+dOpWDDz74PWXdkVdffZW2tjbmzJnDjBkz+o/zrW99C4DXX399p48ljSfj9bKgijOp/ipcrTQ2NtLd3T3keNGGOmvv7e3lxBNPZP369Xz2s5/lgx/8IDNnzqSuro6vfe1rg66vw+Dr7lOnTmW33XbjhBNOYOPGjdTV1bF48WJWrVo1aNsdSSlt933aKytNI8+6o6956qmnsnTpUi6//HKOPvpoZs2aRX19PTfddBO33XYb77zzzk4dSxpPyuUybW1t/auH3d3dtLW1AVAqlYqMpgJZ7qOgo6Nj0P9cUCnVjo6OAlNt3+LFi3nxxRf59re/zYUXXjjouS9+8YvbbH/UUUcxa9YsFi9ezNSpU/nIRz7CjBkzmDFjBgsWLGDx4sWsWbOGfffdlyOOOGLYr3/IIYdw7733sm7dukFn7xs2bGD58uXstddeI866vV8annzySZ544gmuvPJKvvKVrwx67sYbbxw2szRe7eiyoOU+ebksPwpKpRKdnZ00NTURETQ1NdHZ2Tlu/8eqr68Htj1Lvvfee4e8hl1fX8+JJ57I/fffz5IlSwadnbe2trJ48WIeeOABTjrppJ36y2lnn302b7/9Nl//+tcHjX/zm9/c5rr3rmbdY489WLt27Tbbb+84v/zlL30pnCa08XxZUMXxzH2UlEqlcVvmW/vYxz7GfvvtxxVXXMGKFSuYO3cuP//5z7nlllv44Ac/yC9+8Ytt9mltbeUHP/hB/+cDx6+55pptxnfkwgsvpLOzk6uuuorly5dz3HHH8fjjj/Od73yHQw45hM2bN48467HHHsvdd9/NpZdeykc/+lHq6+tpbW1l/vz5HHHEEVx99dX09fVx2GGH8dxzz3HDDTdw5JFH8thjj+3yPErjwXi+LKgCbe82+on2UeRL4cajLS+F295LTZ544ol02mmnpT333DPtscceadGiRemBBx5In/70p1Pl22KwJ598MgFp+vTpacOGDf3jvb29abfddktA+tWvfjXk1xpqflevXp0uuuiitPfee6eGhoa0aNGi9PDDDw/5UrZdydrb25suuuiitO+++6a6urpBc7BixYr08Y9/PM2ePTtNnz49HX300el73/te+tKXvpSAtHz58u1PaJUvhZtcJsL8jseX4u6siTC/4xk7eClcpK2WKSeqhQsXpkceeWSH2yxdurT/DU0GevPN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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "ax1.margins(0.1)\n", "\n", "# Overlay raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=18)\n", "\n", "# add a figure title\n", "ax1.set_title('Raw data', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Using scipy.interpolate\n", "\n", "Note that we can use SciPy to evaluate the individual Lagrange basis function and polynomial.\n", "\n", "[If you're feeling brave and finding the other exercises straightforward feel free to attempt this yourself and check you can recreate the plot we generate below using SciPy - email me if you want to see my solution. Instead we will introduce a slightly easier approach below and implement that.]\n", "\n", "For example, we can use [scipy.interpolate.lagrange](http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.lagrange.html)\n", "from Python's [SciPy](http://www.scipy.org) library to generate the Lagrange polynomial for a dataset as shown in the next cell.\n", "\n", "Note: SciPy provides a [wide range of interpolators](http://docs.scipy.org/doc/scipy/reference/interpolate.html) with many different properties which we do not have time to go into in this course. \n", "\n", "When you need to interpolate data for your specific application then you should look at the literature (or indeed the remainder of this lecture) to ensure that you are using an appropriate one." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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XHjhhdSsWZNatWrRs2fPAhN65DaNT5w4kUsvvZTo6Ghat27NrFmzCmw/NTWVFi1aULlyZS666CImTJiAiLBly5a8Mt9//z2JiYlER0cTGxvLPffcw8GDB4t83+7N8rnNvLNnz6Zz585ER0eTkJDA8uXL856/4447OHLkCCKCiPDMM88AkJWVxWOPPUZcXBwxMTGcd955zJw5M29bueuePn06nTp1IioqipkzZ+bV2/vvv0/Dhg2pUqUKV199dYGm5pycHEaMGEGDBg2oVKkSbdu2ZfLkycV+psOGDaNFixZUqVKF+Ph4Hn30UY4dOwbY1odnn32W1atX572PsWPHAoWb5UWEMWPGcP311xMTE0OTJk349NNPC2zrxx9/pGPHjlSuXJkOHTowffp0RIS0tLQi40tKSmLw4ME8+OCD1KxZk5o1azJ06FBycnLyyvz555/cfvvt1KxZkypVqnDJJZewevVqj+s7cuQI1atXL9TsPWvWLCIjI9mzZ0+p97X58+fTuXNnKleuTL169Xj44YfJysoqEPs999zDkCFDqFWrFnXq1OG1117j+PHj3HfffZx22mk0bNiQTz75pMB63Zvli/uMlAoYxpiQuJ177rmmKGvWrCm07MEHjUlMLPp2wQXZxT5fntuDDxYZoke33367ueKKK4p8/tVXXzWzZ882mzdvNmlpaaZt27bmlltuyXv++++/NyJi/vWvf5l169aZMWPGmNq1axv7sVtPP/20iY6ONpdeeqlZtmyZWbVqlcnOzjYTJkwwEyZMMOvXrzc//fSTuf76603Tpk3N8ePHjTHGbN682QCmRYsWZsqUKWb9+vXmtttuM7Vq1TKHDh0yxhiTkZFhoqKizMMPP2zWrl1rxo8fb+Li4gxgNm/ebIwx5ueffzYxMTHm5ZdfNuvXrzc//PCD6dKli7n22muLfN+5216yZIkxxpi5c+cawJx33nlmzpw5Jj093Vx22WWmZcuWJicnxxw/ftyMHj3aREdHm127dpldu3blxXjzzTebzp07m3nz5plNmzaZ//znPyYyMtKsXLmywLrbtGljZs6caTZt2mT27t1rnn76aRMTE2MSExPN8uXLzcKFC03r1q1Nnz598uIcNWqUqVatmklJSTHr1q0zTz75pImIiDArVqzIKwOY8ePH5z1+7rnnzMKFC83mzZtNamqqadCggXniiSeMMcZkZmaaIUOGmBYtWuS9j8zMTHPw4EHTqFEj89JLLxVYb2xsrPnkk0/Mhg0bzLBhw0xkZKTZsmWLMcaYQ4cOmdq1a5ubbrrJ/PLLL+bbb781rVu3NoCZO3dukXWfmJhoqlatau6//36Tnp5uvvjiC1O9enXzyiuv5JW56qqrTIsWLcy8efPMzz//bPr06WPi4uJMZmZmgTr97bffjDHGJCcnm969exfYTr9+/czVV19d6n1t+/btJjo62tx9991mzZo1ZurUqaZevXrm73//e4HYq1WrZp5++mmzfv168/LLLxvA9OrVy4wePdps2LDBPPHEEyYqKsrs2LHDHDx4sMyfkTHGfPjhhyYmJqbIOjTG83dSOChu31LlAyw1HnKi40nZW7dwTO7uZsyYYaKioszJkyeNMfYLsmfPngXK3HXXXYWSe8WKFc3u3buLXffhw4dNRESEWbBggTHmry/cd955J6/M9u3bDZBXZtiwYXkJNtdTTz1VILnfeuut5s477yywrRUrVhjA7Nmzx2MsRSX3b775Jq/MwoULDWC2bdtmjPH8hbtx40YjIiYjI6PA8r59+5p77rmnwLonTJhQoMzTTz9tIiIiCrx2wYIFBjDr1683xhhz5plnmmeffbbA6xITE03//v3zHrsnDndvv/22adq0aYHtnn322QXKFJXchw0blvc4OzvbVKlSxXzyySfGGGPeeecdU7NmzbyEa4wxKSkppUruzZo1K/CZjhgxwsTGxhpjjFm/fr0BzLx58/Ke379/v6levbp57733jDGFk/uSJUtMhQoVzPbt240xxvzxxx+mcuXKZurUqcaY0u1rjz/+uGnatGnevm+M/cyjoqLMkSNH8mLv0qVL3vM5OTmmdu3aBX6QZWVlmcjISDN+/Pgik7s7989Ik3vRNLl7X1HJPWzPuY8eXfzzhw4dDfgpPefMmcM///lP0tPTOXDgACdPniQrK4vdu3dz5plnsnbt2kIdgTp37sx7771XYFlcXBz16tUrsGzTpk08+eST/Pjjj/z222/k5OSQk5PD1q1bC5Rr165d3t9nnnkmAHv37gVg7dq1nHfeeQVOAyQkJBR4/bJly9i4cSNffPFF3jK7v9oY6tatW+r6KCqWuLg4j+WXL1+OMYbWrVsXWH78+HF69OhRYJl73ACxsbEFphDt3LkzERERpKenU69ePXbu3Mn5559f4DUXXHAB06dPL/I9TJgwgdGjR7Nx40YOHz7MyZMnS309BHf566NixYrUqVOnwGfTpk0bqlSpUiD+0ujSpUuBz7Rr1648+eSTHDx4kPT0dCIiIujatWve8zVq1KBt27asWbPG4/oSEhJo27YtH330EY8//jifffYZNWvWpHfv3kW+H/d9LT09na5duxaYIOaCCy4gKyuLjRs35r02/zpEhLp169K2bdu8ZZGRkdSsWTNvvZ548zNSylf0nHuQysjI4IorrqBVq1aMHz+eZcuW8cEHHwDknWc0xpSqY1xMTEyhZX369OG3337j3Xff5ccff2TFihVUrFixwDlMoEDHstxt5Z5/Lc32c3JyGDRoECtXrsy7/fTTT2zYsKFMveFLiqWobYsIS5YsKbD99PT0vLrM5amOSsPT+y+qTn744Qf69etHz549mTp1KitWrOD5558nOzu7XNt27/QnImX6bMoj94eZJ8Vtb9CgQXz44YeA7ScyYMAAKlSoUKBMefe1/Ms91Ulx9eTO25+RUr7i9yN3EfkAuBLYa4wpPKbHlkkCRgORwD5jTKL/IgwOS5cuJSsri1dffTXvS3DatGkFyrRq1YrFixcXWOb+2JPff/+d9PR03nzzTbp37w7Yo9wTJ06UKcZWrVoV6kC2bNmyAo87duzI6tWrOeuss8q07rKKiooqdHTVoUMHjDHs3r07732WxY4dO9i2bRsNGjQAbN3m5OTQqlUrqlevzplnnsnChQsLtAIsXLiwUEtBrv/973/Exsby5JNP5i3LyMgo8X2UR6tWrfj44485evRo3tF7afYNsB3x8ifTH374gTPPPJPq1avTunVrcnJyWLRoERdddBEABw8eZNWqVdxxxx1FrvOWW25h6NChvPHGGyxfvpxx48aV6f20bt2aL7/8kpycnLyj94ULFxIVFUXTpk3LtK7ilOYzUioQOHHkPhboVdSTInIa8BZwlTHmbOB6P8UVkA4ePFjgqHLlypVs2bKFZs2akZOTw+jRo9m8eTOff/45o93ONTzwwAN8++23vPTSS2zYsIH//ve/fPXVVyVus2bNmtSuXZv33nuPjRs3Mm/ePAYPHkzFimX7LTh48GA2bdrEI488wrp165g0aVLe0VluYnjsscdYvHgxgwcPZsWKFWzcuJFp06Zx9913l2lbJYmPj+fYsWPM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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import scipy.interpolate as si\n", "\n", "### Our raw data from earlier - you can also test on our three data point example\n", "xi = np.array([0.5, 2.0, 4.0, 5.0, 7.0, 9.0])\n", "yi = np.array([0.5, 0.4, 0.3, 0.1, 0.9, 0.8])\n", "\n", "# Create the Lagrange polynomial for the given points.\n", "lp = si.lagrange(xi, yi)\n", "# above we executed 'import scipy.interpolate as si'\n", "# and so this line is calling the 'lagrange' function from the \n", "# 'interpolate' sub-package within scipy.\n", "\n", "# Evaluate this function at a high resolution (100 points here) so that \n", "# we get a smooth well-resolved line when we plot our polynomial\n", "x = np.linspace(0.4, 9.1, 100)\n", "\n", "# set up the figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "ax1.margins(0.1)\n", "\n", "# actually plot (x,y)=(x,lp(x)) on the axes with the label ax1\n", "ax1.plot(x, lp(x), 'b', label='Lagrange interpolating polynomial')\n", "\n", "# Overlay raw data on the same axes\n", "plot_raw_data(xi, yi, ax1)\n", "ax1.set_title('Lagrange interpolating polynomial (SciPy)', fontsize=16)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=14);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Exercise 1.1: The Lagrange basis polynomials evaluated at the data locations \n", "\n", "For a given $i$, what value does $\\ell_i(x_j)$ takes for every value of $j$ (i.e. for each of the data points). Hint: Look again at the definition of basis polynomials.\n", "\n", "What is the mathematical name for the function $\\ell_i(x)$?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Exercise 1.2: Picewise-linear Lagrange interpolant \n", "\n", "What are the Lagrange basis polynomials when $N=1$?\n", "\n", "Evaluate by *pen and paper* the linear approximation $L_1(x)$ (i.e. the Lagrange polynomial of degree 1) which passes through the two points $(0.0,0.1),(1.0,0.9)$.\n", "\n", "Notice that this method is just a glorified approach to obtain the equation of a line you are familar with: $y=mx+c$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Error in Lagrange interpolation\n", "\n", "Note that it can be proven that in the case where we are interpolating a known function (e.g. a complicated non-polynomial function such as $\\exp$ or $\\sin$) by a simpler polynomial, the error at any point we evaluate the interpolant at is proportional to:\n", "\n", "\n", "- (1) the distance of that point from any of the data points (which makes sense as the error is obviously zero at the data points),\n", "\n", "\n", "- (2) and to the $(N+1)$-th derivative of that function evaluated at *some* location within the bounds of the data. \n", "\n", "\n", "i.e. the more complicated (sharply varying) the function is, the higher the error *could* be.\n", "\n", "This result is sometimes called the [*Lagrange remainder theorem*](https://en.wikipedia.org/wiki/Polynomial_interpolation#Interpolation_error) - only click on this if you're feeling brave!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Exercise 1.3: Approximating a function \n", "\n", "Sample the function $y(x)=x^3$ at the points $x=(1,2,3)$. \n", "\n", "Write your own Python function to construct the Lagrange polynomials $L_0$ (the constant interpolant going through the $x=2$ data point only), $L_1$ (the linear interpolant going through the $x=1$ and $x=3$ points) and $L_2$ (the quadratic interpolant going through all three points). Plot the resulting polynomials along with the error compared to the original exact function.\n", "\n", "**Tip**: Using the function [fill_between](http://matplotlib.org/examples/pylab_examples/fill_between_demo.html) provides a nice way of illustrating the difference between graphs." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Newton polynomial\n", "\n", "Calculating the Newton polynomial (also called [Newton's divided difference interpolation polynomial](http://mathworld.wolfram.com/NewtonsDividedDifferenceInterpolationFormula.html)) yields the same polynomial as the Lagrange polynomial method (remember that the polynomial of minimum degree to pass through each data point is unique), but is arguably easier to implement.\n", "\n", "To derive this approach we write our degree $N$ polynomial in the following form\n", "\n", "\n", "$$ P_N(x) = a_0 +(x-x_0)a_1 + (x-x_0)(x-x_1)a_2 + \\cdots + (x-x_0)(x-x_1)\\ldots(x-x_N)a_N,$$\n", "\n", "\n", "where $a_0, a_1, \\ldots, a_N$ are our $N+1$ free parameters we need to find using the $N+1$ pieces of information we have in the given data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Efficient derivation of an algorithm to compute the Newton polynomial follows from noticing that we can write this polynomial in a *recursive form*. \n", "\n", "Consider for example a case with $N=3$:\n", "\n", "\n", "\\begin{align}\n", "P_3(x) &= a_0 +(x-x_0)a_1 + (x-x_0)(x-x_1)a_2 + (x-x_0)(x-x_1)(x-x_2)a_3\\\\[5pt]\n", "&= a_0 +(x-x_0)[a_1 + (x-x_1)[a_2 + (x-x_2)a_3]].\n", "\\end{align}\n", "\n", "\n", "Notice that substituting in the $x_i$ values leads to a set of simultaneous equations where we can easily evaluate the unknowns $a_0, a_1, \\ldots$ using 'back (or forward) substitution' (we'll see what this means in the example that follows, and we will also return to this idea in Lecture 5/6). \n", "\n", "We'll see an example of this now ..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "1. Substitute $x=x_0$: We have $a_0 = P_3(x_0)$, and we know that our interpolant $P_3(x)$ evaluated at $x_0$ must return $y_0$. Hence, \n", "\n", "$$a_0 = y_0.$$\n", "\n", "\n", "2. Now substitute $x=x_1$: We have $P_3(x_1) = a_0 +(x_1-x_0)a_1 = y_0 +(x_1-x_0)a_1 $, the LHS of this is $y_1$, and we know everything on the RHS as we have already calculated $a_0 = y_0$. We can thus trivially rearrange to yield\n", "\n", "$$ a_1 = \\frac{(y_1 - y_0)}{(x_1-x_0)}.$$\n", "\n", "\n", "3. Substituting $x=x_2$ yields \n", "\n", "\n", "\\begin{align*}\n", "& y_2 = P_3(x_2) = a_0 +(x_2-x_0)[a_1 + (x_2-x_1)a_2] = y_0 + (x_2-x_0)\\left[ \\frac{(y_1 - y_0)}{(x_1-x_0)} + (x_2-x_1)a_2\\right]\\\\[5pt]\n", "&\\implies a_2 = \\frac{ \\frac{(y_2 - y_0)}{(x_2-x_0)} - \\frac{(y_1 - y_0)}{(x_1-x_0)}}{x_2-x_1}.\n", "\\end{align*}\n", "\n", "\n", "4. And so on ..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To define an algorithm for this method in general let's first introducing the following [*divided difference*](https://en.wikipedia.org/wiki/Divided_differences) notation\n", "\n", "\\begin{alignat*}{2}\n", "\\Delta y_i &= \\frac{y_i-y_0}{x_i-x_0},\\;\\; && i=1,2,\\ldots, N,\\\\[10pt]\n", "\\Delta^2 y_i &= \\frac{\\Delta y_i-\\Delta y_1}{x_i-x_1},\\;\\; && i=2, 3,\\ldots, N,\\\\[10pt]\n", "&\\vdots\\\\[5pt]\n", "\\Delta^N y_N &= \\frac{\\Delta^{N-1} y_N-\\Delta^{N-1} y_{N-1}}{x_N-x_{N-1}}.\n", "\\end{alignat*}\n", "\n", "\n", "With a bit of thought we can hopefully see from the above example that the coefficients of the interpolating polynomial in the general case are given by\n", "\n", "\n", "$$a_0=y_0,\\;\\;\\;\\;\\; a_1 = \\Delta y_1, \\;\\;\\;\\;\\; a_2 = \\Delta^2 y_2, \\;\\;\\;\\;\\; \\ldots \\;\\;\\;\\;\\; a_N = \\Delta^N y_N.$$" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# consider the above example data again\n", "xi = np.array([0.5, 2.0, 4.0, 5.0, 7.0, 9.0])\n", "yi = np.array([0.5, 0.4, 0.3, 0.1, 0.9, 0.8])\n", "\n", "\n", "def calculate_newton_poly_coeffs(xi, yi):\n", " \"\"\" Evaluate the coefficients a_i recursively using Newton's method\n", " \"\"\"\n", " # initialise the array 'a' with yi, but take a copy to ensure we don't\n", " # overwrite our yi data!\n", " a = yi.copy()\n", "\n", " # we have N+1 data points, and so\n", " N = len(a) - 1\n", "\n", " # for each k, we compute Δ^k y_i from the a_i = Δ^(k-1) y_i of the previous iteration:\n", " for k in range(1, N+1):\n", " # but only for i>=k\n", " for i in range(k, N+1):\n", " a[i] = (a[i] - a[k-1])/(xi[i]-xi[k-1])\n", "\n", " return a\n", "\n", "\n", "# Given the coefficients a, and the data locations xi,\n", "# define a function to evaluate the Newton polynomial\n", "# at locations given in the array x.\n", "# NB. this is just an evaluation of the P_n(x) = ... formula\n", "# given at the start of this section.\n", "\n", "def eval_newton_poly(a, xi, x):\n", " \"\"\" Function to evaluate the Newton polynomial\n", " at x, given the data point xi and the polynomial coeffs a\n", " \"\"\"\n", " N = len(xi) - 1 # polynomial degree\n", " # recursively build up polynomial evaluated at x\n", " P = a[N]\n", " for k in range(1, N+1):\n", " P = a[N-k] + (x - xi[N-k])*P\n", " return P" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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hx/Os88+y9atW8nLywu6vCuuuIK3336bdevWAa7m/+qrrzJy5Mhy4xARiQcJW3OvqAa9bdvOqBom9b777qNv377cfPPN+722ePFi3nvvvaA142+//ZY+ffqQmZnJQ74PnZ+fz/XXX09hYSH5+fm0bNmSdevW7UvuwWzdupX169fTv3//UtOPO+44Xn/99VLTevbsue//Aw88EIAffvih3M/Xt2/fUqMH9uvXj9tvv52tW7eyfPlykpKS6Nev377XmzRpwuGHH86yZcuCLi89PZ3DDz+cp59+mr///e8899xzNGvWrNSpCBGReKWae4w4+uijOfvss7nlllv2e624uJhTTz2Vzz77rNTfypUrOe200wB3XnvFihWsXLmSRYsWkZmZSWZmJnPnziU/P5/OnTvTrl27CuMINnxv4LTk5OT9XvM/f15V1toqxVPi8ssv56mnngJck/yIESOoFepzLSIiUSjiyd0Y86Qx5gdjzJflzJNpjPnMGLPUGPNuJOOLZnfffTfz5s3jzTffLDW9d+/eLF26lNTUVDp37lzqr6T1oeS8e25uLp07d6Z169YMGjSI999/n1mzZpWqtZecY/e/g17jxo058MADmT9/fql1z58/nx49etT4s3300UelkviHH37IgQceSOPGjenRowfFxcUsWLBg3+tbt25lyZIl5a77oosuYt26dYwfP55PPvmESy+9tMZxiojEAi9q7hOBwWW9aIxpCjwGDLXWHgqcG6G4ol7nzp3Jzs7m4YcfLjX96quvZsuWLZx//vl89NFHfPfdd7zzzjtkZ2ezbdu2ffNlZGQwadIkBg0aBEBaWhqtWrVi6tSppZJ769atqV+/Pm+99RabNm1iy5YtAIwaNYpx48bx/PPPs2LFCkaPHs28efO46aabavzZ1q9fz1/+8he+/vprpkyZwtixY7nhhhsA6NKlC8OGDePKK69k3rx5LFmyhIsuuojGjRtz4YUXlrnMJk2acO6553LTTTcxcODAfVcDiIjEu4gnd2vte8Av5cxyITDVWrvGN3/5J2sTzOjRo6ldu3RXiQMPPJD333+fpKQkBg8ezKGHHsrVV19N3bp1qVu37r75Bg0axN69e0sl8szMzP2m1a5dm0ceeYQnnniCAw88kGHDhgFw3XXXMWrUKP76179y2GGH8corr/Dyyy+X6ilfXVlZWezdu5dj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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "\n", "# add a small margin \n", "ax1.margins(0.1)\n", "\n", "# Evaluate the coefficients of the Newton polynomial\n", "a = calculate_newton_poly_coeffs(xi, yi)\n", "# Evaluate the polynomial at high resolution and plot\n", "x = np.linspace(0.4, 9.1, 100)\n", "ax1.plot(x, eval_newton_poly(a, xi, x), 'b', label='Newton poly')\n", "\n", "# Overlay raw data\n", "plot_raw_data(xi, yi, ax1)\n", "ax1.set_title('Newton interpolating polynomial (our implementation)', fontsize=16)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=14);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Curve fitting\n", "Curve-fitting in the [least squares](http://mathworld.wolfram.com/LeastSquaresFitting.html) sense is popular when the dataset contains noise (nearly always the case when dealing with real world data). \n", "\n", "This is straightforward to do for polynomials of different polynomial degree using [numpy.polyfit](http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html), as we shall now see." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# consider the above example data again\n", "xi=np.array([0.5,2.0,4.0,5.0,7.0,9.0])\n", "yi=np.array([0.5,0.4,0.3,0.1,0.9,0.8])\n", "\n", "# Calculate coefficients of polynomial degree 0 - ie a constant value.\n", "poly_coeffs=np.polyfit(xi, yi, 0)\n", "\n", "# Construct a polynomial function which we can use to evaluate for arbitrary x values.\n", "p0 = np.poly1d(poly_coeffs)\n", "\n", "# Fit a polynomial degree 1 - ie a straight line.\n", "poly_coeffs=np.polyfit(xi, yi, 1)\n", "p1 = np.poly1d(poly_coeffs)\n", "\n", "# Quadratic\n", "poly_coeffs=np.polyfit(xi, yi, 2)\n", "p2 = np.poly1d(poly_coeffs)\n", "\n", "# Cubic\n", "poly_coeffs=np.polyfit(xi, yi, 3)\n", "p3 = np.poly1d(poly_coeffs)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "ax1.margins(0.1)\n", "\n", "x = np.linspace(0.4, 9.1, 100)\n", "\n", "ax1.plot(x, p0(x), 'k', label='Constant')\n", "ax1.plot(x, p1(x), 'b', label='Linear')\n", "ax1.plot(x, p2(x), 'r', label='Quadratic')\n", "ax1.plot(x, p3(x), 'g', label='Cubic')\n", "\n", "# Overlay raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "ax1.legend(loc='best', fontsize = 12)\n", "ax1.set_title('Polynomial approximations of differing degree', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Exercise 1.4: Squared error calculation\n", "\n", "As described in the docs ([numpy.polyfit](http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html)), least squares fitting minimises the sum of the squares of the differences between the data provided and the polynomial approximation, i.e. it minimises the expression\n", "\n", "$$E = \\sum_{i=0}^{N} (P(x_i) - y_i)^2,$$\n", "\n", "where $P(x_i)$ is the value of the polynomial function that has been fit to the data evaluated at point $x_i$, and $y_i$ is the $i^{th}$ data value.\n", "\n", "\n", "\n", "*(Wikipedia: https://en.wikipedia.org/wiki/Linear_least_squares) We're computing the sum of the squares of the distances indicated in green.*\n", "\n", "\n", "\n", "Write a Python function that evaluates the squared error, $E$, and use this function to evaluate the error for each of the polynomials calculated above.\n", "\n", "**Tip**: Try to pass the function *p* in as an argument to your error calculation function. One of the great features of Python is that it is easy to pass in functions as arguments.\n", "\n", "Why is the square of the difference used? " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Exercise 1.5: Degree of approximation \n", "\n", "Extend the example above by fitting and plotting polynomials of increasing degree past cubic. At what *degree* does the resulting polynomial approximation equate to the Lagrange interpolant?\n", "\n", "Why does this make sense? \n", "\n", "**Hint**: think about the number of free parameters in a polynomial, and the amount of data you have." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Extrapolation\n", "\n", "*Interpolation* by definition is used to estimate $y$ for values of $x$ within the bounds of the available data (here $[0.5,9]$) with some confidence. *Extrapolation* on the other hand is the process of estimating (e.g. using the interpolating function) $y$ *outside* the bounds of the available data. However, extrapolation requires a great deal of care as it will become increasingly inaccurate as you go further out of bounds." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Exercise 1.6: Extrapolation \n", "\n", "Recreate the plots in the example above for different degrees of polynomial, setting the x-range from -2.0 to 11.0. What do you notice about extrapolation when you use higher degree polynomials." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "### Exercise 1.7: Submarine landslide size in the North Atlantic \n", "\n", "Open the data file [Length-Width.dat](data/Length-Width.dat) (located in the data directory) giving the lengths and widths of submarine landslides in the North Atlantic basin [from [Huhnerbach & Masson, 2004](http://www.sciencedirect.com/science/article/pii/S0025322704002774), Fig. 7]. Fit a linear best fit line using polyfit and try to recreate the image below.\n", "\n", "**Hint**: You will need to take the log of the data before fitting a line to it. \n", "\n", "![\"Cloud of point data for submarine landslide widths and depths in the North Atlantic, and a correspondong best (linear) curve fit.\"](images/Width-Length.png)\n", "\n", "\n", "Reference: [V. Huhnerbach, D.G. Masson, Landslides in the North Atlantic and its adjacent seas:\n", "an analysis of their morphology, setting and behaviour, Marine Geology 213 (2004) 343 – 362.](http://www.sciencedirect.com/science/article/pii/S0025322704002774)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": false, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "211.478px" }, "toc_section_display": false, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }