{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Trapezoid rule" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "# n intervals, n+1 points\n", "def trapz(a,b,n,f):\n", " h = (b-a)/n\n", " x = np.linspace(a,b,n+1)\n", " y = f(x)\n", " res = np.sum(y[1:n]) + 0.5*(y[0] + y[n])\n", " return h*res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "$$\n", "f(x) = x, \\qquad x \\in [0,1]\n", "$$\n", "Exact integral is 0.5" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Integral = 0.5\n" ] } ], "source": [ "f = lambda x: x\n", "print(\"Integral = \", trapz(0.0,1.0,10,f))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "$$\n", "f(x) = x^2, \\qquad x \\in [0,1]\n", "$$\n", "Exact integral is $1/3$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Integral = 0.3350000000000001\n" ] } ], "source": [ "f = lambda x: x**2\n", "print(\"Integral = \", trapz(0.0,1.0,10,f))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "$$\n", "f(x) = \\exp(x)\\cos(x), \\qquad x \\in [0,\\pi]\n", "$$\n", "The exact integral is $-\\frac{1}{2}(1+\\exp(\\pi))$." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 4 -1.26567653098185e+00\n", " 8 -3.11816113365945e-01 4.05905e+00\n", " 16 -7.76577835071954e-02 4.01526e+00\n", " 32 -1.93958006245669e-02 4.00385e+00\n", " 64 -4.84778281250620e-03 4.00096e+00\n", " 128 -1.21187271271594e-03 4.00024e+00\n", " 256 -3.02963615787633e-04 4.00006e+00\n", " 512 -7.57406187865683e-05 4.00002e+00\n", " 1024 -1.89351368735657e-05 4.00000e+00\n", " 2048 -4.73378310594796e-06 4.00000e+00\n" ] } ], "source": [ "f = lambda x: np.exp(x)*np.cos(x)\n", "qe = -0.5*(1.0 + np.exp(np.pi)) # Exact integral\n", "\n", "n,N = 4,10\n", "e = np.zeros(N)\n", "for i in range(N):\n", " e[i] = trapz(0.0,np.pi,n,f) - qe\n", " if i > 0:\n", " print('%6d %24.14e %14.5e'%(n,e[i],e[i-1]/e[i]))\n", " else:\n", " print('%6d %24.14e'%(n,e[i]))\n", " n = 2*n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "\n", "An example of a periodic function\n", "$$\n", "f(x) = \\exp(\\sin(x)), \\qquad x \\in [0,2\\pi]\n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2 -1.67174121383321e+00\n", " 3 -2.82600848168890e-04\n", " 4 3.43969188092368e-02\n", " 5 -3.45941231216784e-09\n", " 6 -2.82600848168890e-04\n", " 7 3.46389583683049e-14\n", " 8 1.25168897735506e-06\n", " 9 4.52970994047064e-14\n", " 10 -3.45941053581100e-09\n", " 11 4.44089209850063e-14\n", " 12 6.57429666262033e-12\n", " 13 4.35207425653061e-14\n", " 14 3.46389583683049e-14\n", " 15 4.44089209850063e-14\n", " 16 4.61852778244065e-14\n" ] } ], "source": [ "f = lambda x: np.exp(np.sin(x))\n", "qe = 7.9549265210128 # Exact integral\n", "\n", "n,N = 2,15\n", "e = np.zeros(N)\n", "for i in range(N):\n", " e[i] = trapz(0.0,2*np.pi,n,f) - qe\n", " print('%6d %24.14e'%(n,e[i]))\n", " n = n + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The error converges rapidly to machine zero. It is very small for even number of points." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 3 -2.82600848168890e-04\n", " 5 -3.45941231216784e-09\n", " 7 3.46389583683049e-14\n", " 9 4.52970994047064e-14\n", " 11 4.44089209850063e-14\n", " 13 4.35207425653061e-14\n", " 15 4.44089209850063e-14\n", " 17 4.52970994047064e-14\n", " 19 4.52970994047064e-14\n", " 21 4.52970994047064e-14\n" ] } ], "source": [ "n,N = 3,10\n", "e = np.zeros(N)\n", "for i in range(N):\n", " e[i] = trapz(0.0,2*np.pi,n,f) - qe\n", " print('%6d %24.14e'%(n,e[i]))\n", " n = n + 2" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }