{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "*This notebook contains material for CBE 20258 Numerical and Statistical Analysis taught at the University of Notre Dame. (c) Professors Alexander Dowling, Ryan McClarren, and Yamil Colón. This collection of notebooks [cbe-xx258](https://ndcbe.github.io/cbe-xx258) is available [on Github](https://github.com/ndcbe/cbe-xx258).*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [1.8 Manipulating Data with Pandas](https://ndcbe.github.io/cbe-xx258/01.08-Pandas.html) | [Contents](toc.html) | [1.10 Testing and Debugging in Python](https://ndcbe.github.io/cbe-xx258/01.10-Testing-and-Debugging.html) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "rG3kq9V5BPoN", "nbpages": { "level": 1, "link": "[1.9 Functions as Arguments](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9-Functions-as-Arguments)", "section": "1.9 Functions as Arguments" } }, "source": [ "# 1.9 Functions as Arguments" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 1, "link": "[1.9 Functions as Arguments](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9-Functions-as-Arguments)", "section": "1.9 Functions as Arguments" } }, "source": [ "**Reference**: Chapter 5 of *Computational Nuclear Engineering and Radiological Science Using Python*, R. McClarren (2018)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[1.9.1 Learning Objectives](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.1-Learning-Objectives)", "section": "1.9.1 Learning Objectives" } }, "source": [ "## 1.9.1 Learning Objectives\n", "\n", "After studying this notebook, completing the activities, and asking questions in class, you should be able to:\n", "* Pass a function as an argument to a function\n", "* Define and use lambda functions" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "am_-pu3qBPou", "nbpages": { "level": 2, "link": "[1.9.2 Functions passed to Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2-Functions-passed-to-Functions)", "section": "1.9.2 Functions passed to Functions" } }, "source": [ "## 1.9.2 Functions passed to Functions" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[1.9.2 Functions passed to Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2-Functions-passed-to-Functions)", "section": "1.9.2 Functions passed to Functions" } }, "source": [ "Functions can also use other functions. In the example below, the function my_g takes my_f as an input. Try and predict its output before you run the cell.\n", "\n", "$$g(x) = f(x)^2 + 1$$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "nbpages": { "level": 2, "link": "[1.9.2 Functions passed to Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2-Functions-passed-to-Functions)", "section": "1.9.2 Functions passed to Functions" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "101.0\n" ] } ], "source": [ "def my_f(x):\n", " return (x/3)*5\n", "\n", "def my_g(f,x):\n", " return f(x)**2+1\n", "\n", "print (my_g(my_f,6))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "djEUym1CBPo1", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "### 1.9.2.1 Motivating Example: Midpoint Integration" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "KLzhDxTqBPo2", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "Recall the Midpoint formula for approximating an integral.\n", "\n", "With only one element:\n", "\n", "$$\\int_{a}^{b} f(x) dx \\approx f\\left(\\frac{a + b}{2}\\right) (b - a)$$\n", "\n", "With $N$ elements:\n", "\n", "$$\\int_{a}^{b} f(x) dx \\approx \\Delta x \\sum_{i=0}^{N-1} f(m_i) ~~,$$\n", "\n", "where $$\\Delta x = \\frac{b - a}{N} ~~,$$ and $$m_i = i \\cdot \\Delta x +\\frac{\\Delta x}{2} + a ~~.$$" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qCTvbbeBBPo3", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "We want to integrate an **arbitrary function** using the midpoint rule. To do this, we need to evaluate the function at several values to calculate the midpoint sum.\n", "\n", "In the following Python code, argument ``f`` is a **function** with a scalar input and scalar output.\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 238 }, "colab_type": "code", "executionInfo": { "elapsed": 253, "status": "ok", "timestamp": 1548850752838, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "qRpk6buBBPo4", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" }, "outputId": "e9b3a315-28ad-4385-9b82-d9149d9f4764" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function midpoint_rule in module __main__:\n", "\n", "midpoint_rule(f, a, b, num_intervals)\n", " integrate function f using the midpoint rule\n", " \n", " Args:\n", " f: function to be integrated, it must take one argument\n", " a: lower bound of integral range\n", " b: upper bound of integral range\n", " num_intervals: the number of intervals to break [a,b] into\n", " Returns:\n", " estimate of the integral\n", "\n" ] } ], "source": [ "def midpoint_rule(f,a,b,num_intervals):\n", " \"\"\"integrate function f using the midpoint rule\n", "\n", " Args:\n", " f: function to be integrated, it must take one argument\n", " a: lower bound of integral range\n", " b: upper bound of integral range\n", " num_intervals: the number of intervals to break [a,b] into\n", " Returns:\n", " estimate of the integral\n", " \"\"\"\n", " L = (b-a) #how big is the range\n", " dx = L/num_intervals #how big is each interval\n", " #midpoints are a+dx/2, a+3dx/2, ..., b-dx/2\n", " midpoints = np.arange(num_intervals)*dx+0.5*dx+a\n", " integral = 0\n", " for point in midpoints:\n", " integral += f(point)\n", " return integral*dx\n", "\n", "help(midpoint_rule)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 220, "status": "ok", "timestamp": 1548776116828, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "FqzOO4bwPpW0", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" }, "outputId": "262bdf4f-7109-4599-f814-b20eb9384d10" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5]\n" ] } ], "source": [ "import numpy as np\n", "a = 1.0\n", "dx = 1.0\n", "midpoints = np.arange(10)*dx+0.5*dx+a\n", "\n", "print(midpoints)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "djdVleBxBPo6", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "Thus ``midpoint_rule`` is a function that takes another function, ``f``, as an argument (input)." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "4ISlt7bMBPo7", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "Now we will approximate:\n", "\n", "$$\\int_0^\\pi \\sin x ~ dx$$\n", "\n", "using $N=10$ and the midpoint rule. The analytic solution (correct answer) is 2." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 212, "status": "ok", "timestamp": 1548776222243, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "w_ncqQsGBPo8", "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" }, "outputId": "7b778762-97c3-4b27-fb50-5de7c2862671" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.0082484079079745\n" ] } ], "source": [ "print(midpoint_rule(np.sin,0,np.pi,10))" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "

\n", "Home Activity: Approximate the integral below using the midpoint formula with 5 intervals. Store your answer in approx_integral.\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "source": [ "$$\\int_\\pi^{2 \\pi} x \\cos x ~ dx$$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.9659448856595125\n" ] } ], "source": [ "# YOUR SOLUTION HERE" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true, "nbgrader": { "grade": true, "grade_id": "integral-approximation", "locked": true, "points": "0.3", "solution": false }, "nbpages": { "level": 3, "link": "[1.9.2.1 Motivating Example: Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.1-Motivating-Example:-Midpoint-Integration)", "section": "1.9.2.1 Motivating Example: Midpoint Integration" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "n8U3RtCSBPpC", "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "source": [ "### 1.9.2.2 Convergence Analysis" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "hSb3-HOVBPpD", "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "source": [ "*At what rate does an approximation converge to the true solution?* is a central question in numerical analysis.\n", "\n", "Let's characterize the convergence of the midpoint approximation for this particular integral." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 476 }, "colab_type": "code", "executionInfo": { "elapsed": 16534, "status": "ok", "timestamp": 1548850774357, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "U4oNbelmBPpF", "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" }, "outputId": "c36091fa-52e7-4e5a-b9e4-787198d81d43" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "We will consider the following values of N:\n", "[ 1 10 100 1000 10000 100000 1000000 10000000]\n", " \n", "Considering N = 1\n", "Considering N = 10\n", "Considering N = 100\n", "Considering N = 1000\n", "Considering N = 10000\n", "Considering N = 100000\n", "Considering N = 1000000\n", "Considering N = 10000000\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import math\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# Define values of N to consider\n", "num_intervals = 8 #number of interval sizes\n", "intervals = 10**np.arange(num_intervals) #run several different intervals\n", "print(\"We will consider the following values of N:\")\n", "print(intervals)\n", "print(\" \")\n", "\n", "\n", "# Allocate an array to store result\n", "integral_error = np.zeros(num_intervals)\n", "\n", "# Define integration limits\n", "a = 0\n", "b = np.pi\n", "\n", "# Loop over different values of N\n", "count = 0\n", "for interval in intervals:\n", " print(\"Considering N =\",interval)\n", " integral_error[count] = np.fabs(2 - midpoint_rule(np.sin,a,b,interval))\n", " count += 1\n", "\n", "# Create figure\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "import matplotlib.ticker as mtick\n", "plt.loglog(intervals,integral_error,marker=\"o\",markersize = 10,linewidth=2);\n", "plt.xlabel(\"# of intervals\")\n", "plt.ylabel(\"Error in midpoint rule\")\n", "plt.axis([1,1.5e7,1.0e-13,10])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "source": [ "
\n", "Class Activity: Copy the code from above to below. Adapt it to analyze the integal from the previous home activity.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "source": [ "
\n", "Class Activity: Approximate the exponential integration function below using the midpoint formula.\n", "
" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "LwNkfr_RBPpI", "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "source": [ "Approximate the exponential integral function:\n", "$$E_n(x) = \\int\\limits_1^\\infty \\frac{e^{-xt}}{t^n} ~ \\!dt ~.$$\n", "\n", "Use $N = 10^6$ element, $x=1$, $n=1$, and an upper bound of 10,000 (instead of infinity)." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": {}, "colab_type": "code", "id": "Rh25d-waBPpI", "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.21938086941811155\n" ] } ], "source": [ "def exp_int_argument(t,n=1,x=1):\n", " ''' Exponential function integrand\n", " \n", " Arguments:\n", " t: scalar\n", " n: scalar, default is n=1\n", " x: scalar, default is x=1\n", " \n", " Returns:\n", " f: value of integrand at t,n,x\n", " '''\n", " \n", " ###BEGIN SOLUTION\n", " f = np.exp(-x*t)/t**n\n", " return f\n", "\n", "approx_exp_integral = midpoint_rule(exp_int_argument, 1, 10000, 10**6)\n", "print(approx_exp_integral)\n", "###END SOLUTION\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6o98IID9BPpM", "nbpages": { "level": 3, "link": "[1.9.2.2 Convergence Analysis](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.2-Convergence-Analysis)", "section": "1.9.2.2 Convergence Analysis" } }, "source": [ "The exact answer is 0.2193839343." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "T3BIXk9TBPpN", "nbpages": { "level": 3, "link": "[1.9.2.3 A Fancier Integration Function](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.3-A-Fancier-Integration-Function)", "section": "1.9.2.3 A Fancier Integration Function" } }, "source": [ "### 1.9.2.3 A Fancier Integration Function" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NSQxKRCIBPpO", "nbpages": { "level": 3, "link": "[1.9.2.3 A Fancier Integration Function](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.3-A-Fancier-Integration-Function)", "section": "1.9.2.3 A Fancier Integration Function" } }, "source": [ "Using matplotlib we can make an even fancier integration function" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 311 }, "colab_type": "code", "executionInfo": { "elapsed": 590, "status": "ok", "timestamp": 1548851335797, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "FGElfOANBPpO", "nbpages": { "level": 3, "link": "[1.9.2.3 A Fancier Integration Function](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.3-A-Fancier-Integration-Function)", "section": "1.9.2.3 A Fancier Integration Function" }, "outputId": "dfbcf55f-21ce-4289-c648-5c9e86ffe4b3" }, "outputs": [ { "data": { "text/plain": [ "-3.487868498008632e-16" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "def midpoint_rule_graphical(f,a,b,num_intervals,filename):\n", " \"\"\"integrate function f using the midpoint rule\n", "\n", " Args:\n", " f: function to be integrated, it must take one argument\n", " a: lower bound of integral range\n", " b: upper bound of integral range\n", " num_intervals: the number of intervals to break [a,b] into\n", " Returns:\n", " estimate of the integral\n", " Side Effect:\n", " Plots intervals and areas of midpoint rule\n", " \"\"\"\n", " # Create plot\n", " ax = plt.subplot(111)\n", " \n", " # Setup, similar to previous midpoint_rule function\n", " L = (b-a) #how big is the range\n", " dx = L/num_intervals #how big is each interval\n", " midpoints = np.arange(num_intervals)*dx+0.5*dx+a\n", " x = midpoints\n", " #y = np.zeros(num_intervals)\n", " integral = 0\n", " count = 0\n", " \n", " # Loop over points\n", " for point in midpoints:\n", " # Evaluate function f\n", " #y[count] = f(point)\n", " \n", " # Calculate integral\n", " integral = integral + f(point)\n", " \n", " # Calculate verticies for plots\n", " verts = [(point-dx/2,0)] + [(point-dx/2,f(point))]\n", " verts += [(point+dx/2,f(point))] + [(point+dx/2,0)]\n", " \n", " # Draw rectangles\n", " poly = plt.Polygon(verts, facecolor='0.8', edgecolor='k')\n", " ax.add_patch(poly)\n", " \n", " # Incrememnt counter\n", " count += 1\n", " # y = f(x)\n", " \n", " # Draw smooth line for f\n", " smooth_x = np.linspace(a,b,10000)\n", " smooth_y = f(smooth_x)\n", " plt.plot(smooth_x, smooth_y, linewidth=1)\n", " \n", " # Add labels and title\n", " plt.xlabel(\"x\")\n", " plt.ylabel(\"f(x)\")\n", " plt.title(\"Integral Estimate is \" + str(integral*dx))\n", " \n", " # Save figure\n", " plt.savefig(filename)\n", " \n", " # Return approximation for integral\n", " return integral*dx\n", "\n", "# Call function\n", "midpoint_rule_graphical(np.sin,0,2*np.pi,4,'C4_fig7.pdf')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "CAMl3sgqBPpS", "nbpages": { "level": 3, "link": "[1.9.2.3 A Fancier Integration Function](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.3-A-Fancier-Integration-Function)", "section": "1.9.2.3 A Fancier Integration Function" } }, "source": [ "
\n", "Class Activity: Also apply to the previous class example. The code below will not work until exp_int_argument is defined correctly.\n", "
" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 328 }, "colab_type": "code", "executionInfo": { "elapsed": 675, "status": "ok", "timestamp": 1548851421821, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "D_Veez_IBPpU", "nbpages": { "level": 3, "link": "[1.9.2.3 A Fancier Integration Function](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.2.3-A-Fancier-Integration-Function)", "section": "1.9.2.3 A Fancier Integration Function" }, "outputId": "45a55754-914f-406a-c15a-869d470f87c5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Answer is 0.2193839343\n", "Our appoximation with upper bound 5 and 100 points is 0.21818671430783745\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "num_points = 100\n", "upper_bound = 5\n", "print(\"Answer is 0.2193839343\")\n", "print(\"Our appoximation with upper bound\",upper_bound,\"and\",num_points,\"points is\"\n", " ,midpoint_rule_graphical(exp_int_argument,1,upper_bound,num_points,'C4_fig8.pdf'))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "DXv_A6SaBPpY", "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" } }, "source": [ "## 1.9.3 Lambda Functions" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "m_x53t6pBPpa", "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" } }, "source": [ "Python also allows you to define a **lambda function**, which is basically a one line function without the whole def business. Here's an example where the lambda function is a line." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "212t9-TMvg8x", "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" } }, "outputs": [], "source": [ "# `Normal` function definition\n", "def simple_line(x):\n", " '''Fill me in!!!\n", " \n", " '''\n", " return 2.0*x + 1.0" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 330 }, "colab_type": "code", "executionInfo": { "elapsed": 485, "status": "ok", "timestamp": 1548851559789, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "Hm2e0UT1BPpa", "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" }, "outputId": "f16b643c-3f17-40ba-a5b8-aba8128caaf4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The line at x = 0 is 1.0\n", "The line at x = 1 is 3.0\n", "The line at x = 2 is 5.0\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# define the function `simple_line` with a single line of code\n", "simple_line = lambda x: 2.0*x + 1.0\n", "\n", "# Evaluate function at three values of x\n", "print(\"The line at x = 0 is\", simple_line(0))\n", "print(\"The line at x = 1 is\", simple_line(1))\n", "print(\"The line at x = 2 is\", simple_line(2))\n", "\n", "# Evaluate function at many values of f\n", "x = np.linspace(0,6,50)\n", "y = simple_line(x)\n", "\n", "# Make plot\n", "plt.plot(x,y)\n", "plt.ylabel(\"y\")\n", "plt.xlabel(\"x\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6tv08uh5BPpc", "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" } }, "source": [ "Lambda functions in Python are analogous to **anonymous functions in MATLAB**." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" } }, "source": [ "
\n", "Home Activity: Predict the output of the code below before you run it.\n", "
" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "nbpages": { "level": 2, "link": "[1.9.3 Lambda Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3-Lambda-Functions)", "section": "1.9.3 Lambda Functions" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n", "6\n" ] } ], "source": [ "func_1 = (lambda x: x + x)(2)\n", "func_2 = lambda x, y:x+y\n", "\n", "print (func_1)\n", "print (func_2(1,5))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "zieTtP4jBPpd", "nbpages": { "level": 3, "link": "[1.9.3.1 Example: Lambda Functions and Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.1-Example:-Lambda-Functions-and-Midpoint-Integration)", "section": "1.9.3.1 Example: Lambda Functions and Midpoint Integration" } }, "source": [ "### 1.9.3.1 Example: Lambda Functions and Midpoint Integration" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "7-jcDaZkBPpf", "nbpages": { "level": 3, "link": "[1.9.3.1 Example: Lambda Functions and Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.1-Example:-Lambda-Functions-and-Midpoint-Integration)", "section": "1.9.3.1 Example: Lambda Functions and Midpoint Integration" } }, "source": [ "We can use lambda functions in our midpoint integration routine as well. Here we define a Gaussian as the integrand:\n", "\n", "$$\\int_{-\\infty}^{\\infty} \\frac{e^{-x^2}}{\\sqrt{\\pi}} dx$$\n", "\n", "The analytic answer to the integral is 1." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 311 }, "colab_type": "code", "executionInfo": { "elapsed": 507, "status": "ok", "timestamp": 1548851724133, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "_YyUguPSBPpf", "nbpages": { "level": 3, "link": "[1.9.3.1 Example: Lambda Functions and Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.1-Example:-Lambda-Functions-and-Midpoint-Integration)", "section": "1.9.3.1 Example: Lambda Functions and Midpoint Integration" }, "outputId": "793be183-d569-4f94-ec62-c6f40242d5f2" }, "outputs": [ { "data": { "text/plain": [ "0.999980808068639" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Define lambda function\n", "gaussian = lambda x: np.exp(-x**2)/np.sqrt(np.pi) #function to compute gaussian\n", "\n", "# Approximate integral using lambda function\n", "midpoint_rule_graphical(gaussian,-3,3,20,'C4-with-lambda-func.pdf')" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 311 }, "colab_type": "code", "executionInfo": { "elapsed": 590, "status": "ok", "timestamp": 1548851732347, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "LnGbIlfkwZUL", "nbpages": { "level": 3, "link": "[1.9.3.1 Example: Lambda Functions and Midpoint Integration](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.1-Example:-Lambda-Functions-and-Midpoint-Integration)", "section": "1.9.3.1 Example: Lambda Functions and Midpoint Integration" }, "outputId": "2fec5b6f-8b30-402c-af5c-410b37a589b7" }, "outputs": [ { "data": { "text/plain": [ "0.999980808068639" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Approximate integral with more manual approach\n", "midpoint_rule_graphical(lambda x: np.exp(-x**2)/np.sqrt(np.pi),-3,3,20,'C4-without-lambda-func.pdf')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Y9PVWLpYBPpj", "nbpages": { "level": 3, "link": "[1.9.3.2 4c-ii. Extension to Two Dimensional Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.2-4c-ii.-Extension-to-Two-Dimensional-Functions)", "section": "1.9.3.2 4c-ii. Extension to Two Dimensional Functions" } }, "source": [ "### 1.9.3.2 4c-ii. Extension to Two Dimensional Functions\n", "\n", "We will revisit numeric integration at the end of the semester. We can use two lambda functions to extend the midpoint rule to integrate two dimensional functions, such as\n", "\n", "$$\\int_{0}^{\\pi} \\int_{0}^{\\pi} \\sin(x) \\sin(y) dx dy ~~.$$" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.9.3.2 4c-ii. Extension to Two Dimensional Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.2-4c-ii.-Extension-to-Two-Dimensional-Functions)", "section": "1.9.3.2 4c-ii. Extension to Two Dimensional Functions" } }, "source": [ "
\n", "Home Activity: Spend 5-10 minutes brainstorming how to approximate a 2 dimensional integral by calling the midpoint_rule function twice (nested).\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.9.3.2 4c-ii. Extension to Two Dimensional Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.2-4c-ii.-Extension-to-Two-Dimensional-Functions)", "section": "1.9.3.2 4c-ii. Extension to Two Dimensional Functions" } }, "source": [ "
\n", "Class Activity: Walk through the code below together.\n", "
" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 3452, "status": "ok", "timestamp": 1548851829922, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "PLRD7uJABPpl", "nbpages": { "level": 3, "link": "[1.9.3.2 4c-ii. Extension to Two Dimensional Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.2-4c-ii.-Extension-to-Two-Dimensional-Functions)", "section": "1.9.3.2 4c-ii. Extension to Two Dimensional Functions" }, "outputId": "55f1df03-af4b-4a6a-a45a-e172728d849c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Estimate of the integral of sin(x)sin(y), over [0,pi] x [0,pi] is 4.000003289869757\n" ] } ], "source": [ "def midpoint_2D(f,ax,bx,ay,by,num_intervals_x,num_intervals_y):\n", " \"\"\"Midpoint rule extended to 2D functions\n", " \n", " Arguments:\n", " f: function to be integrated. Takes two scalar inputs (x,y) and returns a scalar.\n", " ax: lower bound for dimension 1\n", " bx: upper bound for dimension 1\n", " ay: lower bound for dimension 2\n", " by: upper bound for dimension 2\n", " num_intervals_x: number of intervals for dimension 1\n", " num_intervals_y: number of intervals for dimension 2\n", " \n", " Returns:\n", " approximation to integral (scalar)\n", " \n", " \"\"\"\n", " \n", " # For a given y, calculate the integral in dimension 1 (from ax to bx) using midpoint rule\n", " integral_over_x = lambda y: midpoint_rule(lambda x: f(x,y),ax,bx,num_intervals_x)\n", " \n", " # Apply midpoint rule to dimension 2\n", " return midpoint_rule(integral_over_x,ay,by,num_intervals_y)\n", "\n", "# \n", "sin2 = lambda x,y:np.sin(x)*np.sin(y)\n", "print(\"Estimate of the integral of sin(x)sin(y), over [0,pi] x [0,pi] is\",\n", " midpoint_2D(sin2,0,np.pi,0,np.pi,1000,1000))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NYDCkKKkBPpn", "nbpages": { "level": 3, "link": "[1.9.3.2 4c-ii. Extension to Two Dimensional Functions](https://ndcbe.github.io/cbe-xx258/01.09-Functions-as-Arguments.html#1.9.3.2-4c-ii.-Extension-to-Two-Dimensional-Functions)", "section": "1.9.3.2 4c-ii. Extension to Two Dimensional Functions" } }, "source": [ "This code snippet defines one lambda function that takes care of the x argument to f, and another that defines the integral over x for a given y, this second function is passed to the midpoint rule. \n", "\n", "The way that this works is that when the second midpoint rule evaluates integral_over_x at a certain point in y, it evaluates the integral over all x at that point. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [1.8 Manipulating Data with Pandas](https://ndcbe.github.io/cbe-xx258/01.08-Pandas.html) | [Contents](toc.html) | [1.10 Testing and Debugging in Python](https://ndcbe.github.io/cbe-xx258/01.10-Testing-and-Debugging.html) >

\"Open

\"Download\"" ] } ], "metadata": { "colab": { "collapsed_sections": [ "EjPprXYjBPog", "JKLdQ1x6BPom" ], "name": "L5-Dictionaries-and-Functions-as-Arguments.ipynb", "provenance": [], "version": "0.3.2" }, "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }