Files
cds-numerical-methods/Week 1/01 Rounding and Truncation Error Analysis.ipynb
Koen Vendrig a8d2a8d775 Week 1 by Koen
2022-02-15 16:37:25 +01:00

609 lines
61 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "4ec40081b048ce2f34f3f4fedbb0be10",
"grade": false,
"grade_id": "cell-98f724ece1aacb67",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"# CDS: Numerical Methods Assignments\n",
"\n",
"- See lecture notes and documentation on Brightspace for Python and Jupyter basics. If you are stuck, try to google or get in touch via Discord.\n",
"\n",
"- Solutions must be submitted via the Jupyter Hub.\n",
"\n",
"- Make sure you fill in any place that says `YOUR CODE HERE` or \"YOUR ANSWER HERE\".\n",
"\n",
"## Submission\n",
"\n",
"1. Name all team members in the the cell below\n",
"2. make sure everything runs as expected\n",
"3. **restart the kernel** (in the menubar, select Kernel$\\rightarrow$Restart)\n",
"4. **run all cells** (in the menubar, select Cell$\\rightarrow$Run All)\n",
"5. Check all outputs (Out[\\*]) for errors and **resolve them if necessary**\n",
"6. submit your solutions **in time (before the deadline)**"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"team_members = \"Kees van Kempen, Koen Vendrig\""
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "dc812007347efe07d1810b04b82aecc2",
"grade": false,
"grade_id": "cell-aceb5d89f37bc6d8",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"## Rounding and Truncation Error Analysis\n",
"\n",
"Euler's number $e$ can be represented as the infinite series $e = \\sum_{n=0}^{\\infty} \\frac{1}{n!}$. In order to evaluate it in Python we need to truncate the series. Furthermore, we learned that every number representation and floating-point operation introduces a finite error. Thus, let's analyze the truncated series \n",
"\n",
"$$\\tilde{e} = \\sum_{n=0}^{N} \\frac{1}{n!}$$ \n",
"\n",
"in more detail."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "a9566335240ff82540477cab102633c8",
"grade": true,
"grade_id": "cell-5bceef638759678c",
"locked": false,
"points": 0,
"schema_version": 3,
"solution": true,
"task": false
}
},
"source": [
"import numpy as np\n",
"import scipy.special\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "b3c9dca0773c20141a49ea997ed80b08",
"grade": false,
"grade_id": "cell-ca1da7ba4e529d85",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"### Task 1\n",
"\n",
"Calculate $\\tilde{e}$ with Python and plot the relative error $ \\delta = \\left| \\frac{\\tilde{e} - e}{e} \\right|$ as a function of $N$ (use a log-scale for the $y$ axis)."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "96d02220ab1baff89c6a0b55c2a51989",
"grade": true,
"grade_id": "cell-c9a37605f309b484",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy.special\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def getEuler0(N):\n",
" \"\"\"\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",
" \"\"\"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": 5,
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "b68691bcdc667dcc59baeb0066264df0",
"grade": true,
"grade_id": "cell-08269af9f0d0215f",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"76.2 ms ± 486 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"25.5 µs ± 6.91 µ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": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"x = np.arange(30)\n",
"eulers = np.array([getEuler(N) for N in x])\n",
"eulerErrs = getEulerErr(eulers)\n",
"\n",
"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": 7,
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "603875c052d6cd5387018a586cc12517",
"grade": false,
"grade_id": "cell-99271f78a2313ff7",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"\"\"\"Check that getEuler and getEulerErr return the correct output for several inputs\"\"\"\n",
"assert np.allclose(getEuler(0), 1)\n",
"assert np.allclose(getEuler(1), 2)\n",
"assert np.allclose(getEuler(2), 2.5)\n",
"assert np.allclose(getEuler(10), np.e)\n",
"\n",
"assert np.allclose(getEulerErr(0), 1, rtol=1e-16)\n",
"assert np.allclose(getEulerErr(np.e), 0)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "4bd01bcb178d7114a2fa2d190ee9901e",
"grade": false,
"grade_id": "cell-94d8858f406f2f38",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"### Task 2 \n",
"\n",
"Compare the relative errors $\\delta$ for different floating point precisions as a function of $N$. To this end, we define each element of the series $e_n = \\frac{1}{n!}$ and convert it to double-precision (64 bit) and single-precision (32 bit) floating points **before** adding them up. This can be done by using Numpy's functions $\\text{numpy.float64(e_n)}$ and $\\text{numpy.float32(e_n)}$, respectively."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "0a6f03fcf93ee75868d35fa49c0c9df1",
"grade": true,
"grade_id": "cell-295e934126bd083b",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"def getEulerSinglePrecision(N):\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",
" 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": 9,
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "bc075ba57ede54360af8f3a3e813be9d",
"grade": true,
"grade_id": "cell-8a70d1055f710205",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"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",
"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": 10,
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "7bb3d88d86391242a02c95e9f0d1b46d",
"grade": false,
"grade_id": "cell-3c271c843a5614ed",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"\"\"\"Check that getEulerSinglePrecision and getEulerDoublePrecision return the correct output for several inputs\"\"\"\n",
"assert np.allclose(getEulerSinglePrecision(0), 1)\n",
"assert np.allclose(getEulerSinglePrecision(1), 2)\n",
"assert np.allclose(getEulerSinglePrecision(2), 2.5)\n",
"assert np.allclose(getEulerSinglePrecision(10), np.e)\n",
"\n",
"assert np.allclose(getEulerDoublePrecision(0), 1)\n",
"assert np.allclose(getEulerDoublePrecision(1), 2)\n",
"assert np.allclose(getEulerDoublePrecision(2), 2.5)\n",
"assert np.allclose(getEulerDoublePrecision(10), np.e)\n",
"\n",
"eeAppr_32bit = getEulerSinglePrecision(50)\n",
"eeAppr_64bit = getEulerDoublePrecision(50)\n",
"assert getEulerErr(eeAppr_32bit) > getEulerErr(eeAppr_64bit)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "2bb7d28dbc43973a9e78b2ee51047f60",
"grade": false,
"grade_id": "cell-13d15413f8f75465",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"### Task 3\n",
"\n",
"Compare the relative errors $\\delta$ for different rounding accuracies as a function of $N$. Use Python's $\\text{round(e_n, d)}$ function, where $d$ is the number of returned digits, to round each $e_n$ element before adding them up. Plot $\\delta$ vs. $N$ for $d = 1,2,3,4,5$ and add a corresponding legend."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "385cdd2874fb0313907deb17a8121b9d",
"grade": true,
"grade_id": "cell-7630c5ab8dcbb8ec",
"locked": false,
"points": 3,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"def getEulerRounding(N, d):\n",
" n = np.arange(N + 1)\n",
" e_n = 1 / scipy.special.factorial(n)\n",
" \n",
" # Instead of Python's standard round function, we use numpy.round, \n",
" # as it can handle numpy.arrays and is further the same.\n",
" eApprox = np.sum(np.round(e_n, d))\n",
" \n",
" return eApprox"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"deletable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "ef8842f1f9c732efe6ee85c9fa05de3a",
"grade": true,
"grade_id": "cell-0ef9b81c2acc546b",
"locked": false,
"points": 1,
"schema_version": 3,
"solution": true,
"task": false
}
},
"outputs": [],
"source": [
"d_list = np.arange(1, 5)\n",
"x = np.arange(30)\n",
"eulerErrs = [getEulerErr(np.array([getEulerRounding(N, d) for N in x])) for d in d_list]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"plt.yscale(\"log\")\n",
"plt.xlabel(\"N\")\n",
"plt.ylabel(\"Relative error in Euler's number $\\delta$\")\n",
"for errs in eulerErrs:\n",
" plt.plot(x, errs)\n",
"plt.legend([\"d = \" + str(d) for d in d_list])\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "9443eef390a2a436c772305c76f50dca",
"grade": false,
"grade_id": "cell-488fe0a8acdfe430",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"\"\"\"Check that getEulerRounding returns the correct output for several inputs\"\"\"\n",
"assert np.allclose(getEulerRounding(0,3), 1)\n",
"assert np.allclose(getEulerRounding(1,5), 2)\n",
"assert np.allclose(getEulerRounding(2,6), 2.5)\n",
"assert np.allclose(getEulerRounding(10,2), np.e, rtol=1e-3)\n",
"assert np.allclose(getEulerRounding(10,6), np.e, rtol=1e-5)\n",
"\n",
"eeAppr_4d = getEulerRounding(50, 4)\n",
"eeAppr_8d = getEulerRounding(50, 8)\n",
"assert getEulerErr(eeAppr_4d) > getEulerErr(eeAppr_8d)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "5a0cd9b95d380fb7f3c1560ba21442df",
"grade": false,
"grade_id": "cell-dc9fc12cd1291a10",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"### Some examples\n",
"```python\n",
"import numpy as np\n",
"\n",
"# using float32\n",
"a = 0.1234\n",
"b = np.float32(a)\n",
"\n",
"# using round\n",
"c = round(a, 2)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}