{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Numerical Integration and Differentiation\n", "====\n", "\n", "## Unit 9, Lecture 3\n", "\n", "*Numerical Methods and Statistics*\n", "\n", "----\n", "\n", "#### Prof. Andrew White, March 28, 2017" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Numerical Differentiation\n", "====\n", "\n", "Given a set of points $x$ and $f(x)$, how do I compute $f'(x)$?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The best you can do is compute an estimate for $f'(x)$ at each of the points. Recall the definition of a derivative:\n", "\n", "$$f'(x) = \\lim_{h\\rightarrow 0} \\frac{f(x + h) - f(x)}{h}$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "An easy way to estimate at a particular point, say the 4th data point, $f'(x_4)$ is to use:\n", "\n", "$$f'(x_4) \\approx \\frac{f(x_5) - f(x_4)}{x_5 - x_4}$$\n", "\n", "[Show secant picture]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The Forward Numerical Derivative\n", "====\n", "\n", "$$f'(x_i) \\approx \\frac{f(x_{i+1}) - f(x_i)}{x_{i+1} - x_i}$$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.arange(0,5,0.5) #Create some points\n", "y = x ** 2 #Create the square of those points, now we have f(x_i)\n", "derivative = [] #This is where I will store the answer\n", "\n", "#Since this if the forward derivative, we can only go up to the second to last point\n", "for i in range(len(x) - 1): \n", " dx = x[i + 1] - x[i]\n", " dy = y[i + 1] - y[i]\n", " derivative.append(dy / dx)\n", " \n", "#We have to \"repair\" our problem of skipping the last point\n", "#We just repeat the last element\n", "derivative.append(derivative[-1])\n", " \n", "plt.plot(x,derivative)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Forward Rule in 1 line with Numpy\n", "====" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\nSQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Using numpy\n", "#Note x[1:] is all but the first element\n", "#x[:-1] is all but the last element\n", "#So x[1:] - x[:-1] is an idiom for x[1] - x[0], x[2] - x[1], x[3] - x[2], .....\n", "derivative = (y[1:] - y[:-1]) / (x[1:] - x[:-1])\n", "\n", " #Here I just skip the last point instead of adding it to the derivative\n", "plt.plot(x[:-1], derivative)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Central Difference Rule\n", "====\n", "\n", "Obviously going only forward seems unintuitive. That leads to the central difference rule. You approximate the derivative with the average of the forward and backward approximations. Be careful with the indexes!\n", "\n", "$$f'(x_i) = \\frac{1}{2}\\left[\\frac{f(x_{i+1})- f(x_i)}{x_{i + 1} - x_{i}} + \\frac{f(x_{i})- f(x_{i-1})}{x_{i} - x_{i-1}}\\right]$$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "forward = (y[1:] - y[:-1]) / (x[1:] - x[:-1])\n", "backward = forward #They're the same numbers, but in forwards we start at 0 go to N-1 and\n", " #in backwards we start at 1 and go to N\n", "central = 0.5 * (forward[:-1] + backward[1:])# Combine the two \n", "\n", "plt.plot(x[1:-1], central)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8jef/x/HXjRB7bzLslUViix1bzZZWa9WolqovsaNG\nS1VbLVqNUW2pFVtR1Ig9EwQxYoYgEiKRIeP6/XEiv6h17uyTfJ6Ph0dJ7vtzrnOafHLnOtd9vTWl\nFEIIIUxHtvQegBBCCH2kcQshhImRxi2EECZGGrcQQpgYadxCCGFipHELIYSJkcYthBAmRhq3EEKY\nGGncQghhYnKkRtFixYopKyur1CgthBCZ0qlTpx4qpYobc2yqNG4rKytOnjyZGqWFECJT0jTtprHH\nylSJEEKYGGncQghhYqRxCyGEiUmVOe5XiY6Oxt/fn8jIyLR6SGGizM3NKVeuHGZmZuk9FCEypDRr\n3P7+/uTPnx8rKys0TUurhxUmRilFUFAQ/v7+WFtbp/dwhMiQ0myqJDIykqJFi0rTFm+kaRpFixaV\n38yEeIM0neOWpi2MIV8nQryZvDkphDBtwddh5ySIi0u3ITyLfYb7yY0M3vxtmjxelmrc2bNnx97e\nHjs7O2rXrs3hw4eTVKdfv354eHik8Ohez8rKiocPH77y4zY2NtjY2FCjRg0mTZpEVFQUAHfv3qVH\njx4Jx/bu3RtbW1t++OEHfH19sbe3x8HBAT8/vzR7HkKkuHMesLAJnP4DgtP2a1kphfcDb6YdmU7D\nv5oy7/xkjj3cwuPwiFR/7DR7czIjyJ07N97e3gD8888/jB8/nv3796fzqF4UExNDjhzG/2/Zu3cv\nxYoVIywsjMGDBzN48GB+//13ypQpk/DD5d69exw+fJibNw03Zs2aNYt33nmHqVOnGv04sbGxZM+e\nXd+TESK1PHsK21zBezmUrwfdF0MhizR56Nuht9l6bStb/bZyK/QWmsrJsyc1qFO0FfN7vkuhPLlT\nfQxZ6oo7sSdPnlC4cGEAwsLCaNmyJbVr18bGxoZNmzYlHPfHH39ga2uLnZ0dH3744Ut1Jk+eTL9+\n/Th+/DjdunUDYNOmTeTOnZtnz54RGRlJhQoVAFi0aBFOTk7Y2dnRvXt3wsPDAcMV/KhRo2jevDlj\nx44lKCgIFxcXHBwcGDJkCEqptz6ffPnysXDhQjZu3EhwcDA3btygVq1aALi4uPDgwQPs7e2ZOnUq\nc+fOZfHixTRv3hyA5cuXU7duXezt7RkyZAixsbEJNd3c3KhXrx5Hjhzh1KlTNG3alDp16tCmTRsC\nAgIAaNasGWPHjqVu3bpUqVKFAwcOAIZmP3r0aGxsbLC1tWXevHkAr60jhFECzsKvTcF7BTQZDf22\npXrTfvLsCR6XPei7vS/t17fnF+9fyKUVIXtQL6KvTWZaw69Z/v5HFE6Dpg3pdMU9dct5Ltx9kqI1\na5QpwJRONd94TEREBPb29kRGRhIQEMCePXsAw7rhDRs2UKBAAR4+fEj9+vXp3LkzFy5c4KuvvuLQ\noUMUK1aM4ODgF+q5uroSEhLCb7/9RmxsLF5eXgAcOHCAWrVqceLECWJiYqhXrx4A3bp1Y9CgQQBM\nmjSJJUuWMHz4cAAuX77M7t27yZ49OyNGjKBx48a4ubnx999/4+7ubtRrUKBAAaytrbly5QolS5ZM\n+PjmzZvp2LFjwm8bSiny5cvH6NGjuXjxIqtXr+bQoUOYmZkxbNgwVqxYwUcffcTTp0+pVasW06ZN\nIzo6mqZNm7Jp0yaKFy/O6tWrmThxIkuXLgUMvykcP36cbdu2MXXqVHbv3o27uzvXr1/Hy8uLHDly\nEBwcTHR0NMOHD39tHSFeSyk47m6Yz85dBD7aBBWaptrDRcdFc+jOIbb4bWHf7X08i3uGdUFrPrUb\nzo0b1Vh1NJTqpQsw7zMHKpXIl2rjeJUsO1Vy5MgRPvroI3x8fFBKMWHCBDw9PcmWLRt37tzh/v37\n7Nmzhx49elCsWDEAihQpklBr+vTp1KtXL6Gp5siRg0qVKnHx4kWOHz/OqFGj8PT0JDY2liZNmgDg\n4+PDpEmTePz4MWFhYbRp0yahXs+ePROmIjw9PVm/fj0AHTp0SPjNwBjGXJ0n9u+//3Lq1CmcnJwA\nww+3EiVKAIb3BLp37w7ApUuX8PHxoXXr1oDharp06dIJdZ7/tlGnTh1u3LgBwO7duxk6dGjC1E+R\nIkXw8fF5Yx0hXik8GDZ9Cpe2QeU20OVnyFssxR9GKcWFoAts9tvMjhs7CI4MpnCuwvSs2pNOFTqR\nW1kyYpUXPnee0K+hFePaVcPcLO2nENOlcb/tyjgtNGjQgIcPHxIYGMi2bdsIDAzk1KlTmJmZYWVl\nRWRkJEqp1y5Nc3Jy4tSpUwQHByc09CZNmrB9+3bMzMxo1aoV/fr1IzY2ljlz5gCGKZGNGzdiZ2fH\nsmXL2LdvX0K9vHnzvlA/KUviQkNDuXHjBlWqVCEkJMSoc5RS9O3bl5kzZ770OXNz84QfJkopatas\nyZEjR15ZJ1euXICh2cfExCSc89/n8bY6QrzkxkFYNwieBkKbmVD/E0jhJaMBYQH8ff1vNvtt5nrI\ndXJmy0mz8s3oXLEzDcs2xCybGetP+zN540HMcmTD/cM6uNQslaJj0CPLznH7+voSGxtL0aJFCQkJ\noUSJEpiZmbF3796EN/FatmzJmjVrCAoKAnhhqqRt27aMGzeODh06EBoaCoCzszNz586lQYMGFC9e\nnKCgIHx9falZ0/CDKjQ0lNKlSxMdHc2KFSteOzZnZ+eEz2/fvp1Hjx699fmEhYUxbNgwunTpousK\nvWXLlnh4ePDgwYOE5/j8+SdWtWpVAgMDExpudHQ058+ff2NtFxcXFi5cmNDIg4ODk1RHZFGxMbB3\nJvzeCcxyw8e7ocGwFGvaT6OfsvHqRgb+M5A269rw4+kfKZyrMFMaTGHve3v5rtl3NC3flKhojS9W\nezNqzRlqli3I9s+bpGvThiw2VfJ8jhsMV36///472bNn54MPPqBTp044Ojpib29PtWrVAKhZsyYT\nJ06kadOmZM+eHQcHB5YtW5ZQr2fPnoSGhtK5c2e2bdtGvXr1uH//Ps7OzgDY2tpSokSJhKvO59Mr\nlpaW2NjYJDT8/5oyZQq9e/emdu3aNG3aFAuL17/x0rx5c5RSxMXF0bVrVyZPnqzrNalRowYzZszA\nxcWFuLg4zMzMWLBgAZaWli8clzNnTjw8PBgxYgQhISHExMQwcuTIhB9Kr/Lxxx9z+fJlbG1tMTMz\nY9CgQXz22We664gsKMTfcJV96zDY9Yb230Ku/MkuGxMXw9GAo2zx28KeW3uIjI3EIr8Fw+yH0bFC\nR8rlL/fC8ef8Qxi+8jS3gsP5olUVPmtRiezZ0v8GMU3vnKgxHB0d1X+DFC5evEj16tVT/LFE5iRf\nL1nYxa2G+ey4GOjwPdi9l+ySl4IvsdlvM9uub+NhxEMK5CxAO+t2dKzQEbvidi9N6cXFKZYeus43\nO3wpli8Xc9+zp16Foskex5tomnZKKeVozLFGXXFrmvYF8DGggHNAf6WUbCYhhEg50ZGwcyKcWAyl\n7aHHUihaMcnlHoQ/YNu1bWy+tpkrj66QI1sOnMs607liZ5qUa0LO7DlfeV5QWBSj155h76VAWtco\nyezuthTO++pj08tbG7emaWWBEUANpVSEpmlrgF7AslQemxAiqwi8BB4D4L4PNPgMWk6BHPqbZXh0\nOP/e+pet17ZyNOAocSoO2+K2TKw3kbZWbSlkXuiN5x+++pCRq715HBHNtHdq8mF9ywy5d46xc9w5\ngNyapkUDeYC7qTckIUSWoRR4/QnbxxregHx/LVRx0VUiTsVx/N5xtvhtYdfNXUTERFA2X1kG2Qyi\nY4WOWBW0emuN6Ng45u6+zM/7/KhQLC/L+telRpkCSXxSqe+tjVspdUfTtDnALSAC2KmU2pnqIxNC\nZG6RIbBlJJxfD9bO0NUdCuhb0/8w4iGTDk7i0N1D5DPLR3vr9nSq2AmHEg5k04xbNHc7OJzPV3lx\n+tZj3nMsz5TONciTM2Ov2zBmqqQw8A5gDTwG1mqa1kcptfw/xw0GBgNvXAUhhBD4nzRMjYT4Q0s3\naDQSsum7keXw3cNMODCBsOgwxtUdR/fK3THPYa6rxrZzAYxddxYUzOvtQCe7MrrOTy/G/FhpBVxX\nSgUCaJq2HmgIvNC4lVLugDsYVpWk8DiFEJlBXBwc/hH2zID8ZaD/drCop6tEdFw0873ms9RnKRUL\nVmSRyyIqF66sq0bEs1imbb3AyuO3sCtfiHm9HLAomkdXjfRkzO8St4D6mqbl0Qyz9C2Bi6k7rNTx\nfFvX53+e35qdnvbt20fHjh1f+fGCBQvi4OBA1apVcXZ2ZuvWrQmfX7hwIX/88QfAS9u0/vTTT1Sv\nXp0PPvggzZ6HEG8Veh+Wd4PdX0K1DjD0gO6m7R/qT7/t/Vjqs5QeVXqwsuNK3U370r1Q3llwkJXH\nbzG0aUU8hjYwqaYNxs1xH9M0zQM4DcQAXsRfWZuaxHuV6KF3q9U30bM9apMmTRKatbe3N126dCF3\n7ty0bNmSoUOHJhy3cePGF7Zp/fnnn9m+fbvRmY0p+fyEeKWru2HDUIgKhY5zoU4/3XdA7ri+g6lH\npqKhMafpHNpYtXn7SYkopVhx7BbTt14gv7kZfw6sS5PKxXXVyCiMmr1XSk1RSlVTStVSSn2olIpK\n7YGllcjISPr374+NjQ0ODg7s3bsXgGXLltGzZ086deqEi4sLw4YNY/PmzQB07dqVAQMGALBkyRIm\nTZoEQJcuXahTpw41a9Z8YUe//26PumPHDqpVq0bjxo0TNpN6G3t7e9zc3Jg/fz4AX375JXPmzGHb\ntm0vbNM6dOhQrl27RufOnfnhhx94+vQpAwYMwMnJCQcHh4Qta//7/AC+/fZbnJycsLW1ZcqUKQDc\nuHGD6tWrM2jQIGrWrImLiwsREYaN4q9evUqrVq0SgimehzK8qo7IomKeGXbzW94d8hSDwfvAsb+u\nph0eHc6Uw1MY4zmGioUqsrbzWt1NOyQ8mmErTjNpow91rYuw/fMmJtu0Ib1ued8+Du6dS9mapWyg\n3aw3HpL4lndra2s2bNjAggULADh37hy+vr64uLhw+fJlwLCD4NmzZylSpAirVq3iwIEDdO7cmTt3\n7iTsIX3w4EF69eoFwNKlSylSpAgRERE4OTnRvXt3ihYt+sL2qJGRkVSuXJk9e/ZQqVIl3nvP+LvC\nateuzbffvhiN1L59e4YOHZqwTSvAjh07EgIWJkyYQIsWLVi6dCmPHz+mbt26tGrV6qXnt3PnTq5c\nucLx48dRStG5c2c8PT2xsLDgypUrrFy5kkWLFvHuu++ybt06+vTpwwcffMC4cePo2rUrkZGRxMXF\nvbbO820ARBYSfA08BsLd0+A4ANp8bVjyp8Ol4EuM8RzDjZAbfGzzMcPsh2GWzUxXjZM3gvl8lTf3\nn0Qyvl01BjWpQLYMcNt6cmSp349fNVVy8ODBhD2xq1WrhqWlZULjbt269Qs7/82dO5cLFy5Qo0YN\nHj16REBAAEeOHOGnn34C4KeffmLDhg0A3L59mytXrlC0aNEXtkf19fXF2tqaypUN83J9+vQxer/t\npGxPsHPnTjZv3pywQ2FkZCS3bt166fnt3LmTnTt34uDgABg2rbpy5QoWFhZYW1sn/MB7vm1raGgo\nd+7coWvXroBhJ8E31ZHGncWc8zAs9cuWDd79A2q8o+t0pRSrLq1izok5FMhVAHcXd+qXrq+rRmyc\n4ue9V5n77xXKFsqNxycNsS//5htwTEX6NO63XBmnpTc1w8RbrZYtW5ZHjx6xY8cOnJ2dCQ4OZs2a\nNeTLl4/8+fOzb98+du/ezZEjR8iTJw/NmjUjMtKwK0Di7VEh6SnmXl5euvfvUEqxbt06qlat+sLH\njx079sLzU0oxfvx4hgwZ8sJxN27cSNiyFQxv8EZERLz2dXtdHZFFRIUZbqZJRqRYSFQIbofc2HN7\nD43LNmZGoxkUza1vn5B7IZF8sdqbI9eC6GxXhq+61iK/ub4r9Ywsy27r+lziLVQvX77MrVu3Xmpy\nzzVo0IC5c+fi7OxMkyZNmDNnTkJIQkhICIULFyZPnjz4+vpy9OjRV9aoVq0a169fT5gPXrlypVHj\nPHv2LNOnT+fTTz/V9fzatGnDvHnzEhrt85SeVx23dOlSwsLCALhz507CVq+vUqBAAcqVK8fGjRsB\niIqKIjw8XHcdkYkEnAX3ZoZIMecxSYoUO3X/FN03d8fzjiejHUezoOUC3U3734v3afejJ963HzO7\nhy0/9rLPVE0bsthUyasMGzaMoUOHYmNjQ44cOVi2bNkLV5iJNWnShJ07d1KpUiUsLS0JDg5OaNxt\n27Zl4cKF2NraUrVqVerXf/Wvdebm5ri7u9OhQweKFStG48aN8fHxeeWxBw4cwMHBgfDwcEqUKMFP\nP/1Ey5YtdT2/yZMnM3LkSGxtbVFKYWVl9cKywudcXFy4ePEiDRo0AAxvqC5fvvyNK2D+/PNPhgwZ\ngpubG2ZmZqxdu/a1dZ6n6ohMKHGkWJ6i0Hez4U5IHWLjYnE/687Cswspl68cy9stp2YxfVv9RsXE\nMmu7L78dumGIFOud9pFiaUW2dRUZkny9mIgUiBS79/Qe4w+M5+T9k3Ss0JFJ9SeR1yzv209M5Fpg\nGMNXenH+bvpGiiVHim/rKoQQL3keKRb+ENrOgnpDda/N3ntrL5MPT+ZZ7DO+avwVnSt21j2Mdaf8\nmbzJh5w5srHoI0da1yj59pNMnDRuIYQ+sTHgORs8v4XC1jBwF5Sx11UiKjaK709+z1++f1G9SHVm\nO882ahe/xMKiYpi80YcNXneoa12EH3vZU7qgvuWGpkoatxDCeC9Eir0P7WfrjhS7HnKdMfvHcOnR\nJfpU78MXdb54bajB62TUSLG0Io1bCGGcxJFiXd11R4oppdh4dSMzj88kV/ZczG8xn6blm+qq8d9I\nsVWDG1DXuoiuGpmBNG4hxJtFRxhWjCQjUizsWRjTjk5j+/XtOJVyYmbjmZTMq28u+mF8pNi+S4G4\n1CjJ7B62FMqTsSLF0oo0biHE6wVegrX94cH5JEeK+Tz0Ycz+MQQ8DWC4w3AG1hpIdp17bx+KjxQL\niYhm+js16ZNBI8XSSpa6AefevXv06tWLihUrUqNGDdq3b59we7tey5Yt4+5d/QluzzeHetXHy5Yt\ni729PZUrV6Zbt25cuHAh4fMff/xxwr/Xrl1L9erVad68OQC9e/fG1taWH374IUnPRYiXKAWnfodf\nm0LYffjAA9p8patpx6k4fvP5jQ+3fUisiuW3tr8x2HawrqYdHRvH7B2+9FlyjIK5zdj0aSM+bGCV\npZs2ZKErbqUUXbt2pW/fvqxatQowbJV6//59qlSporvesmXLqFWrFmXKvJyYoWfr1sS++OKLhI2i\nVq9eTYsWLTh37hzFixdn8eLFCcctWbKEn3/+mebNm3Pv3j0OHz7MzZs3jX4c2cZVvNELkWJNoZs7\n5C+lq0TiSLFWFq34suGXFMxVUFeN28HhjFjlhZcJRYqllSxzxb13717MzMxe2Mfa3t4+4c5HPVua\nenh4cPLkST744APs7e2JiIjAysqKadOm0bhxY9auXcuiRYtwcnLCzs6O7t27Ex4ermu87733Hi4u\nLvz1118ANGvWjJMnTzJt2jQOHjzI0KFDGTNmDC4uLjx48AB7e3sOHDiAn58fbdu2pU6dOjRp0gRf\nX18A+vXrx6hRo2jevDljx45943av3bp1o23btlSuXBlXV9eEMe3YsYPatWtjZ2eXcAfn6+oIE3X7\nBCxsDBc2GSLFPtyou2kfvnuYHpt7cPL+SSbXn8z3zb7X3bT/PhtA+58OcPV+GPN6O/BND1tp2omk\nyyvxzfFv8A32TdGa1YpUY2zdsa/9vI+PD3Xq1Hnl55Kypen8+fOZM2cOjo7/f6OTubk5Bw8eBCAo\nKIhBgwYBMGnSJJYsWZKwC6GxateundB4n3Nzc2PPnj0Jj/3pp5/SsWPHhF0PW7ZsycKFC6lcuTLH\njh1j2LBh7NmzBzDsxbJ7926yZ8/+xu1evb298fLyIleuXFStWpXhw4djbm7OoEGD8PT0xNramuDg\nYAC++uqrV9ZJvIGVMAFxcXBoLuz9yhApNmAHlK+rq0R0XDTzvObxm89vyYwUO8/K47exL1+Ieb0d\nKF/EtNJp0oIxYcFVgdWJPlQBcFNKzU21UaUxvVuavk7ivbV9fHyYNGkSjx8/JiwsjDZt9G38Dvq3\ncQ0LC+Pw4cP07Nkz4WNRUf+fedGzZ8+EKZw3bffasmVLChY0XCHVqFGDmzdv8ujRI5ydnRNSdRJv\nB/uqOnK7ugkJvQ8bBsO1fVCjC3T6EXLr2/70duhtxnqO5dzDc/So0gNXJ1dy59B3M4zvvScM/8uL\nKw/CGNq0Iv9zqYJZ9iwzKaCLMdFllwB7AE3TsgN3gA3JedA3XRmnlpo1a+Lh4fHKz+nd0vR1El9l\n9uvXj40bN2JnZ8eyZcvYt2+f7jF7eXm9cEX/NnFxcRQqVOi18Wz/3cb1ddu9/vc5x8TEoJR65RtC\nr6sjTMSV3bBhCDx7amjYtfumS6TY8mO3mJEJIsXSit4fZy0BP6WU8e+EZRAtWrQgKiqKRYsWJXzs\nxIkT7N+/P0lbkebPn5/Q0NDXfj40NJTSpUsTHR2dsG2sHuvWrWPnzp307t3b6HMKFCiAtbU1a9eu\nBQzfEGfOnHnlscZu9/pcgwYN2L9/P9evXwdImCrRW0dkEM8jxVZ0h3wlDJFiOnMgUyJS7HH4Mz5Z\nfprJG32oV6GoyUeKpRW9c9y9gFduIK1p2mBgMICFhb49eNOCpmls2LCBkSNHMmvWLMzNzbGysmLu\n3LlUrlxZ95am/fr1Y+jQoeTOnZsjR4689Pnp06dTr149LC0tsbGxeWOTf+6HH35g+fLlCVFne/bs\noXhxfV/EK1as4JNPPmHGjBlER0fTq1cv7OzsXjrO2O1enytevDju7u5069aNuLg4SpQowa5du3TX\nERlAkB+sGwh3vcBxoGGZXzpEip24EcznK714EBrFhPbV+Lix6UeKpRWjt3XVNC0ncBeoqZS6/6Zj\nZVtXkVzy9ZJKzq6FrV8YIsU6z4ca+nbj+2+k2MwmM5McKfbD7suUK5yHeb0dsMskkWLJkVrburYD\nTr+taQshMqCoMNjuakinKV8/PlKsvK4SKRUpNnK1F0evBfOOfRlmdMlckWJpRU/j7s1rpkmEEBlY\nwFnw6G+YInF2haZjIbu+WdJT908x1nMsQZFBjHYczYc1PiSbpu8tsn8v3mf02jNERsfxbQ9betQp\nl+XvgEwqo/7vaZqWB2gNJCsB9nUrE4RILDVSmbIkpeDYr7Brcnyk2BawbqKrxEuRYu2XU7Oo/kix\nmdt8WXb4BjVKF2De+w5ULJ45I8XSilGNWykVDuj7neg/zM3NCQoKomjRotK8xWsppQgKCsLc3Dy9\nh2LangYZtmC9vB2qtIV3foa8Oqc1nt5j3IFxnLp/KsmRYn6BYQz/y4sLAaYbKZYRpdmdk+XKlcPf\n35/AwMC0ekhhoszNzSlXrlx6D8N0XT8A6wdBeBC0/QbqDUnzSDGlFOtO38Ftkw+5cmRj8UeOtMoC\nkWJpJc0at5mZWcJdd0KIVBAbA/u/MUSKFa0I76+G0i8vBX2TqNgovjv5HSt9VyY5Uiw0MprJG33Y\n6H2XetZF+LGXA6UKym9QKUl2bREiM3h823CVfesI2H8A7WZDLn3zyNdCruG63zVZkWJn/R8zfKUX\nt4PDGdW6Cp82z1qRYmlFGrcQpu7iFtj0GcTFQrfFYNvz7eckkjhSzDy7OQtaLsC5nLOuGnFxiiUH\nrzP7H1+K58vF6iENcLLKepFiaUUatxCmKjoC/pkIJ5dAGQdDpFiRCrpKhD4LZfrR6Wy/vp26peoy\ns8lMSuQpoavGw7Ao/rfmDPsvB9KmZkm+6Z51I8XSijRuIUzRA1/wGGCIFGs4HFq46Y4UOxd4jjGe\nY7j39F6SI8UOXnnIF2viI8W61KJPPQtZNZYGpHELYUqUgtO/w/ZxkDMvfLAOKrfSVSJOxbHs/DLm\nnZ5H8TzFWdZ2GfYl7HXViI6N4/tdl1m434+KxfPxx4C6VC9dQFcNkXTSuIUwFRGPYcvncGEjVGgG\nXX9NUqTYxIMTOXz3MK0tWzOlwZRkRYr1ciqPWyeJFEtr8moLYQpun4B1A+DJXWj1JTT83LBRlA6H\n7xxmwsEJhEWHMbn+ZHpW6al7WmPr2buMX3cOgPnvO9DR9uXMVZH6pHELkZE9jxTbMwMKloX+O6C8\nk64S0bHRzPM2RIpVKlQpyZFiU7ecZ9WJ2zhYFOKnXhIplp6kcQuRUYXeg/WD4fp+qNkVOs5NVqRY\nzyo9GeM0JkmRYp/95YVfYBjDmlXki9YSKZbepHELkRFd2QUbhhoixTrPA4cPdd+2vv36dqYdmYam\naXzX9DtcrFx0nf88Umz61gsUzG3GnwPq0bhyMV01ROqQxi1ERhLzDP6dCkfmQ4mahrXZJarpKhEe\nHc6s47PYcHUD9sXt+cb5G8rk0zcX/Tj8GWPXneWf8/dpWqU4371rR7F8ud5+okgT0riFyCgSR4o5\nfQwuM5IVKTbIZhDD7IeRI5u+b/PnkWKBYVFMbF+dgY2tJVIsg5HGLURGcHZNfKRYDnhvOVTvpOt0\npRQrfVfy3cnvKJirIItcFlGvdD1dNWLjFAv2XmXu7suUL5KHdZ80xLacRIplRMYGKRQCFgO1AAUM\nUEq9nJArhNAnKgy2jYEzf4FFA+i2SHek2OPIx7gddmPv7b04l3NmeqPpFDHXt09I4kixLvZlmC6R\nYhmasVfcPwI7lFI94kODZR2QEMkVcMZw23rwNUOcmLOr7kixk/dOMu7AOIIig3B1cqVP9T6612bv\nvnCfMR5niIqJY05PO7rXLiu3rWdwb/0q0TStAOAM9ANQSj0DnqXusITIxJSCYwthlxvkKWaIFLNq\nrKtETFwanrshAAAgAElEQVQM7mfd+fXsr5TPX54V7VdQo2gNXTUSR4rVLFOAn3pLpJipMObHewUg\nEPhN0zQ74BTwuVLqaaqOTIjM6GkQbBoGl3dAlXbwzoJkRYp1rtiZCfUmJCtSrH8jQ6RYrhwSKWYq\njGncOYDawHCl1DFN034ExgGTEx+kadpgYDCAhYVFSo9TCNN33dNwQ014kCHooO5g3Wuz99zag9th\nN6Jjo/m68dd0qqj/TUyPU/5M2XyeXDmysaSvIy2rS6SYqTGmcfsD/kqpY/H/9sDQuF+glHIH3AEc\nHR0lpluI52JjYP8s8JwDRSvB+2ugtK2uElGxUcw5MYdVl1ZRo2gNZjvPxrKApa4aoZHRTNrowybv\nu9SvUIS570mkmKl6a+NWSt3TNO22pmlVlVKXgJbAhdQfmhCZwOPbsO5juH006ZFij68xxnMMlx9d\n5qMaHzGy9kjMsutb8XHm9mNGrDJEiv2vdRWGSaSYSTP2LezhwIr4FSXXgP6pNyQhMokLm2HzZ4aN\nopIYKbbh6gZmHZ+VrEixxQevMXvHJUrkl0ixzMKoxq2U8gYcU3ksQmQO0RHwzwQ4uTRZkWLTjkxj\nx40d1CtVj6+bfC2RYiKB3DkpREp6cDE+UuxCikSKfV77c/rX7J+sSLEZXWrxgUSKZSrSuIVICUrB\nqWWwY7xhDjuZkWIl8pRIkUixPwfWpVopiRTLbKRxC5FcL0WKuUN+fUvsHkY8ZMKBCRwJOEJry9Z8\n2fBLCuTU13ATR4r1rlset441yZ1T1mZnRtK4hUiO28fBYyCEJj1S7NCdQ0w4OIGn0U9xa+BGj8o9\nkh4ppsGC92vTwba0rvOFaZHGLURSxMXCwR9g79fJixTzmsdv5w2RYktcllCpcCVdNSRSLGuSxi2E\nXi9EinWDTnPBXGdSeuhtXPe74hPkw7tV3mWM0xjMc+i7GUYixbIuadxC6JECkWLbrm1j2tFpZNOy\n8X2z72lt2VrX+Uoplh+9yfS/L1IwtxnLB9ajUSWJFMtKpHELYYwUihSbeXwmG69uTJFIsWZVizOn\np0SKZUXSuIV4myA/w9rsAG9wGhQfKaZzWiPYlzH7x3DzyU0G2w7mE7tPkhUpNqlDdQY0kkixrEoa\ntxBvcmY1/D0qWZFif/n+xXcnv6NwrsIsdllM3dJ1ddWIjVPM33OVH/+VSDFhII1biFeJCoNto+HM\nymRFik0+PJl9t/clOVIsICSCkau8OXZdIsXE/5PGLcR/3fU2TI08up7kSLET904w7sA4HkU+YqzT\nWD6o/oHutdm74iPFnsXE8V1PO7rXKafrfJF5SeMW4jml4OgvhkixvMVTJFJsXvt5uiPFIqNjmbX9\n/yPF5vV2oIJEiolEpHELAfD0IWwcBlf+MUSKdfkZ8uhMSn96j7GeYzn94LREiolUJY1biOuesG4Q\nRAQnOVLs31v/4nbIjZi4mCRHiq095c+UTecxN5NIMfFm0rhF1hUbA/tmwoHvDJFiH6xNUqTYtye+\nZfWl1RIpJtKMUY1b07QbQCgQC8QopSRUQZi2x7fiI8WOgX0faD8bcuqb1kipSLHhK7248zhCIsWE\n0fRccTdXSj1MtZEIkVYubILNww2RYt2XgE0PXacnjhTLnSN3siPFShYwZ/Xg+jhKpJgwkkyViKwj\nOsIQdHDqNyhTG3osSV6kWOl6zGw8k+J5iuuqERgaxf/WnsHzciBta5bim+62FMwja7OF8Yxt3ArY\nqWmaAn5VSrmn4piESHkPLsLa/hB4ERqOgBaTdUeKnQ08i6una7IixQ5cCeSL1WcIjZRIMZF0xjbu\nRkqpu5qmlQB2aZrmq5TyTHyApmmDgcEAFhYWKTxMIZJIKcMV9o7xkCs/9FkHlfRHiv3m8xvzveYn\nK1Jszs5L/Lr/GpVL5GPFx/WoWiq/rhpCPGdsyvvd+P8+0DRtA1AX8PzPMe6AO4Cjo6NK4XEKoV/E\nY9gywjCnXaE5dP01WZFiLpYuTGk4RXek2K2gcIav8uLM7cf0rmuBW8caEikmkuWtjVvTtLxANqVU\naPzfXYBpqT4yIZLj1jHDqpHQu9BqqmF6JB0ixbacucuE9RIpJlKWMVfcJYEN8V+wOYC/lFI7UnVU\nQiTVC5Fi5WDAP1BO3+rV6NhofvL6iWXnlyU5Uiz8WQxTN19g9cnb1LYoxI8SKSZS0Fsbt1LqGmCX\nBmMRInmeBMCGwYY7IZMaKfbkNq6eyYsUuxjwhM/+Os21h08lUkykClkOKDKHy//Axk/gWXiSI8X+\nvvY3049OT1ak2J9HbzJDIsVEKpPGLUxbTBTsngpHF0DJWoZIseJVdZUIjw7n62Nfs8lvEw4lHJjV\nZFaSIsXGeJxl1wWJFBOpTxq3MF1BfuDRHwLOpEik2BDbIQy1G6o7UuzYtSBGrvbmoUSKiTQijVuY\npjOr4O//xUeKrYDqHXWdnlKRYvP2XOGnf69gIZFiIg1J4xamJSoU/h4NZ1eBRUPovsiwekSHR5GP\ncDvkxj7/fTQt15TpjaZT2LywrhoBIRF8vsqb49eD6epQluldapEvl3w7ibQhX2nCdNz1io8UuwFN\nx4HzmHSJFNt5/h6u685KpJhIN9K4RcanFBz9GXZNSVak2MIzC3E/645FAQvmt59P9aLVddWIjI5l\n5raL/H7kpkSKiXQljVtkbE8fGpb5XdkJVdvDOwuSHSk2sd5E8pjpuxnm6oMwhq/04qJEiokMQBq3\nyLiu7Yf1g+Mjxb6FuoP0R4rd/Be3w4ZIsZlNZtKxgv43Mdee9GfKZokUExmHNG6R8cTGwL6v4cD3\nhkixPh5QykZXiciYSOacnMPqS6upWbQms51nY1FA366VTyKjmbjBhy1nJFJMZCzSuEXG8uimYXMo\n/+Pg0McQ3qszUszvsR9jPMdw5dEV+tboy+e1P9cdKeZ9+zHDV57m7uNIRrtU4ZNmEikmMg5p3CLj\nOL8RNo8AlfRIsfVX1jPr+CzymOXh55Y/06RcE1014uIU7geuMecfiRQTGZc0bpH+EkeKla1jaNpF\nrHWVCH0WytQjU/nnxj/UL12frxt/naRIsVFrvDlw5SHtapViVjeJFBMZkzRukb7uXzCszQ68CI0+\nh+aTdEeKnQk8w1jPsQmRYgNqDSCbpm83Ps/LgYxa401oZAxfda3F+3UlUkxkXNK4Rfp4KVJsPVRq\nqatEnIpjqc9S5nvNp1TeUvze7nfsiuvbgfhZTBzf7bzEr57PI8XqS6SYyPCkcYu0F/HIMJd9cTNU\nbGGIFMtXQleJwPBAJhycwNGAo7SxaoNbAzeJFBNZhtGNW9O07MBJ4I5SSt9iWCGeu3U0PlIsIMmR\nYgfvHGTiwYmER4fzZYMv6Va5m+5pjc1n7jJRIsWEidJzxf05cBHQd1kjBMRHin0Pe2cmK1Lsx9M/\n8vuF36lcuDJL2yylYqGKumqEP4vhy83nWXPSXyLFhMkyqnFrmlYO6AB8BYxK1RGJzOdJAKwfBDcO\nQK3u0PEH3ZFit57cwtXTlfNB53mv6nuMdhytO1Lswt0nDF9piBT7tHlFRraSSDFhmoy94p4LuAKv\nfddG07TBwGAACwt9d6iJTOx5pFh0BHSeb7ipRue0xtZrW5l+ZDo5suVgbrO5tLTU9yamUoo/jtzk\nq20XKZTbjBUD69FQIsWECXtr49Y0rSPwQCl1StO0Zq87TinlDrgDODo6qhQboTBNMVGw+0vDrn4l\na0GP36B4FV0lwqPD+erYV2z220ztErWZ1WQWpfPpm4t+9PQZrusMkWLN4yPFikqkmDBxxlxxNwI6\na5rWHjAHCmiatlwp1Sd1hyZM1sOrsG6AIVKs7mBoPV13pNjFoIu4erpy88lNhtoNZYjtkGRHig1s\nbC1rs0Wm8NbvBKXUeGA8QPwV92hp2uK1vFcaIsVy5IRef0G1DrpOV0qx4uIKvj/1PYXNC7OkzRKc\nSjnpqhETG8e8PVeZt8cQKbb+k0bYlNM3py5ERibruEXKiAo1NOyzq8GyEXRbBAXL6irxKPIRkw9N\nZr//fpqVa8a0RtN0R4rdfRzByFXeHL8RTDeHskyTSDGRCen6ilZK7QP2pcpIhOlKHCnWbLwhUiyb\nvhtZTtw7wTjPcTyKesS4uuN4v9r7yYoU+/5dO7rVlkgxkTnJpYhIurg4w5uPu7803PnYdytYNdJV\nInGkmGUBS+a3TF6kWK2yBZjXuzbWxfRtBSuEKZHGLZImLBA2DYuPFOsA78zXHSkWEBbA2ANj8Xrg\nxTsV32FCvQlJiBQL5bO/vPC9F8rAxta4tq0qkWIi05PGLfS7ti8+UuwxtJ8DTh/rXpu9++Zu3A67\nEafimNVkFh0q6H8T83mkWO6c2fmtnxPNq+nb70QIUyWNWxgvNhr2zTREihWrDH3WJTtS7Fvnbylf\noLyuGokjxRpWLMoP79lTsoBEiomsQxq3MM4LkWIfQrtvkhUp1q9mP0Y4jEhWpNiYNlUZ2rSiRIqJ\nLEcat3i78xtg8+eASnKk2Lor6/jm+DfkMcvDL61+oXHZxrpq/DdSbM2Q+tSxlEgxkTVJ4xav9ywc\n/hkPp5YlOVLsybMnTD08lZ03d1K/dH1mNplJsdz69gl5EBrJ/9ac4cCVh7S3KcXMbrYUzC2RYiLr\nksYtXu3+BfDoD4G+hkixFpNB77TGA2/Geo7lQfgDRtYeSf9a/ZMVKfZ1Vxt61y0vt62LLE8at3iR\nUnByKfwzAXIVgA83GFJqdPhvpNiydsuSFSlWpWQ+/hpUnyolJVJMCJDGLRJLoUix8QfHcyzgWIpE\nin1Qz4LJHWtgbiZrs4V4Thq3MEgcKdZ6GjQYrjtS7ID/ASYdmkR4dDhTG06la6Wuuqc1NnnfYeIG\nH7Jp8MsHtWlnI5FiQvyXNO6sLi7WsC5730woVB4G7IRydXSViI6NZu7pufxx4Y8UiRSrY1mYH3vZ\nU66wRIoJ8SrSuLOyFyLFesRHiumc1nhyizGeY7gQdCHJkWLn74YwfKUX1x8+5bPmlRjZqjI5JFJM\niNeSxp1VXdphiBSLiYR3FoD9B7pvW9/it4UZR2ckP1Ls74sUyiORYkIYSxp3VhMTBbumwLFfoKQN\n9FiabpFiYzzOsvvifVpUK8G3PWwlUkwIIxmTOWkOeAK54o/3UEpNSe2BiVTw8Kphbfa9s1B3iOFN\nSJ2RYheCLuDq6crt0NtJjhQ7ei2Ikau8CXoaxeSONRjQyErWZguhgzHfcVFAC6VUmKZpZsBBTdO2\nK6WOpvLYREp6IVJsJVRrr+v0/0aKLXZZnKxIMcuiednQtxG1ykqkmBB6GZM5qYCw+H+axf+RFHdT\nkQKRYsGRwUw+NBlPf8+UiRSrXZZp70ikmBBJZdR3jqZp2YFTQCVggVLqWKqOSqSMFyLFJoDz6HSL\nFBvjcZaY2Dh+eM+Org4SKSZEchjVuJVSsYC9pmmFgA2aptVSSvkkPkbTtMHAYAALC4sUH6jQ4b+R\nYv3+BsuGukrExMXwy5lfWHR2EZYFLFnQagHVilTTVSMyOpavt13kjyM3sSlbkJ96O0ikmBApQG9Y\n8GNN0/YBbQGf/3zOHXAHcHR0lKmU9BIWaFjmd3UXVOsInefpjhS7G3aXcQfG4fXAiy6VujC+7vhk\nRYp93Nga17bVyJlD1mYLkRKMWVVSHIiOb9q5gVbAN6k+MqFfCkeKfdPkG9pX0P8m5pqTt/ly8wWJ\nFBMilRhzxV0a+D1+njsbsEYptTV1hyV0iY2GvV/DwR+gWBXosx5K1dJVIjImkm9PfMuay2uSFSk2\nYf05tp4NkEgxIVKRMatKzgIOaTAWkRSPbsK6geB/Amp/BG1n6Y4Uu/roKmM8x3D18VX61+zPcIfh\nuiPFvG49YsQqL4kUEyINyHosU5Y4UqzHUqjVXdfpSik8rngw+/hs8pjlYWGrhTQq20hXjbg4xa+e\n1/hup0SKCZFWpHGbohcixRyhxxIobKWrROJIsQalG/B1k68lUkwIEyGN29S8ECk2ElpMSlak2Bd1\nvqBfzX66I8X2Xw7kfxIpJkS6kMZtKlIgUiw2LpalPktZ4L2AUnlL8Xu737EtbqurhkSKCZH+pHGb\nghcixVpC14W6I8UehD9gwsEJHAs4Rlurtrg1cCN/Tn0N92bQU0as9OKMf4hEigmRjqRxZ3QvRIpN\nhwaf6Y4U8/T3ZNLBSUTEREikmBCZgDTujOq/kWIDd0JZfZFiz2KfMff0XP688CdVClfhW+dvqVCo\ngq4a4c9imLLpPGtPSaSYEBmFNO6M6Mldwx2QNw6ATU/o8L3uSLGbT24yZv8YLgZfpFfVXox2Gk2u\n7PqCChJHig1vUYnPW0qkmBAZgTTujOaFSLGfwf795EWKNZ9LSwv9kWK/H77B19t8JVJMiAxIGndG\nkThSrJQN9PgNilXWVeJp9FO+PvZ1QqTYN87fUCpvKV01JFJMiIxPGndGkDhSrN5QaDU1WZFiw+yG\nMch2UJIjxYKfPsOtYw36S6SYEBmSNO70pBScWQl/j4YcuaD3KqjaTmcJxfKLy/n+1PcUMS/CEpcl\nOJZy1FUjJjaOn/ZcZX58pNj6vg0lUkyIDEwad3qJCoWto+DcGrBsDN0XQYEyukoERwYz6eAkDtw5\nQLPyzZjecDqFzAvpqpE4Uqx77XJMfaemRIoJkcHJd2h6uHPaECn2+CY0nwhN/qc7Uux4wHHGHRhH\nSFQI4+uOp3e13rqnNf45fw9XiRQTwuRI405LcXFwdAHsngr5SkK/bWDZQFeJmLgYfvb+mcXnFmNZ\nwJJfWv1C1SJVddWIjI7lq78v8udRQ6TYvN4OWEmkmBAmQxp3WgkLhI1D4eruZEWKjfUci3egN10r\ndWVc3XHJihQb1MSaMW0kUkwIU2NMdFl54A+gFBAHuCulfkztgWUqfnthwxBDpFiH78BxoO612btu\n7mLK4SnEqThmO8+mnbX+NzFXn7jNl1vOkzdnDn7r70TzqhIpJoQpMuaKOwb4n1LqtKZp+YFTmqbt\nUkpdSOWxmb7YaNj7FRycm6xIsdknZrP28lpsitnwjfM3lM+f9EixRpWK8sO79pSQSDEhTJYx0WUB\nQED830M1TbsIlAWkcb/JoxuGzaH8T0DtvtB2ZvIixWr1Z7i9/kix07ceMWKlFwEhhkixT5pWJJtE\niglh0nTNcWuaZoUhf/JYagwm0/BZD1s+N/y9x29Qq5uu05VSrL28ltknZpPXLC+/tvqVhmUb6qrx\ncqRYA+pYFtZVQwiRMRnduDVNywesA0YqpZ684vODgcEAFhYWKTZAk/IsHHaMg9O/Qzkn6L5Yd6RY\nSFQIU49MZdfNXTQs05CvGn+VpEixUavPcPDqQzrYlObrbjYSKSZEJmJU49Y0zQxD016hlFr/qmOU\nUu6AO4Cjo6NKsRGaivvnYW1/eHgZGo+C5hOSFCnm6ulKYHggo+qMom/NvrojxfZdesD/1pzh6bMY\nZnazoZeTRIoJkdkYs6pEA5YAF5VS36f+kEyMUnByCeyYALkLxUeKNddVIjYuliU+S/jZ+2dK5y3N\nH+3+wKa4ja4az2LimLPzEu6e16haMj+r3q9PZYkUEyJTMuaKuxHwIXBO0zTv+I9NUEptS71hmYjw\nYNg8HHy3QqVW0GUh5Cuuq8SD8AeMPzCe4/eO0866HZPrT9YdKXbj4VNGrPLirH8IfepbMKmDRIoJ\nkZkZs6rkICC/a//XzSOGVSNh98FlBtT/NMmRYpGxkUxrOI0ulbokK1JsYZ/atK0lkWJCZHZy56Re\ncbHgOQf2z4JClvGRYrV1lXgpUqzpt1QoqC9S7GlUDFM2n8fjlD+OloX5sbcDZQvl1lVDCGGapHHr\nEXLHECl28yDYvGu4CzIZkWLvV3ufUY6jkhYp9pcX14OeMqJFJUZIpJgQWYo0bmNd2g4bhxmSarr8\nAna9kxwpZpbdjB+b/0gLixa6zldKsezwDWZu86VwXjP++rg+DSoW1VVDCGH6pHG/TXQk7J4CxxZC\nKVvosTRJkWIzjs5g67Wt1ClZh1lNZumOFAt++gxXjzPsvviAltVK8G1PO4rkzamrhhAic5DG/SYP\nr8RHip2Dep9A66mGpBodzgedx3W/K/5h/gyzG8Zg28Fk17n39hG/IEau9uLR02imdKpBv4YSKSZE\nViaN+1WUAu+/YNuY+Eix1VC1rc4Sij8v/MkPp3+gqHnRpEeK/XuFeXuvYl00L0v6OkmkmBBCGvdL\nIp/A36Pg3FqwagLd3JMVKda8fHOmNZymO1LszuMIRq7y4sSNR/SoU46pnWuSVyLFhBBI437RnVPg\nMTBZkWLHAo4x/sB4QqJCmFBvAr2q9tI9rbHD5x5j1xkixX7sZc879mV1nS+EyNykcYMhUuzIfPh3\nKuQvDf23g0V9XSWi46L5xfsXFp9bjFVBqyRHis34+wLLj97CtpwhUsyyqESKCSFeJI077AFsGAp+\n/0L1ToZIsdz6tj+9E3aHsZ5jORN4hm6VuzHWaazuSLEr90MZvtIQKTbYuQKjXapKpJgQ4pWyduP2\n2wPrh0BkCHT4HhwH6F6bvfPGTr48/CUKleRIsVUnbjM1PlJsWX8nmkmkmBDiDbJm446Nhj0z4NCP\nULwqfLQRStbUVSIiJoLZJ2bjcdkjyZFiIRGGSLG/zwXQuFIxvn/PjhL5JVJMCPFmWa9xP7pheAPy\nzkmo0w/azIScOqc1Hl3B1dP1/yPFHIZjli1pkWL3QiIZ27YaQ5wrSKSYEMIoWatx+6yDLSMBDXou\ng5pddZ2eOFIsn1m+JEeKLfT047udlyld0Jw1QxtQ20IixYQQxssajfvZU9g+Frz+hHJ14yPFLHWV\nSJFIsSeRfLHGm0NXg+hgW5qvu0qkmBBCv8zfuO/5GG5bf3glyZFiXg+8GOs5NlmRYnsvPWB0fKTY\nN91teNdRIsWEEEljTHTZUqAj8EApVSv1h5RClIITi+GfiYZIsY82QoVmukqkVKTY7B2+LD54nWql\n8rOqt0SKCSGSx5gr7mXAfOCP1B1KCnohUqy1YRvWZEaKudV3I1/OfLpqJI4U+7C+JRM7VJdIMSFE\nshkTXeapaZpV6g8lhdw8DOsGxUeKfQX1h+mKFFNKsd9/P26H3JIVKbbR6w4TN5wjR/ZsLOxTh7a1\n9G3jKoQQr5N55rgTR4oVttIdKXbv6T22XtvKVr+t+IX4UbVwVWY3nZ2kSDG3TedZd9ofJ6vCzO0l\nkWJCiJSVYo1b07TBwGAACwuLlCprnMSRYrbvGSLFcr19Hvlp9FN239zNFr8tHL93HIXCoYQDbg3c\n6Fyxs+5IMZ87IYxY6cWNoKeMaFmZES0qSaSYECLFpVjjVkq5A+4Ajo6OKqXqvpXvNtg0DGKeQZeF\nYN/7jYfHxsVyNOAoW65t4d+b/xIZG0n5/OX5xP4TOlboqPvuRzBMr/x26AaztvtSJG9O/hpUn/oV\nJFJMCJE6THeqJDoSdrnB8V/jI8V+g2KVXnv4peBLbPHbwrbr2wiMCCR/zvx0rtiZThU7YVfcLslL\n84KfPmPM2jP86/uAVtVLMLuHRIoJIVKXMcsBVwLNgGKapvkDU5RSS1J7YG/08Aqs7Q/3zxnefGz1\n5SsjxQLDA9l2fRub/TZz+dFlcmTLQZOyTehcsTPO5ZzJmT15Dfaw30O+WO3No6fRfNmpBn0lUkwI\nkQaMWVXy5rmHtKQUeK8wRIqZ5X5lpFh4dDh7bu9hq99WjgQcIU7FYVvMlgn1JtDWqi2FzZN/e3lM\nbBw//nuF+XuvYl0sL0v7OVGzjESKCSHShulMlUQ+ga1fgI9HfKTYIihQGoA4FceJeyfY7LeZ3Td3\nEx4TTpm8ZRhYayCdKnbCuqB1ig3jzuMIPl/pxcmbEikmhEgfptFx7pwCjwHw+Da0mGS4dT1bdvwe\n+7HFbwtbr23lfvh98pnlo611WzpW6EidknV035b+Njt8AnD1OEucQiLFhBDpJmM37ldEigUVr8R2\n35VsubaFC0EXyK5lp2GZhox2HE2z8s0wz5Hy+1lHRscyfesFVhyTSDEhRPrLuI07UaRYVLWO7K3d\njS1X/uDQvkPEqliqF6mOq5Mr7azb6d6lT4/L90MZ/pcXl+5LpJgQImPImI3bbw9x64fgpSLY4tCe\nnU+vE3rkS0rkKUHfmn3pVKETlQq/fulfSlBKsfL4baZtPU++XBIpJoTIODJW446N5ubOcWy5tJat\nxQpxJ5s5ucP8aG3Zmk4VO+FU0ons2VJ/kyaJFBNCZGQZpnGHP7nDoHUdOZsthmyFC1KvlBOfVupC\nS4uWuhPTk+PqgzD6Lj3O/ScSKSaEyJgyTOPOk6805XMWpFWpOrSv70rJvCXTZRylC5pTsUQ+5r3v\nIJFiQogMSVMq5bcVcXR0VCdPnkzxukIIkVlpmnZKKeVozLGyPEIIIUyMNG4hhDAx0riFEMLESOMW\nQggTI41bCCFMjDRuIYQwMdK4hRDCxEjjFkIIE5MqN+BomhYI3Ezi6cWAhyk4HFMmr8WL5PV4kbwe\n/y8zvBaWSqnixhyYKo07OTRNO2ns3UOZnbwWL5LX40Xyevy/rPZayFSJEEKYGGncQghhYjJi43ZP\n7wFkIPJavEhejxfJ6/H/stRrkeHmuIUQQrxZRrziFkII8QYZpnFrmtZW07RLmqZd1TRtXHqPJz1p\nmrZU07QHmqb5pPdYMgJN08prmrZX07SLmqad1zTt8/QeU3rRNM1c07TjmqadiX8tpqb3mDICTdOy\na5rmpWna1vQeS1rIEI1b07TswAKgHVAD6K1pWo30HVW6Wga0Te9BZCAxwP+UUtWB+sCnWfjrIwpo\noZSyA+yBtpqm1U/nMWUEnwMX03sQaSVDNG6gLnBVKXVNKfUMWAW8k85jSjdKKU8gOL3HkVEopQKU\nUqfj/x6K4Ru0bPqOKn0og7D4f5rF/8nSb1RpmlYO6AAsTu+xpJWM0rjLArcT/dufLPqNKd5M0zQr\nwJTA+4wAAAFoSURBVAE4lr4jST/x0wLewANgl1Iqy74W8eYCrkBceg8krWSUxv2qGPUsfRUhXqZp\nWj5gHTBSKfUkvceTXpRSsUope6AcUFfTtFrpPab0omlaR+CBUupUeo8lLWWUxu0PlE/073LA3XQa\ni8iANE0zw9C0Vyil1qf3eDICpdRjYB9Z+/2QRkBnTdNuYJhibaFp2vL0HVLqyyiN+wRQWdM0a03T\ncgK9gM3pPCaRQWiapgFLgItKqe/TezzpSdO04pqmFYr/e26gFeCbvqNKP0qp8UqpckopKwx9Y49S\nqk86DyvVZYjGrZSKAT4D/sHwxtMapdT59B1V+tE0bSVwBKiqaZq/pmkD03tM6awR8CGGqynv+D/t\n03tQ6aQ0sFfTtLMYLnh2KaWyxBI48f/kzkkhhDAxGeKKWwghhPGkcQshhImRxi2EECZGGrcQQpgY\nadxCCGFipHELIYSJkcYthBAmRhq3EEKYmP8DmI1+CLxxz+oAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#To fill in, we can use the backward and forward respectively\n", "#We have to declare it ahead of time, because we can't create it all at once. Only in pieces\n", "central = np.zeros(len(x)) \n", "\n", "#this code is the same as above\n", "forward = (y[1:] - y[:-1]) / (x[1:] - x[:-1])\n", "backward = forward #All that's different is which x-value the points are attached to.\n", "\n", "central[0] = forward[0] #Forwards exists at the left point\n", "central[-1] = backward[-1] #Backwards exists at the right point\n", "\n", "central[1:-1] = 0.5 * (forward[1:] + backward[:-1]) #Set the rest of the points\n", "\n", "plt.plot(x[1:], backward, label=\"Backward Difference\")\n", "plt.plot(x[:-1], forward, label=\"Forward Difference\")\n", "plt.plot(x, central, label=\"Central Difference\")\n", "plt.legend(loc=\"upper left\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Numerical Integration\n", "====" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "One strategy is the Riemann integration strategy, which looks like:\n", "\n", "$$\\int f(x)\\,dx \\approx \\sum^N f(x_i) \\Delta x$$\n", "\n", "[draw picture]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We can do better than that. [Draw Picture]. The trapezoidal rule allows us to better approximate integrals. It's definition is (for non-uniform grid):\n", "\n", "$$\\int_a^b f(x)\\,dx \\approx \\frac{1}{2} \\sum_{i=1}^N (x_{i + 1} - x_i)(f(x_{i + 1}) + f(x_i))$$\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.97965081122\n" ] } ], "source": [ "from math import pi\n", "\n", "x = np.linspace(0,pi,10)\n", "y = np.sin(x)\n", "\n", "little_traps = 0.5 * (x[1:] - x[:-1]) * (y[1:] + y[:-1])\n", "trap = np.sum(little_traps)\n", "print(trap)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Comparison of Riemann vs Trapezoidal\n", "====" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def trap(x,y):\n", " return 0.5 * np.sum( (x[1:] - x[:-1]) * (y[1:] + y[:-1]) )\n", "\n", "def rie(x,y):\n", " return np.sum(y[:-1] * (x[1:] - x[:-1]) )\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\nyQEbAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rie_error = []\n", "trap_error = []\n", "points = range(2, 100,1)\n", "for i in points:\n", " x = np.linspace(0,1,i)\n", " y = np.exp(x)\n", " rie_error.append(rie(x,y))\n", " trap_error.append(trap(x,y))\n", " \n", "plt.hlines(np.exp(1) - 1, 0,100, label=\"exact\")\n", "plt.plot(points, rie_error, label=\"Riemann\")\n", "plt.plot(points, trap_error, label=\"Trapezoidal\")\n", "plt.xlabel('Number of intervals (trapezoids)')\n", "plt.ylabel('Value of Integral')\n", "plt.xlim(0,100)\n", "plt.legend()\n", "plt.title(\"Error in $e^x$\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\nl19+mfPOOw+ALVu2cOqppzJx4kSuvfbaPboBnH322Rx55JGMGTOG++67r73epj10m5pFXbJQzUKk\nU/rTjfDxsvTuc59x8MXbWrXpO++8w4MPPsg999wDwG233UZeXh6VlZWcdNJJTJ06ldGjRwMwYMAA\nFixYwAMPPMANN9zA008/zfXXX8/3vvc9jj76aNauXctZZ53F8uXLeeGFFwBYsGABV155JWeffTYz\nZ84kOzubZcuWsWLFCs444wxWr169Rzw/+tGPOOmkk7jpppt45plnauOCYLypvLw8SkpKKCws5IIL\nLmDAgAGtet2t1W2SRd1pKNUsRKR5BxxwAEcddVTt/KOPPsr9999PZWUlGzZs4J133qlNFtOmTQPg\n0ksv5cYbbwSCWsGqVatqt//0008pLS2lV69ebN68menTp/Pkk0+Sm5vL66+/zne/+10AxowZw7Bh\nw1izZs0e8cybN4/nn38egHPPPZecnJzadbfffjtz5swBguHQ33//fQoLWz1yR6t0m2ShmoVIJ9fK\nGkCm9OnTp3Z69erV3HnnnSxYsID+/ftz2WWXUVZWVrvebO/BJtydBQsWkJ2dvcfyyspKLr74Yn78\n4x/XJptUu481dJyXX36ZefPmMX/+fHr16sVxxx23R2ztpRu1WdR0ylPNQkRaZseOHeTk5JCbm8vG\njRtrTyXVeOyxx4Cg9nHssccCcMopp9TezxuobUivuT3r1KlTa9edcMIJzJ49GwgG+du4cSMHHnjg\nHsdILvPss89SXFwMBMOf5+Xl0atXL1asWMHChQvT+dJT1m1qFvGsmk55qlmISMtMnDiR0aNHM3bs\nWEaNGlWbEGqUlJQwadIkzIxHH30UgLvuuotrr72WBx98sLadY+bMmdxxxx2MHTuWF198EYD/+I//\n4LrrruPqq69m3LhxxGIxHnnkkb1qJLfccgvTpk3j8ccf56STTqq9P8aZZ57JrFmzGD9+PIceemiH\nXT3VLkOUp1NjQ5R/VlLOhFtf4uazRvPV40Y2sKWItLfuMER5QUEBy5cvp3///h0dSsq63BDl7am2\nzUIN3CIiadeNTkNpuA8RSb+ioqKODqFT6DY1CzMjOyuimoWISAZ0m2QBwWCCqlmIiKRf90oWsag6\n5YmIZEC3ShbxWESd8kREMqBbJYtEVlSd8kSk3cydO5e///3vHR1Gu+heySIWVac8EWk3ShZdVDwr\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rie_error = []\n", "trap_error = []\n", "points = range(2, 100,1)\n", "for i in points:\n", " x = np.linspace(0,pi,i)\n", " y = np.cos(x)\n", " rie_error.append(rie(x,y))\n", " trap_error.append(trap(x,y))\n", " \n", "plt.hlines(np.sin(pi), 0,100, label=\"exact\")\n", "plt.plot(points, rie_error, label=\"Riemann\")\n", "plt.plot(points, trap_error, label=\"Trapezoidal\")\n", "plt.xlabel('Number of intervals (trapezoids)')\n", "plt.ylabel('Value of Integral')\n", "plt.xlim(0,100)\n", "plt.legend()\n", "plt.title(\"Error in $cos(x)$\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Passing Functions around\n", "====\n", "\n", "You can pass functions to functions. Example:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.283662185463\n" ] } ], "source": [ "def execute(f):\n", " print(f(5)) #<--- I just assume f is a function!\n", " \n", "execute(np.cos)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "ename": "TypeError", "evalue": "'int' object is not callable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(f)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#<--- I just assume f is a function!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: 'int' object is not callable" ] } ], "source": [ "execute(5)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Why the heck would you want to do this?!\n", "----" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Create a function that:\n", "\n", "1. Plots the given function\n", "2. Evaluates an integral on a function\n", "3. Samples from the given function\n", "4. Calls the function and histograms its output" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_function(fxn, xlo, xhi):\n", " x = np.linspace(xlo, xhi, 1000)\n", " plt.plot(x, fxn(x))\n", " plt.show()\n", " \n", "plot_function(np.exp, -1, 1)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.71828197194\n", "1.71828182846\n" ] } ], "source": [ "def trap_integrate(fxn, a, b, points=1000):\n", " x = np.linspace(a,b,points)\n", " y = fxn(x) # <----- Just execute function. Note this only works if fxn is a numpy function!!!\n", " return 0.5 * np.sum( (x[1:] - x[:-1]) * (y[1:] + y[:-1]) )\n", "\n", "print(trap_integrate(np.exp, 0,1))\n", "print(np.exp(1) - 1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Integrating Functions\n", "====\n", "\n", "Lots of people know about this hidden feature and some great integration functions exist. Such as the adaptive Gaussian-quadrature called `scipy.integrate.quad`. This works for functions which can be evaluated anywhere\n", "\n", "**If you are working with a function (not data) you use scipy.integrate.quad**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**If you are working with data (not a function) you use your own trapezoidal code**" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The answer is 2.666666666666667 with an estimated error of 2.960594732333751e-14\n" ] } ], "source": [ "def my_special_function(x):\n", " return x ** 2\n", "\n", "from scipy.integrate import quad\n", "#THE FUNCTION MUST BE A NUMPY COMPATIBLE FUNCTION\n", "#So, use vectorize or if it only uses numpy functions (+,-,*,**,np.sin,np.cos...) you're OK\n", "#If statements ARE NOT NUMPY FUNCTIONS\n", "ans, error = quad(my_special_function,0,2) #<-- Notice that this is just like the np.histogram function, which gives two values\n", "print('The answer is {} with an estimated error of {}'.format(ans,error))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.8862269254527579 7.101318390472462e-09\n" ] } ], "source": [ "def my_special_function(x):\n", " return np.exp(-x**2)\n", "\n", "ans,err = quad(my_special_function, 0, np.inf)\n", "print(ans, err)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's try a more challlenging integral\n", "----" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def confusing_function(x):\n", " if x < 0:\n", " return np.exp(x)\n", " if x < 3:\n", " return x**2\n", " if x == 3:\n", " return 0\n", " if x > 3:\n", " return np.sqrt(x)\n", " if x >= 5:\n", " return np.exp(-x)\n", " \n", "#It converts my regular function into a numpy function\n", "np_confusing_function = np.vectorize(confusing_function)\n", "x = np.arange(-4,6,0.01)\n", "\n", "plt.plot(x, np_confusing_function(x))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16.315541717155426 5.6158704353492794e-09\n" ] } ], "source": [ "ans,err = quad(np_confusing_function, -4, 6) #Integrate it from -4 to 6 using the numpy version\n", "print(ans,err)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Giving Hints to Quad\n", "----\n", "\n", "You can tell quad where it will run into problems, such as dicontinuities." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16.31554171710623 1.8113890073563594e-13\n" ] } ], "source": [ "ans,err = quad(np_confusing_function, -4, 6, points=[0,3,5])\n", "print(ans,err)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Lambda Functions\n", "====\n", "\n", "Sometimes it's tedious to define a function just to integrate. For short, you can use the special `lambda` word:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "25\n" ] } ], "source": [ "my_special_function = lambda x: x**2\n", "print(my_special_function(5))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The answer is 1.4161468365471424 with an estimated error of 1.5722388241847156e-14\n" ] } ], "source": [ "ans, error = quad(lambda x: np.sin(x), 0, 2)\n", "print('The answer is {} with an estimated error of {}'.format(ans,error))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Plotting Integrals\n", "====\n", "\n", "To plot an integral, you can loop over multiple integrations" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.arange(0,5,0.1)\n", "y = []\n", "for xi in x:\n", " ans,err = quad(lambda x: x ** 2, 0, xi)\n", " y.append(ans)\n", " \n", "plt.plot(x,y, label='$\\int_0^x\\, s^2\\,ds$')\n", "plt.plot(x, x**2, label='$x^2$')\n", "plt.legend(loc='upper left')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Summary of Integration and Differentiation\n", "====" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**If you are integrating a function (not data) you use scipy.integrate.quad**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**If you are integrating data you use write your trapezoidal code**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**If you are differentiating a function (not data) just take the derivative using calculus**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**If you are differentiating data you use the central difference**" ] } ], "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.6.2" } }, "nbformat": 4, "nbformat_minor": 1 }