{ "metadata": { "name": "trapezoid_rule" }, "nbformat": 2, "worksheets": [ { "cells": [ { "cell_type": "markdown", "source": [ "Basic numerical integration: the trapezoid rule", "===============================================", "", "**Illustrates**: basic array slicing, functions as first class objects.", "", "In this exercise, you are tasked with implementing the simple trapezoid rule", "formula for numerical integration. If we want to compute the definite integral", "", "$$", " \\int_{a}^{b}f(x)dx", "$$", "", "we can partition the integration interval $[a,b]$ into smaller subintervals,", "and approximate the area under the curve for each subinterval by the area of", "the trapezoid created by linearly interpolating between the two function values", "at each end of the subinterval:", "", "", "", "The blue line represents the function $f(x)$ and the red line", "is the linear interpolation. By subdividing the interval $[a,b]$, the area under $f(x)$ can thus be approximated as the sum of the areas of all", "the resulting trapezoids. ", "", "If we denote by $x_{i}$ ($i=0,\\ldots,n,$ with $x_{0}=a$ and", "$x_{n}=b$) the abscissas where the function is sampled, then", "", "$$", " \\int_{a}^{b}f(x)dx\\approx\\frac{1}{2}\\sum_{i=1}^{n}\\left(x_{i}-x_{i-1}\\right)\\left(f(x_{i})+f(x_{i-1})\\right).", "$$", "", "The common case of using equally spaced abscissas with spacing $h=(b-a)/n$ reads simply", "", "$$", " \\int_{a}^{b}f(x)dx\\approx\\frac{h}{2}\\sum_{i=1}^{n}\\left(f(x_{i})+f(x_{i-1})\\right).", "$$", "", "One frequently receives the function values already precomputed, $y_{i}=f(x_{i}),$", "so the equation above becomes", "", "$$", " \\int_{a}^{b}f(x)dx\\approx\\frac{1}{2}\\sum_{i=1}^{n}\\left(x_{i}-x_{i-1}\\right)\\left(y_{i}+y_{i-1}\\right).", "$$" ] }, { "cell_type": "markdown", "source": [ "## Exercises", "", "### 1", "", "Write a function `trapz(x, y)`, that applies the trapezoid formula to pre-computed values, ", "where `x` and `y` are 1-d arrays." ] }, { "cell_type": "code", "collapsed": true, "input": [], "language": "python", "outputs": [], "prompt_number": " " }, { "cell_type": "markdown", "source": [ "### 2 ", "", "Write a function `trapzf(f, a, b, npts=100)` that accepts a function `f`, the endpoints `a`", "and `b` and the number of samples to take `npts`. Sample the function uniformly at these", "points and return the value of the integral." ] }, { "cell_type": "code", "collapsed": true, "input": [], "language": "python", "outputs": [], "prompt_number": " " }, { "cell_type": "markdown", "source": [ "### 3", "", "Verify that both functions above are correct by showing that they produces correct values ", "for a simple integral such as $\\int_0^3 x^2$." ] }, { "cell_type": "code", "collapsed": true, "input": [], "language": "python", "outputs": [], "prompt_number": " " }, { "cell_type": "markdown", "source": [ "### 4", "", "Repeat the integration for several values of `npts`, and plot the error as a function of `npts` ", "for the integral in #3." ] }, { "cell_type": "code", "collapsed": true, "input": [], "language": "python", "outputs": [], "prompt_number": " " } ] } ] }