{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Numerical Methods 1\n", "\n", "# Lecture 3: Numerical integration" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Learning objectives:\n", "\n", "* Be able to compute the integral of a function numerically in 1D\n", "* Implement several simple algorithms\n", "* Understand the concept of order of algorithm and how to improve accuracy" ] }, { "cell_type": "code", "execution_count": 1, "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": [ "# Numerical integration or Quadrature\n", "\n", "[*Quadrature*](https://en.wikipedia.org/wiki/Numerical_integration) is the term used for numerical evaluation of a *definite* (i.e. over a range $[a,b]$) integral, or in 1D finding the area under a curve. \n", "\n", "\n", "\n", "*(Wikipedia: https://upload.wikimedia.org/wikipedia/commons/f/f2/Integral_as_region_under_curve.svg)*\n", "\n", "If we have a function in 1D, $f(x)$, defined between $a$ and $b$, the *definite* [*integral*](http://en.wikipedia.org/wiki/Integral) over $[a,b]$ is defined as \n", "\n", "$$ I := \\int_{a}^{b} f\\left ( x \\right )\\,dx, $$\n", "\n", "and its result is the area under the curve. [We'll use the notation $I$ for this quantity we wish to calculate although $S$ is used in the figure above].\n", "\n", "Knowing the value of the area under a curve is important to all kinds of applications. \n", "\n", "However, many expressions/functions we may encounter for these curves are difficult to integrate analytically, or the function which governs their shape is unknown, and we may only have data at a finite number of discrete points (cf. one of the interpolation use cases from the last lecture), and thus need to evaluate the integral approximately/numerically.\n", "\n", "*Numerical integration* therefore has to be a fundamental part of any course on numerical methods." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "A fundamental property of a definite integral is that\n", "\n", "\\begin{equation}\n", "\\int_{a}^{b} f\\left ( x \\right )dx = \\int_{a}^{c} f\\left ( x \\right )dx + \\int_{c}^{b} f\\left ( x \\right )dx\n", "\\end{equation}\n", "\n", "where $c$ is a point between $a$ and $b$. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Therefore, we can equally well perform our integration by splitting the function up into a number of smaller intervals and summing the result of each individual integration over the interval.\n", "\n", "If the function is complicated or unknown, we can approximate its value within each of these intervals -- we have now performed a numerical *discretisation* of the function and in this case our associated numerical method to compute the integral is termed a *quadrature* or *numerical integration* method." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "As with previous lectures, the choice of approximation method, as well as the size of the intervals, will control the error. Better methods as well as smaller (i.e. more to cover our total interval of interest: $[a,b]$) sub-intervals will lead to lower errors, but will generally cost more to compute.\n", "\n", "Here the following quadrature methods will be covered in the context of a simple function:\n", "\n", "* Midpoint rule\n", "* Trapezoid rule\n", "* Simpson's rule\n", "* Composite Simpson's rule\n", "* Weddle's rule." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Integration example\n", "\n", "\n", "Let's begin with a simple function to demonstrate some of the most basic methods for performing numerical integration:\n", "\n", "$$f\\left ( x \\right ) := \\sin \\left ( x \\right ),$$\n", "\n", "and assume that we want to know what the area under the $\\,\\sin\\,$ function between 0 and $\\pi$, i.e. $[a,b]=[0,\\pi]$.\n", "\n", "The indefinite integral (or anti-derivative) of $\\,\\sin \\left ( x \\right )\\,$ is of course $\\,-\\cos \\left ( x \\right )\\,$ (plus a constant of integration, $C$, which we can simply ignore as we saw above as it drops out as soon as we perform a *definite* integral).\n", "\n", "Since we know the indefinite integral exactly in this case, we can perform the definite integration (i.e. find the area under the curve) ourselves exactly by hand:\n", "\n", "$$I := \\int_{0}^{\\pi} \\sin \\left ( x \\right ) = \\left [ -\\cos\\left ( x \\right )+ C \\right ]_{0}^{\\pi} =-\\cos\\left ( \\pi \\right ) - (-\\cos\\left ( 0 \\right )) =-\\cos\\left ( \\pi \\right ) + \\cos\\left ( 0 \\right ) = -(-1) + 1 = 2.\n", "$$\n", "\n", "[We included the constant $C$ here to just to emphasise again the fact that it's present doesn't matter - we can legitimately just not write it down in this type of expression.]\n", "\n", "Let's start by plotting the function between these points." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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wChgKjA8hDDFzK4zsyOi3W4HagEvmNkXZjYipnALNXOmN2/WresT6NWrF3dEIiIikkq1at41ac894bjj4MMP444otThr0gghjARGJm0blPB7lzIPqhjmzfOlJ9at86UoGjeOOyIRERHZmNq14Y03YL/9fEWgMWNg113jjuqvcmjMYTwWLfKZjH/91SesbdEi7ohERESkKOrX99avWrX8szzb1vlUklYCy5dD9+7r1+P8xz/ijkhERETSsd1269f5PPhgr3TJFkrSimnNGh/FOXYsPPmk1uMUEREpr1q18gF/c+Z4//I//4w7IqckrRhCgHPOgVdegXvugeOPjzsiERERKYl99vGps778Eo4+GlZmwaRfStKKYdAgeOQRX+rpvPPijkZERERKw6GHwqOPwrvvwimn+IDAOMU6urM8uv9+uOEGOPNMXzRdREREcscpp3i/tAEDYNWqHejc2SfBjYNq0tIwfLgvlt69Ozz4YHwvmoiIiGRO//5w8cXw3/9uw803xxeHkrQievdd6NUL9t0Xnn0WqqgOUkREJCeZwe23Q5cuvzBwoHdxioNSjSKYOBGOOgp22glGjIAaNeKOSERERDKpUiUYMGAalSs34OyzfU617t3LOIayPV358+23Phx3iy3gzTehTp24IxIREZGyULVq4MUXYa+94IQT4H//K9vzK0nbiF9+8eWe1q71ie603JOIiEjFUquWLx+17ba+fNSUKWV3biVpBVi82GvQfv7ZXxwt9yQiIlIx5S8fVaOGr0rwww9lc14laSmsXOl90L76Cl56Cdq0iTsiERERiVPTpvDWW74aQdeusGBB5s+pJC3JunVw8snw/vvw2GP+QoiIiIjsuqsPIPzuO2/6XLYss+dTkpYgBLjwQp8P7fbboXfvuCMSERGRbNKxIzzzDHz8MRx3nK/lnSlK0hLccgvcd59PYNe/f9zRiIiISDY6+mh44AHvs3722V7JkwmaJy3y+ONw5ZXQs6fXoomIiIgUpG9fmDcPrrsOtt4abryx9M+hJA3PhM86Cw480PuhVVL9ooiIiBRi8GCfBeKmm6BhQ+jXr3SPX+GTtPHj4dhjYffdfSRntWpxRyQiIiLlgRkMGeLzqp5/PjRo4DlFaanQdUbTpsGhh0KjRl6bVrt23BGJiIhIeVKliq/pvc8+vsb3Bx+U3rErbJL2008+IV2V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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set up figure\n", "fig = plt.figure(figsize=(10, 4))\n", "ax1 = plt.subplot(111)\n", "\n", "# Get the value of pi from numpy and generate 100 equally spaced values from 0 to pi.\n", "x = np.linspace(0, np.pi, 100)\n", "\n", "# Calculate sin at these points.\n", "y = np.sin(x)\n", "\n", "# plot\n", "ax1.plot(x, y, 'b')\n", "\n", "# Set x axis limits between 0 and pi.\n", "ax1.set_xlim([0, np.pi])\n", "ax1.set_ylim([0, 1.1])\n", "\n", "# Label axis.\n", "ax1.set_xlabel('$x$', fontsize=16)\n", "ax1.set_ylabel('$f(x)=\\sin(x)$', fontsize=16)\n", "ax1.set_title('An example function we wish to integrate', fontsize=16)\n", "\n", "# Overlay a grid.\n", "ax1.grid(True);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now let's investigate the different quadrature rules, finding the area under the curve and seeing how it differs from the true area which we know is 2." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Rule 1: Midpoint rule\n", "\n", "The *midpoint rule* is perhaps the simplest quadrature rule. \n", "\n", "For reasons you will see below it is sometimes also called the *rectangle method*.\n", "\n", "Consider one of the subintervals $\\,[x_i, x_{i+1}].$\n", "\n", "The midpoint rule approximates the integral over this (the $i$-th) subinterval by the area of a rectangle, with a base of length $\\,(x_{i+1}-x_i)\\,$ and a height given by the value of $\\,f(x)\\,$ at the midpoint of that interval (i.e. at $\\,x=(x_{i+1}+x_i)/2$):\n", "\n", "$$ I_M^{(i)} := (x_{i+1}-x_i) \\;\\; \\times \\;\\; f \\left ( \\frac {x_{i+1}+x_i} {2} \\right ), \\;\\;\\;\\;\\;\\;\\text{for}\n", "\\;\\;\\;\\;\\;\\; 0\\le i \\le n-1.$$\n", "\n", "The midpoint estimate of $I$ then simply involves summing up over all the subintervals:\n", "\n", "$$I_M := \\sum_{i=0}^{n-1} \\, f \\left ( \\frac {x_{i+1}+x_i} {2} \\right )\\, (x_{i+1}-x_i).$$\n", "\n", "Let's write some code to plot the idea as well as compute an estimate of the integral using the midpoint rule.\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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E62mO+6ohLqy1K4NWVl+u+gi78s9caJ/8Rk71ruSPP+838xgjz0KOPJIr2zSunXc0YtITaAEW0SkmBC87+/IkZ6gff89wOUAbLghdO/utwMOUGWLqqJevaKrB7fcArNmebL90kvejWfiRL9dcIEPJu3VC3r39uosIiLpoARbRAT47DN44glPrL/5pmj5ppvCjz/eDYzil1/Glzg5i1QtrVrBmWf67a+/PNl+/nl4+eWietxXXgm77ALHHw/HHOM1xEVEUkX/KkSkxpo9Gx55BB5/3BPshE039RbOo4+GnXeG2rXPBUqe+VCqtsaNoXdv77uzaFHgjTfgqadg9GivR/7BB96y3aULnHQSHHUUaOZoEVlb+nchIjXKkiU+qclDD8Grr3rNavDuH0cd5S2ae+2lih/VUf36RV18Fi70LiRPPun9thMDJs89179YnXoq7Lmn+tWLSMUowRaRGuHTT2HYMO8GkqhRXbcuHHEEnHwyHHSQSrvVJA0aeNeQY47xqdyffRZGjPDqMA895LettvJE+7TTfDp6EZGyUhuNiFRbixfDY495XeQOHeDuuz253mknuPNO7yLy7LNeym11yXWnTp1U6q0aa9IEzjjDB0JOnw6XXeYT18yYAVdc4TXNjz7aW7hDiDtaEckEasEWkWrn66/h/vu9FXLuXF/WuDH06QOnn+4JdnkUFBSkPkipkrbZBv7zH7j+eq9AMmwYvPCCfxF79lnYdlsfPLnllvr3KSKl018IEakWQvBpym+/3atFJFoaO3WCs87yqbgbNow3RskctWtDt25++/FHGD7ck+3p02HgQKhfvzOnngrnneezdIqIFKcuIiKS0RYv9umyO3SA/fbzgWv16sEpp8D770N+vl/+V3ItFbXppnDNNT5RzfPPew30xYtrc9990LatTzT0+uvqPiIiRdSCLSIZac4c71N9773w22++rGVLOOcc6NcPmjdP3b4sKiURlEFlpKFDh6ZkO3XqwOGH++2hhz5g8uRdeOQRr7P9yivQrh1ceCGccIIGzIrUdGrBFpGM8t13cP75PpnItdd6ct2xo9eznjXLJxBJZXItmS8nJ4ecnJyUbrNNm4UMHQo//OB9tjfZxKdoP+00+Ne/4LbbYP78lO5SRDKIEmwRyQhTp3o5vS23hLvu8jrGhxwCeXlQUOCThKjVUCpb06ZedeTbb+HR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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "The sum of the areas of the rectangles is (I_M): 2.033281476926\n" ] } ], "source": [ "# this is a matplotlib function that allows us to easily plot rectangles\n", "# which will be useful for visualising what the midpoint rule does\n", "from matplotlib.patches import Rectangle\n", "\n", "\n", "def f(x):\n", " \"\"\"The function we wish to integrate\"\"\"\n", " return np.sin(x)\n", "\n", "\n", "# Get the value of pi from numpy and generate equally spaced values from 0 to pi.\n", "x = np.linspace(0, np.pi, 100)\n", "y = f(x)\n", "\n", "# plot\n", "fig = plt.figure(figsize=(12, 4))\n", "ax1 = plt.subplot(111)\n", "ax1.plot(x, y, 'b', lw=2)\n", "\n", "ax1.margins(0.1)\n", "\n", "# Label axis.\n", "ax1.set_xlabel('$x$', fontsize=16)\n", "ax1.set_ylabel('$f(x)=\\sin(x)$', fontsize=16)\n", "ax1.set_title('Approximating a function with rectangles', fontsize=16)\n", "\n", "# Overlay a grid.\n", "ax1.grid(True)\n", "\n", "number_intervals = 5\n", "xi = np.linspace(0, np.pi, number_intervals+1)\n", "I_M = 0.0\n", "for i in range(number_intervals):\n", " ax1.add_patch(Rectangle((xi[i], 0.0), (xi[i+1] - xi[i]),\n", " f((xi[i+1]+xi[i])/2), fill=False, ls='--', color='k', lw=2))\n", " I_M += f((xi[i+1]+xi[i])/2)*(xi[i+1] - xi[i])\n", "\n", "# use an explicit show here to force the figure to appear before the following print.\n", "plt.show()\n", "print('The sum of the areas of the rectangles is (I_M): {:.12f}'.format(I_M))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Note that in what follows we assume that we have been given the function $f(\\cdot)$ such that we can evaluate it anywhere. However, this comes at a cost ($f$ could be incredibly complex and expensive to evaluate just once) and so in our quadrature methods we want good accuracy without excessive numbers of function evaluations.\n", "\n", "The result of the integration over the entire interval of interest is then just the sum of the integrals over all the sub-intervals, i.e. the sum of the areas of all the small rectanges. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "A complex example looks like this, where the red line shows the original function we wish to compute the integral of, and the blue rectangles *approximate* the area under that function for a number of sub-intervals:\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementing a midpoint rule function\n", "\n", "Clearly the sum of the areas of all the rectangles provides an estimate of the true integral. In the case above we observe an error of around 1.5%.\n", "\n", "[Note that the SciPy module features many different integration functions, and you can find thorough documentation for these functions (including methods not covered in this course) [here](http://docs.scipy.org/doc/scipy/reference/integrate.html). This library does not contain a function for the midpoint rule, but it is trivial to create our own.]\n", "\n", "As we are going to compare different rules below, let's implement a midpoint rule function." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "midpoint_rule(0, np.pi, np.sin, number_intervals=5) = 2.033281476926104\n" ] } ], "source": [ "def midpoint_rule(a, b, function, number_intervals=10):\n", " \"\"\" Our implementation of the midpoint quadrature rule.\n", " \n", " a and b are the end points for our interval of interest.\n", " \n", " 'function' is the function of x \\in [a,b] which we can evaluate as needed.\n", " \n", " number_intervals is the number of subintervals/bins we split [a,b] into.\n", " \n", " Returns the integral of function(x) over [a,b].\n", " \"\"\"\n", " interval_size = (b - a)/number_intervals\n", "\n", " # Some examples of some asserts which might be useful here - \n", " # you should get into the habit of using these sorts of checks as much as is possible/sensible.\n", " assert interval_size > 0\n", " assert type(number_intervals) == int\n", " \n", " # Initialise to zero the variable that will contain the cumulative sum of all the areas\n", " I_M = 0.0\n", " \n", " # Find the first midpoint -- i.e. the centre point of the base of the first rectangle\n", " mid = a + (interval_size/2.0)\n", " # and loop until we get past b, creating and summing the area of each rectangle\n", " while (mid < b):\n", " # Find the area of the current rectangle and add it to the running total\n", " # this involves an evaluation of the function at the subinterval midpoint\n", " I_M += interval_size * function(mid)\n", " # Move the midpoint up to the next centre of the interval\n", " mid += interval_size\n", "\n", " # Return our running total result\n", " return I_M\n", "\n", "# check the function runs and agrees with our first version used to generate the schematic plot of the method above:\n", "print('midpoint_rule(0, np.pi, np.sin, number_intervals=5) = ', midpoint_rule(0, np.pi, np.sin, number_intervals=5))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The exact area found by direct integration = 2\n", "Area 1 rectangle(s) = 3.14159 (error=1.14159)\n", "Area 2 rectangle(s) = 2.22144 (error=0.221441)\n", "Area 10 rectangle(s) = 2.00825 (error=0.00824841)\n", "Area 100 rectangle(s) = 2.00008 (error=8.22491e-05)\n", "Area 1000 rectangle(s) = 2 (error=8.22467e-07)\n" ] } ], "source": [ "# Now let's test the midpoint function. \n", "print(\"The exact area found by direct integration = 2\")\n", "for i in (1, 2, 10, 100, 1000):\n", " area = midpoint_rule(0, np.pi, np.sin, i)\n", " print(\"Area %d rectangle(s) = %g (error=%g)\"%(i, area, abs(area-2)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Observations\n", "\n", "\n", "- With one rectangle, we are simply finding the area of a box of shape $\\pi\\, \\times$ 1 ($\\pi$ is the width of the rectangle and $1$ is the value of the function evaluated at the midpoint, $\\pi/2$), so of course the result is $\\pi$. \n", "\n", "\n", "- As we increase the number of subintervals, or rectangles, we increase the accuracy of our area.\n", "\n", "\n", "- We can observe from the slope of the log-log plot of error against number of subintervals that the error is a quadratic function of the inverse of the number of subintervals (or equivalently is quadratically dependent on the spacing between the points - the interval size). \n", "\n", "\n", "- This demonstrates that (for this particular example at least), the method demonstrates second-order accuracy - if we halve the interval size the error goes down by a factor of 4!\n", "\n", "\n", "- The simplicity of this method is its weakness, as rectangles (i.e. a flat top) are rarely a good approximation for the shape of a smooth function. \n", "\n", "\n", "- We want to use as few shapes as possible to approximate our function, because each additional rectangle is one extra time round the loop, which includes its own operations as well as an extra evaluation of the function, and hence increases the overall computational cost. \n", "\n", "\n", "- Instead, let's consider another shape that follows the profile a little better ..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Exercise 3.1: Midpoint rule convergence plot\n", "\n", "Plot the log-log plot mentioned above." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Rule 2: Trapezoid rule\n", "\n", "If we change the shape of the rectangle to a trapezoid (i.e. the top of the shape now being a linear line fit defined by the values of the function at the two end points of the subinterval, rather than the constant value used in the midpoint rule), we arrive at the trapezoid, or trapezoidal, rule. \n", "\n", "The trapezoid rule approximates the integral by the area of a trapezoid with base $(x_{i+1}-x_i)$ and the left- and right-hand-sides equal to the values of the function at the two end points. \n", "\n", "In this case the area of the shape approximating the integral over one subinterval, is given by:\n", "\n", "$$I_T^{(i)} := (x_{i+1}-x_i) \\;\\; \\times \\;\\; \n", "\\left( \\frac {f\\left ( x_{i+1}\\right ) + f \\left (x_{i} \\right )} {2} \\right)\n", "\\;\\;\\;\\;\\;\\;\\text{for}\n", "\\;\\;\\;\\;\\;\\; 0\\le i \\le n-1.$$\n", "\n", "The trapezoidal estimate of $I$ then simply involves summing up over all the subintervals:\n", "\n", "$$I_T := \\sum_{i=0}^{n-1}\\, \\left(\\frac{f(x_{i+1}) + f(x_{i})}{2}\\right )\\, (x_{i+1}-x_i). $$\n", "\n", "Let's write some code to plot the idea and compute an estimate of the integral." ] }, { "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" }, { "name": "stdout", "output_type": "stream", "text": [ "The sum of the areas of the trapezoids is (I_T): 1.933765598093\n" ] } ], "source": [ "# this is a matplotlib function that allows us to plot polygons\n", "from matplotlib.patches import Polygon\n", "\n", "\n", "def f(x):\n", " \"\"\"The function we wish to integrate\"\"\"\n", " return np.sin(x)\n", "\n", "\n", "# Get the value of pi from numpy and generate equally spaced values from 0 to pi.\n", "x = np.linspace(0, np.pi, 100)\n", "y = f(x)\n", "\n", "# plot\n", "fig = plt.figure(figsize=(12, 4))\n", "ax1 = plt.subplot(111)\n", "ax1.plot(x, y, 'b', lw=2)\n", "\n", "ax1.margins(0.1)\n", "\n", "# Label axis.\n", "ax1.set_xlabel('$x$', fontsize=16)\n", "ax1.set_ylabel('$\\sin(x)$', fontsize=16)\n", "ax1.set_title('Approximating function with trapezoids', fontsize=16)\n", "\n", "# Overlay a grid.\n", "ax1.grid(True)\n", "\n", "number_intervals = 5\n", "xi = np.linspace(0, np.pi, number_intervals+1)\n", "I_T = 0.0\n", "for i in range(number_intervals):\n", " ax1.add_patch(Polygon(np.array([[xi[i], 0], [xi[i], f(xi[i])], [\n", " xi[i+1], f(xi[i+1])], [xi[i+1], 0]]), closed=True, fill=False, ls='--', color='k', lw=2))\n", " I_T += ((f(xi[i+1]) + f(xi[i]))/2)*(xi[i+1] - xi[i])\n", "\n", "plt.show()\n", "print('The sum of the areas of the trapezoids is (I_T): {:.12f}'.format(I_T))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For our pictorial example used above the approximation looks like it should be more accurate than the midpoint rule:\n", "\n", "\n", "\n", "the tops of the shapes (now trapezoids) are approximating the variation of the function with a linear function, rather than a flat (constant) function. This looks like it should give more accurate results, but see below.\n", "\n", "Note that numpy has a function for the trapezoid rule, numpy.trapz, but we'll make our own that works in a similar way to our midpoint rule function." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Exercise 3.2: Complete the implementation of the trapezoid rule below\n", "\n", "Test your function in a similar way to above, compute another log-log plot of the error and compare with the midpoint rule." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def trapezoidal_rule(a, b, function, number_intervals=10):\n", " \"\"\"Our implementation of the trapezoidal quadrature rule.\n", " \n", " Note that as discussed in the lecture this version of the implementation \n", " performs redundant function evaluations - see the composite implementation \n", " in the homework for a more efficient version.\n", " \"\"\"\n", " interval_size = (b - a)/number_intervals\n", "\n", " assert interval_size > 0\n", " assert type(number_intervals) == int\n", "\n", " I_T = 0.0\n", "\n", " # Loop to create each trapezoid\n", " # note this function takes a slightly different approach to Midpoint \n", " # (a for loop rather than a while loop) to achieve the same thing\n", " for i in range(number_intervals):\n", "\n", " \n", " # add your code here!\n", " \n", " \n", "\n", " # Return our running total result\n", " return I_T" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "print(\"The exact area found by direct integration = 2\")\n", "for i in (1, 2, 10, 100, 1000):\n", " area = trapezoidal_rule(0, np.pi, np.sin, i)\n", " print(\"Area %d trapezoid(s) = %g (error=%g)\"%(i, area, abs(area-2)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You should have found the following errors:\n", "\n", "`The area found by direct integration = 2`\n", "\n", "`Area 1 trapezoid(s) = 1.92367e-16 (error=2)`\n", "\n", "`Area 2 trapezoid(s) = 1.5708 (error=0.429204)`\n", "\n", "`Area 10 trapezoid(s) = 1.98352 (error=0.0164765)`\n", "\n", "`Area 100 trapezoid(s) = 1.99984 (error=0.000164496)`\n", "\n", "`Area 1000 trapezoid(s) = 2 (error=1.64493e-06)`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Error analysis\n", "\n", "Another observation here is that in this particular case of half a sine wave, the trapezoid rule always *under-estimates* the area, whereas the midpoint rule *over-estimates*. \n", "\n", "Perhaps most surprisingly, the midpoint rule is more accurate than the trapezoid rule - the reason for this is not immediately obvious from the discussions and the images above.\n", "\n", "The accuracy of a quadrature rule is predicted by examining its behaviour in practice with *polynomials*. \n", "\n", "We say that the **degree of accuracy** or the **degree of precision** of a quadrature rule is equal to $M$ if it is exact for all polynomials of degree up to and including $M$, but not exact for some polynomial of degree $M+1$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Clearly both the midpoint and trapezoid rules will give the exact result for both constant and linear functions,\n", "\n", "but they are not exact for quadratics [you could test our codes yourself on the function $x^2$ to demonstrate this].\n", "\n", "Therefore, they have a degree of precision of 1." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "For the \"concave-down\" (i.e. the first half of a sine wave) function we chose above, notice from the plot that the trapezoidal rule will **consistently underestimate** the area under the curve, as the line segments approximating the function are always under the concave function curve.\n", "\n", "In contrast, the mid-point rule will have parts of each rectangle above and below the curve, hence to a certain extent the **errors will cancel** each other out. \n", "\n", "This is why, *for this particular example*, the errors in the mid-point rule turn out to be approximately half those in the trapezoidal rule. \n", "\n", "While this result turns out to be *generally* true for smooth functions, we can always come up with (counter) examples where the trapezoid rule will win (can you think of an example?).\n", "\n", "Taylor series analysis can be used to formally construct upper bounds on the quadrature error for both methods. \n", "\n", "We know that the error when integrating constant and linear functions is zero for our two rules, so let's first consider an example of integrating a quadratic polynomial.\n", "\n", "We know analytically that\n", "\n", "$$\\int_{0}^{1} x^{2}\\,dx = \\left.\\frac{1}{3}x^3\\right|_0^1=\\frac {1}{3}.$$\n", "\n", "Numerically, the midpoint rule on a single interval gives\n", "\n", "\\begin{equation}\n", "I_M = 1 \\left(\\frac {1}{2}\\right)^{2} = \\frac {1}{4},\n", "\\end{equation}\n", "\n", "while the trapezoidal rule gives\n", "\n", "\\begin{equation}\n", "I_T = 1 \\frac {0+1^{2}}{2} = \\frac {1}{2}.\n", "\\end{equation}\n", "\n", "The error for $I_M$ is therefore $1/3 - 1/4 = 1/12$, while the error for $I_T$ is $1/3 - 1/2 = -1/6$.\n", "\n", "Therefore, the midpoint rule is twice as accurate as the trapezoid rule:\n", "\n", "$$|E_M| = \\frac{1}{2} |E_T|,$$\n", "\n", "where $|E|$ indicates the error (the absolute value of the difference from the exact solution).\n", "\n", "This is the case for this simple example, and we can see from the actual error values printed above that it also appears to be approximately true for the sine case (which is not a simple polynomial) as well.\n", "\n", "We will use this knowledge to generate new more accurate rules below, but first let's sketch how you can go about a more rigorous analysis/estimation of errors." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Rule 3: Simpson's rule\n", "\n", "Knowing the error estimates from the two rules explored so far opens up the potential for us to combine them in an appropriate manner to create a new quadrature rule, generally more accurate than either one separately. \n", "\n", "Suppose $I_S$ indicates an unknown, but more accurate, estimate of the integral over an interval. \n", "\n", "Then, as seen above, as $I_T$ has an error that is approximately $-2$ times the error in $I_M$, the following relation must hold approximately:\n", "\n", "\n", "$$I_S - I_T \\approx -2 \\left ( I_S - I_M\\right ).$$\n", "\n", "\n", "This follows from the fact that $\\,I - I_T \\approx -2 \\left ( I - I_M\\right )$, provided that $I_S$ is closer to $I$ than either of the other two estimates." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Replacing this approximately equals sign with actual equality defines $I_S$ for us in terms of things we know. \n", "\n", "We can rearrange this to give an expression for $I_S$ that yields a more accurate estimate of the integral than either $I_M$ or $I_T$:\n", "\n", "$$I_S := \\frac{2}{3}I_M + \\frac{1}{3}I_T.$$\n", "\n", "What we're doing here is using the fact that we know something about (the *leading order* behaviour of the) two errors, and we can therefore combine them to cancel this error to a certain extent.\n", "\n", "This estimate will generally be more accurate than either $M$ or $T$ alone. The error won't actually be zero in general as we're only cancelling out the leading order term in the error, but a consequence is that we will be left with higher-degree terms in the error expansion of the new quadrature rule which should be smaller (at least in the asymptotic limit), and converge faster. \n", "\n", "The resulting quadrature method in this case is known as [Simpson's rule](http://en.wikipedia.org/wiki/Simpson%27s_rule):\n", "\n", "\\begin{align*}\n", "I_S &:= \\frac{2}{3}I_M + \\frac{1}{3}I_T \\\\[5pt]\n", "&= \\frac{2}{3} (b-a)f\\left ( \\frac{a+b}{2}\\right ) + \\frac{1}{3}(b-a)\\frac{(f(a) + f(b))}{2} \\\\[5pt]\n", "& = \\frac{(b-a)}{6}\\left( f \\left ( a\\right ) + 4f \\left ( c\\right ) + f\\left ( b\\right )\\right),\n", "\\end{align*}\n", "\n", "where $a$ and $b$ are the end points of an interval and $c = \\left ( a+b\\right )/2$ is the midpoint.\n", "\n", "\n", "Note that an alternate derivation of the same rule involves fitting a *quadratic function* (i.e. $P_2(x)$ rather than the constant and linear approximations already considered) that interpolates the integral at the two end points of the interval, $a$ and $b$, as well as at the midpoint, $c = \\left ( a+b\\right )/2$, and calculating the integral under that polynomial approximation.\n", "\n", "See the homework exercise, and note that we'll come back to this idea a bit later when we introduce the Newton-Cotes family of quadrature rules.\n", "\n", "Let's plot what this method is doing and compute the integral for our sine case." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "The Simpson's rule approximation (I_S): 2.000109517315\n" ] } ], "source": [ "# this is a matplotlib function that allows us to plot polygons\n", "# use this to plot the straight sides, and add an approximate\n", "# quadratic at the top.\n", "from matplotlib.patches import Polygon\n", "\n", "def f(x):\n", " \"\"\"The function we wish to integrate\"\"\"\n", " return np.sin(x)\n", "\n", "# Get the value of pi from numpy and generate equally spaced values from 0 to pi.\n", "x = np.linspace(0, np.pi, 100)\n", "y = f(x)\n", "\n", "# plot\n", "fig = plt.figure(figsize=(12, 4))\n", "ax1 = plt.subplot(111)\n", "ax1.plot(x, y, 'b', lw=2)\n", "\n", "ax1.margins(0.1)\n", "\n", "# Label axis.\n", "ax1.set_xlabel('x', fontsize=16)\n", "ax1.set_ylabel('sin(x)', fontsize=16)\n", "ax1.set_title('Approximating a function with shapes with quadratic tops', fontsize=16)\n", "\n", "# Overlay a grid.\n", "ax1.grid(True)\n", "\n", "number_intervals = 5\n", "xi = np.linspace(0, np.pi, number_intervals+1)\n", "\n", "I_S = 0.0\n", "\n", "for i in range(number_intervals):\n", " # use a non-closed Polygon to visualise the straight sides of each interval \n", " ax1.add_patch(Polygon(np.array([[xi[i], f(xi[i])], [xi[i], 0], [xi[i+1], 0], [xi[i+1], f(xi[i+1])]]),\n", " closed=False, fill=False, ls='--', color='k', lw=2))\n", " # add the quadratic top - fit a quadratic using numpy\n", " poly_coeff = np.polyfit((xi[i], (xi[i] + xi[i+1])/2.0, xi[i + 1]),\n", " (f(xi[i]), f((xi[i] + xi[i+1])/2.0), f(xi[i+1])), 2)\n", " # plot the quadratic using 20 plotting points within the interval \n", " ax1.plot(np.linspace(xi[i], xi[i+1], 20),\n", " f(np.linspace(xi[i], xi[i+1], 20)), ls='--', color='k', lw=2)\n", " # add in the area of the interval shape to our running total using Simpson's formula\n", " I_S += ((xi[i+1] - xi[i])/6.) * (f(xi[i]) + 4 *\n", " f((xi[i] + xi[i+1])/2.0) + f(xi[i+1]))\n", "\n", "plt.show()\n", "print(\"The Simpson's rule approximation (I_S): {:.12f}\".format(I_S))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "It looks like a much closer fit to the function:\n", "\n", "\n", "\n", "Let's make a function to test it out..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Exercise 3.3: Implementing Simpson's rule\n", "\n", "Complete an implementation of Simpson's rule and test it on our sine function." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def simpsons_rule(a, b, function, number_intervals=10):\n", " \"\"\" Function to evaluate Simpson's rule. \n", " \n", " Note that this implementation takes the function as an argument, \n", " and evaluates this at the midpoint of subintervals in addition to the \n", " end point. Hence additional information is generated and used through \n", " additional function evaluations. \n", " \n", " This is different to the function/implementation available with SciPy \n", " where discrete data only is passed to the function. \n", " \n", " Bear this in mind when comparing results - there will be a factor of two\n", " in the definition of \"n\" we need to be careful about!\n", " \n", " Also note that this version of the function performs redundant function \n", " evaluations - see the **composite** implementation below.\n", " \"\"\"\n", "\n", " # Add your code here!\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "print(\"The area found by direct integration = 2\")\n", "for i in (1, 2, 10, 100, 1000):\n", " area = simpsons_rule(0, np.pi, np.sin, i)\n", " print(\"Area %d rectangle(s) = %g (error=%g)\"%(i, area, abs(area-2)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You should find:\n", "\n", "`The area found by direct integration = 2`\n", "\n", "`Area 1 rectangle(s) = 2.0944 (error=0.0943951)`\n", "\n", "`Area 2 rectangle(s) = 2.00456 (error=0.00455975)`\n", "\n", "`Area 20 rectangle(s) = 2 (error=4.23093e-07)`\n", "\n", "`Area 200 rectangle(s) = 2 (error=4.228e-11)`\n", "\n", "`Area 2000 rectangle(s) = 2 (error=2.22045e-15)`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "For this simple function you should find far smaller errors, and which drop much more rapidly with smaller $h$ (or more sub-intervals).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Observations\n", "\n", "\n", "- The errors are lower than for the midpoint and trapezoidal rules, and the method converge more rapidly - i.e. the relative improvement only gets better for more subintervals.\n", "\n", "\n", "- This expression now integrates up to cubics exactly (by construction), so it is of order 4 (as confirmed by the convergence plot above).\n", "\n", "\n", "- We're getting down to errors close to machine precision now when we use 1000 subintervals. But remember we may well either have a relatively small number of data points, or want to minimise the number of function evaluations well below this relatively high number. This will mean that for problems with lots of variation, and/or in higher dimensions, that we still work to do in improving our quadrature methods.\n", "\n", "\n", "- As was the case with our first Trapezoidal implementation, we are performing unnecessary function evaluations here; we can fix this issue through the implementation of a so-called *composite* version of the rule." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Rule 4: Composite Simpson's Rule\n", "\n", "\n", "If we assume that our interval $[a,b]$ has been split up into $n$ intervals (or $n+1$ data points) we can save some function evaluations by writing Simpson's Rule in the following form (note here we do not introduce any additional midpoint function evaluations)\n", "\n", "\\begin{align*}\n", "I_{S} \n", "& = \\frac{\\Delta x}{3}\\left[ f \\left ( x_0\\right ) + 4f \\left ( x_1\\right ) + 2f\\left ( x_2\\right ) + 4f \\left ( x_3\\right ) + \\cdots + 2 f \\left ( x_{n-2}\\right ) + 4 f \\left ( x_{n-1}\\right ) + f \\left ( x_{n}\\right ) \\right]\\\\[5pt]\n", "& = \\frac{\\Delta x}{3}\\left[ f \\left ( x_0\\right ) + 2\\sum_{i=1}^{n/2 - 1} f\\left(x_{2i}\\right) + 4\\sum_{i=1}^{n/2} f\\left(x_{2i-1}\\right) + f \\left ( x_{n}\\right ) \\right].\n", "\\end{align*}\n", "\n", "This is known as the [Composite Simpson's rule](http://en.wikipedia.org/wiki/Simpson%27s_rule#Composite_Simpson.27s_rule), \n", "or more precisely the *composite Simpson's 1/3 rule*.\n", "\n", "This is the version of Simpson's rule implemented by Scipy [`scipy.interpolate.simps`](http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.simps.html).\n", "\n", "\n", "Note that this way of formulating Simpson's rule (where we do not allow additional function evaluations at the midpoints of intervals - we assume we are only in a position to use the given data points) requires that $n$ be even.\n", "\n", "This way of writing the composite form in the case of $n=2$ is equivalent to the formula over $[a,b]$ that introduced the additional midpoint location $c$." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def simpsons_composite_rule(a, b, function, number_intervals=10):\n", " \"\"\"Function to evaluate the composite Simpson's rule only using\n", " function evaluations at (number_intervals + 1) points.\n", " \n", " This implementation requires that the number of subintervals (number_intervals) be even\n", " \"\"\"\n", " assert number_intervals % 2 == 0, \"number_intervals is not even\"\n", "\n", " interval_size = (b - a) / number_intervals\n", " # start with the two end member values\n", " I_cS2 = function(a) + function(b)\n", "\n", " # add in those terms with a coefficient of 4\n", " for i in range(1, number_intervals, 2):\n", " I_cS2 += 4 * function(a + i * interval_size)\n", "\n", " # and those terms with a coefficient of 2\n", " for i in range(2, number_intervals-1, 2):\n", " I_cS2 += 2 * function(a + i * interval_size)\n", "\n", " return I_cS2 * (interval_size / 3.0)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The area found by direct integration = 2\n", "Area 2 rectangle(s) = 2.0944 (error=0.0943951)\n", "Area 10 rectangle(s) = 2.00011 (error=0.000109517)\n", "Area 100 rectangle(s) = 2 (error=1.08245e-08)\n", "Area 1000 rectangle(s) = 2 (error=1.07869e-12)\n" ] } ], "source": [ "print(\"The area found by direct integration = 2\")\n", "for i in (2, 10, 100, 1000):\n", " area = simpsons_composite_rule(0, np.pi, np.sin, i)\n", " print(\"Area %d rectangle(s) = %g (error=%g)\"%(i, area, abs(area-2)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This is a slight improvement for a simple function like $\\sin$, but will be much more of an improvement for functions which oscillate more, in a relative sense compared to the size of our bins. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Rule 5: Weddle's rule\n", "\n", "We noted above that Simpson's rule is fourth-order accurate.\n", "\n", "Suppose we take an approximation to $I$ using $n$ intervals with Simpson's rule and call the result $I_S$, and then apply Simpson's rule with double the number of intervals ($2n$) and call the result $I_{S_2}$. \n", "\n", "Then we have two estimates for the integral where we expect $I_{S_2}$ to be approximately $2^4=16$ times more accurate than $S$. In particular, we expect the lowest (i.e. the leading) order error term in $I_{S_2}$ to be precisely one sixteenth that of $I_S$.\n", "\n", "Similar to how we derived Simpson's rule by combining what we knew of the error for the midpoint and trapezoidal rules, with this knowledge we can combine the two estimates from Simpson's rule to derive an even more accurate estimate of $I$:\n", "\n", "Let's call this more accurate rule $I_W$, which we can find by solving:\n", "\n", "$$I_W - I_S = 16 \\left ( I_W - I_{S_2} \\right ),$$\n", "\n", "for $I_W$.\n", "\n", "A bit of manipulation:\n", "\n", "\\begin{align*}\n", "& \\;\\;\\; I_W - I_S = 16 \\left ( I_W - I_{S_2} \\right ) \\\\[5pt]\n", "\\implies & \\;\\;\\; I_W - I_S = 16 I_W - 16 I_{S_2} \\\\[5pt]\n", "\\implies & \\;\\;\\; 15 I_W = 16 I_{S_2} - I_S \\\\[5pt]\n", "\\implies & \\;\\;\\; 15 I_W = 15 I_{S_2} + (I_{S_2} - I_S) ,\n", "\\end{align*}\n", "\n", "leads us to the expression\n", "\n", "$$ I_W = I_{S_2} + \\frac {\\left (I_{S_2} - I_S \\right )}{15}.$$\n", "\n", "This is known as *Weddle's rule*, or the *extrapolated Simpson's rule* because it uses two different values for the interval size and *extrapolates* from these two to obtain an even more accurate result. \n", "\n", "Making a function for this rule is easy as we can just call our Simpson's rule functions with two values for the number of intervals.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Exercise 3.4: Implementing Weddle's rule\n", "\n", "Write a function which implements Weddle's rule using appropriate calls to the simpsons and simpsons_composite functions written above.\n", "\n", "Ultimately you should be able to generate a comparison image that looks something like this:\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Aside: (Richardson) extrapolation, Romberg integration and Newton-Cotes formula\n", "\n", "Note that the above technique of using the same rule, but with different values for the interval size, $h$, to derive a more accurate estimate of the integral is an example of what is more generally called *Richardson extrapolation*. \n", "\n", "Performing this approach using the trapezoid rule as the starting point leads to what is termed *Romberg integration*.\n", "\n", "Taking the idea behind Simpson's rule which fit a quadratic Lagrange interpolating polynomial to *equally spaced* points in the interval, end extending to any order Lagrange polynomial leads to the [*Newton-Cotes* family of quadrature rules](https://en.wikipedia.org/wiki/Newton%E2%80%93Cotes_formulas).\n", "\n", "Note finally, that even wider families exist where the function being integrated is evaluated at non-equally-spaced points.\n", "\n", "And of course for practical application these ideas need to be extended to more than one dimension." ] }, { "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.7" }, "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": "974.226px", "left": "28px", "top": "147.357px", "width": "427.513px" }, "toc_section_display": false, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }