diff --git a/Week 1/01 Rounding and Truncation Error Analysis.ipynb b/Week 1/01 Rounding and Truncation Error Analysis.ipynb index b2df716..1f363cb 100644 --- a/Week 1/01 Rounding and Truncation Error Analysis.ipynb +++ b/Week 1/01 Rounding and Truncation Error Analysis.ipynb @@ -39,7 +39,7 @@ "cell_type": "raw", "metadata": {}, "source": [ - "team_members = \"\"" + "team_members = \"Koen Vendrig, Kees van Kempen\"" ] }, { @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": { "deletable": false, "nbgrader": { @@ -87,10 +87,9 @@ }, "outputs": [], "source": [ - "# Import packages here ...\n", - "\n", - "# YOUR CODE HERE\n", - "raise NotImplementedError()" + "import numpy as np\n", + "import scipy.special\n", + "from matplotlib import pyplot as plt" ] }, { @@ -117,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "metadata": { "deletable": false, "nbgrader": { @@ -134,22 +133,65 @@ }, "outputs": [], "source": [ - "def getEuler(N):\n", - " \"\"\"Don't forget to write a docstring ...\n", + "def getEuler0(N):\n", " \"\"\"\n", - " # YOUR CODE HERE\n", - " raise NotImplementedError()\n", + " Return the estimate for Euler's number truncated after N iterations using a loop.\n", + " \"\"\"\n", + " \n", + " # Implicitly initialize eApprox as a float\n", + " eApprox = 0.\n", + " \n", + " for n in range(N + 1):\n", + " eApprox += 1 / np.math.factorial(n)\n", + " \n", + " return eApprox\n", + "\n", + "def getEuler1(N):\n", + " \"\"\"\n", + " Return the estimate for Euler's number truncated after N iterations vectorization.\n", + " \"\"\"\n", + " \n", + " n = np.arange(N + 1)\n", + " \n", + " # Only scipy seems to accept arrays as input to factorial.\n", + " eApprox = np.sum(1 / scipy.special.factorial(n))\n", + " \n", + " return eApprox\n", + "\n", + "# Set getEuler to the fast implementation.\n", + "getEuler = getEuler1\n", "\n", "def getEulerErr(eApprox):\n", - " \"\"\"Don't forget to write a docstring ...\n", - " \"\"\"\n", - " # YOUR CODE HERE\n", - " raise NotImplementedError()" + " \"\"\"Return relative error to Numpy provided value for Euler's number.\"\"\"\n", + " \n", + " delta = abs( (eApprox - np.e) / np.e )\n", + " \n", + " return delta" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "75.7 ms ± 397 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "23.9 µs ± 4.85 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], + "source": [ + "# It really does seem that the loop in getEuler0 is terribly slow:\n", + "%timeit -n10 getEuler0(2000)\n", + "%timeit -n10 getEuler1(2000)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, "metadata": { "deletable": false, "nbgrader": { @@ -164,17 +206,36 @@ "task": false } }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "# do your plotting here ...\n", + "x = np.arange(30)\n", + "eulers = np.array([getEuler(N) for N in x])\n", + "eulerErrs = getEulerErr(eulers)\n", "\n", - "# YOUR CODE HERE\n", - "raise NotImplementedError()" + "plt.figure()\n", + "plt.yscale(\"log\")\n", + "plt.xlabel(\"N\")\n", + "plt.ylabel(\"Relative error in Euler's number $\\delta$\")\n", + "plt.plot(x, eulerErrs)\n", + "plt.show()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": { "deletable": false, "editable": false, @@ -225,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": { "deletable": false, "nbgrader": { @@ -243,17 +304,25 @@ "outputs": [], "source": [ "def getEulerSinglePrecision(N):\n", - " # YOUR CODE HERE\n", - " raise NotImplementedError()\n", + " n = np.arange(N + 1)\n", + " e_n = 1 / scipy.special.factorial(n)\n", + " \n", + " eApprox = np.sum(np.float32(e_n))\n", + " \n", + " return eApprox\n", "\n", "def getEulerDoublePrecision(N):\n", - " # YOUR CODE HERE\n", - " raise NotImplementedError()" + " n = np.arange(N + 1)\n", + " e_n = 1 / scipy.special.factorial(n)\n", + " \n", + " eApprox = np.sum(np.float64(e_n))\n", + " \n", + " return eApprox" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 78, "metadata": { "deletable": false, "nbgrader": { @@ -268,17 +337,38 @@ "task": false } }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "# do your plotting here ...\n", + "x = np.arange(30)\n", + "eulerErrs32 = getEulerErr(np.array([getEulerSinglePrecision(N) for N in x]))\n", + "eulerErrs64 = getEulerErr(np.array([getEulerDoublePrecision(N) for N in x]))\n", "\n", - "# YOUR CODE HERE\n", - "raise NotImplementedError()" + "plt.figure()\n", + "plt.yscale(\"log\")\n", + "plt.xlabel(\"N\")\n", + "plt.ylabel(\"Relative error in Euler's number $\\delta$\")\n", + "plt.plot(x, eulerErrs32)\n", + "plt.plot(x, eulerErrs64)\n", + "plt.legend([\"float32\", \"float64\"])\n", + "plt.show()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 79, "metadata": { "deletable": false, "editable": false, @@ -446,7 +536,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" },