{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "# Creating the Finite-Difference Table for Centered First and Second Derivatives, from 2nd through 10th-Order Accuracy\n", "\n", "\n", "\n", "## *Courtesy Brandon Clark*" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2021-03-07T17:10:38.726193Z", "iopub.status.busy": "2021-03-07T17:10:38.709466Z", "iopub.status.idle": "2021-03-07T17:10:55.793088Z", "shell.execute_reply": "2021-03-07T17:10:55.793689Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Installing astropy, needed for creating the output table. Please wait a few seconds...\n", "\u001b[33mWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/pip/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/pip/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/pip/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/pip/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/pip/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/astropy/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/astropy/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/astropy/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/astropy/\u001b[0m\n", "\u001b[33mWARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/astropy/\u001b[0m\n", "astropy installed.\n", "Derivative Accuracy -5 -4 -3 -2 -1 0 1 2 3 4 5 \n", "---------- -------- ------- ------- ------ ----- ---- ---------- --- ----- ----- ------- ------\n", " 1st 2 -1/2 1/2 \n", " 1st 4 1/12 -2/3 2/3 -1/12 \n", " 1st 6 -1/60 3/20 -3/4 3/4 -3/20 1/60 \n", " 1st 8 1/280 -4/105 1/5 -4/5 4/5 -1/5 4/105 -1/280 \n", " 1st 10 -1/1260 5/504 -5/84 5/21 -5/6 5/6 -5/21 5/84 -5/504 1/1260\n", " 2nd 2 1 -2 1 \n", " 2nd 4 -1/12 4/3 -5/2 4/3 -1/12 \n", " 2nd 6 1/90 -3/20 3/2 -49/18 3/2 -3/20 1/90 \n", " 2nd 8 -1/560 8/315 -1/5 8/5 -205/72 8/5 -1/5 8/315 -1/560 \n", " 2nd 10 1/3150 -5/1008 5/126 -5/21 5/3 -5269/1800 5/3 -5/21 5/126 -5/1008 1/3150\n" ] } ], "source": [ "print(\"Installing astropy, needed for creating the output table. Please wait a few seconds...\")\n", "!pip install -U pip astropy > /dev/null\n", "print(\"astropy installed.\")\n", "# Step 0: Import needed modules\n", "import numpy as np\n", "import finite_difference as fin\n", "from astropy.table import Table\n", "\n", "# Step 1: Set the maximum finite-difference accuracy order computed in the table\n", "max_fdorder = 10\n", "\n", "# Step 2: Set up table parameters\n", "# One column for deriv order, one for deriv accuracy, and max_fdorder+1\n", "numcols = 2 + max_fdorder + 1\n", "# 8 rows: max_fdorder accuracy orders per derivative order, times 2 derivative orders (first & second derivative)\n", "numrows = int(max_fdorder/2 * 2)\n", "# Center column index of table will be at 2 + max_fdorder/2 (zero-offset indexing)\n", "column_corresponding_to_zero_fd_point = 2 + int(max_fdorder/2)\n", "# The table is initialized as a matrix of zeroes in numpy...\n", "numpy_matrix = np.zeros((numrows, numcols), dtype=object)\n", "# Then we replace all elements with the empty string to match the Wikipedia article.\n", "for row in range(numrows):\n", " for col in range(numcols):\n", " numpy_matrix[row,col] = \"\"\n", "\n", "# Step 3: Construct the first-order derivative finite difference coefficients\n", "rowcount = 0\n", "for fdorder in range(2, max_fdorder+1, 2): # loop runs from 2 to max_fdorder inclusive, skipping odd orders.\n", " numpy_matrix[rowcount, 0] = \"1st\"\n", " numpy_matrix[rowcount, 1] = fdorder\n", " fdcoeffs, fdstencl = fin.compute_fdcoeffs_fdstencl(\"D0\", fdorder)\n", " for i in range(fdorder):\n", " numpy_matrix[rowcount, column_corresponding_to_zero_fd_point + fdstencl[i][0]] = fdcoeffs[i]\n", " rowcount += 1\n", "\n", "# Step 4: Construct the second-order derivative finite difference coefficients\n", "for fdorder in range(2, max_fdorder+1, 2): # loop runs from 2 to max_fdorder inclusive, skipping odd orders.\n", " numpy_matrix[rowcount, 0] = \"2nd\"\n", " numpy_matrix[rowcount, 1] = fdorder\n", " fdcoeffs, fdstencl = fin.compute_fdcoeffs_fdstencl(\"DD00\", fdorder)\n", " for i in range(fdorder+1):\n", " numpy_matrix[rowcount, column_corresponding_to_zero_fd_point + fdstencl[i][0]] = fdcoeffs[i]\n", " rowcount += 1\n", "\n", "# Step 5: Construct an astropy table from the numpy matrix with the following header info, and then print it:\n", "colnames = ['Derivative','Accuracy']\n", "for i in range(-int(max_fdorder/2),int(max_fdorder/2)+1):\n", " colnames.append(str(i))\n", "table = Table(numpy_matrix, names=colnames)\n", "table.pprint(max_width=-1)" ] } ], "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.11.1" } }, "nbformat": 4, "nbformat_minor": 4 }