{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Development II: Testing breakout\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Maclaurin series for $\\sin(x)$ is\n", "\n", "$\\sum^{\\infty}_{n=0} \\frac{(-1)^n}{(2n+1)!} x^{2n+1} = x - \\frac{x^3}{3!} + \\frac{x^5}{5!} - \\cdots\\quad\\text{ for all } x\\!$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from math import factorial\n", "from math import sin as builtin_sin\n", "import numpy as np\n", "\n", "def mysin(x,n):\n", " sin = 0\n", " for i in range(n):\n", " sign = (-1)**i\n", " sin += ((x**(2.0*i+1))/factorial(2*i+1))*sign\n", " return sin\n", "\n", "\n", "def mysin3(x):\n", " return x - (x**3)/factorial(3) + (x**5)/factorial(5)\n", "\n", "def mysin4(x):\n", " return x - (x**3)/factorial(3) + (x**5)/factorial(5) - (x**7)/factorial(7)\n", "\n", "def test():\n", " np.testing.assert_almost_equal(mysin(0.0,8),builtin_sin(0.0))\n", " assert mysin3(0.5) == mysin(0.5, 3)\n", " assert mysin4(0.5) == mysin(0.5, 4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "test()" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "AssertionError", "evalue": "\nArrays are not almost equal to 7 decimals\n ACTUAL: -1.0\n DESIRED: 0.0", "output_type": "pyerr", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mAssertionError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m\u001b[0m in \u001b[0;36mtest\u001b[1;34m()\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mtest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 20\u001b[1;33m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtesting\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0massert_almost_equal\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmysin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mbuiltin_sin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 21\u001b[0m \u001b[1;32massert\u001b[0m \u001b[0mmysin3\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mmysin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[1;32massert\u001b[0m \u001b[0mmysin4\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mmysin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib64/python2.7/site-packages/numpy/testing/utils.pyc\u001b[0m in \u001b[0;36massert_almost_equal\u001b[1;34m(actual, desired, decimal, err_msg, verbose)\u001b[0m\n\u001b[0;32m 466\u001b[0m \u001b[1;32mpass\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 467\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mround\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mabs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdesired\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mactual\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mdecimal\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 468\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mAssertionError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 469\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 470\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mAssertionError\u001b[0m: \nArrays are not almost equal to 7 decimals\n ACTUAL: -1.0\n DESIRED: 0.0" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "%debug" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "> \u001b[1;32m\u001b[0m(18)\u001b[0;36mtest\u001b[1;34m()\u001b[0m\n", "\u001b[1;32m 17 \u001b[1;33m\u001b[1;32mdef\u001b[0m \u001b[0mtest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[1;32m---> 18 \u001b[1;33m \u001b[1;32massert\u001b[0m \u001b[0mmysin3\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mmysin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[1;32m 19 \u001b[1;33m \u001b[1;32massert\u001b[0m \u001b[0mmysin4\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mmysin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "ipdb> mysin3(0.5)\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "0.47942708333333334\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "ipdb> \n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "0.47942708333333334\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "ipdb> q\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "builtin_sin(0.5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "0.479425538604203" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Fix the test.\n", "1. The Maclaurin series for $\\sin(x)$ is only valid in some neighborhood of values of x \"near\" 0. Decide what values of x you will accept for the `mysin` functions and then modify each function to only " ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.ge" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }