{ "cells": [ { "cell_type": "markdown", "metadata": { "lines_to_next_cell": 0 }, "source": [ "# Finite volumes 9 - finite-difference approximations" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from IPython.display import Image" ] }, { "cell_type": "markdown", "metadata": { "lines_to_next_cell": 0 }, "source": [ "\n", "\n", "## Learning goals\n", "1. Be able to develop finite-difference approximations for first and second derivatives (total and partial).\n", "2. Be able to determine the truncation error and order of a finite - difference approximation from Taylor-series analysis.\n", "3. Can construction forwards, backwards and central finite difference approximation stencils.\n", "4. Can distinguish truncation error from roundoff error.\n", "5. Can identify the controls truncation error, and recognize pathological situations which lead to large truncation errors.\n", "6. Using a finite-difference stencil, can construct the system of equations for a finite-difference approximation to an ordinary or partial differential equation, including defining the grid of nodes and applying first-type (Dirichlet) and second-type (Neumann) boundary conditions.\n", "7. Can compare and contrast and finite-difference approximation to a finite-volume approximation (this last learning will only become apparent after we introduce the integral formulation of the finite-volume method and of our conservation PDEs).\n", "\n", "Advanced reference: LeVeque, Randal J, *Finite difference methods for ordinary and partial differential equations: Steady-state and time-dependent problems,* 2007 (can be downloaded from UBC library here: __[UBC library link](http://gw2jh3xr2c.search.serialssolutions.com/?ctx_ver=Z39.88-2004&ctx_enc=info%3Aofi%2Fenc%3AUTF-8&rfr_id=info%3Asid%2Fsummon.serialssolutions.com&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.title=Finite+difference+methods+for+ordinary+and+partial+differential+equations&rft.au=LeVeque%2C+Randall+J&rft.date=2007-01-01&rft.pub=Society+for+Industrial+and+Applied+Mathematics&rft.isbn=9780898716290&rft.externalDocID=SIAMB0000334¶mdict=en-US)__ " ] }, { "cell_type": "markdown", "metadata": { "lines_to_next_cell": 0 }, "source": [ "## Finite-difference approximations to derivatives\n", "\n", "In notebook `6_finite_volume_4.ipynb` (https://phaustin.github.io/eosc213/web_notebooks/6_finite_volume_4.html) we were inspired to approximate the $x$ component of the gradient in concentration as\n", "\n", "

\n", "\\begin{align}\n", "{\\partial c \\over \\partial x} &\\approx {c(x+\\Delta x) - c(x)\\over \\Delta x} \\label{fd881}\\\\\n", "\\end{align}\n", "

\n", "where $\\Delta x$ is not infinitesimal, based upon the definition of the derivative where it is:\n", "

\n", "\n", "\\begin{align}\n", "{\\partial c \\over \\partial x} &= \\lim_{\\Delta x \\rightarrow 0} {c(x+\\Delta x) - c(x)\\over \\Delta x} \\label{fd882}\\\\\n", "\\end{align}\n", "\n", "where $c(x+\\Delta x)$ is notation for \"the concentration at the point $x+\\Delta x, y, z$\".\n", "\n", "

\n", "\n", "Here we want to evaluate the accuracy of these finite-difference approximations. To do that, we need to look at **Taylor series representations** of functions.\n", "

\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "lines_to_next_cell": 0 }, "source": [ "### Intuition\n", "\n", "Let's first look at a simple function that we know so we can calculate the derivatives using calculus and compare them to the our finite-difference approximations. Then we'll dig into the theory using Taylor Series.\n", "

\n", "Let's try the following function which is easy to plot and differentiate:\n", "

\n", "\\begin{align}\n", "f(x)&= -(x - 2.5)^3 + 5\n", "\\end{align}\n", "

\n", "We can implement it in python below as `func_1`.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def func_1(x):\n", " \"\"\"\n", " A simple function to be used to investigate test finite-difference approximations to derivatives\n", "\n", " Parameters\n", " ----------\n", " x: (float)\n", " function argument\n", "\n", " Returns\n", " -------\n", " func_1(x): (float)\n", " the value of the function when argument is x\n", " \"\"\"\n", " return -(x - 2.5) ** 3 + 5.0" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def dfunc_1(x):\n", " \"\"\"\n", " The derivative of func_1\n", "\n", " Parameters\n", " ----------\n", " x: (float)\n", " function argument\n", "\n", " Returns\n", " -------\n", " dfunc_1(x): (float)\n", " the derivative of the function when argument is x\n", " \"\"\"\n", " return -3.0 * (x - 2.5) ** 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot it over short interval to see what it looks like. Using a rather coarse separation between points ($\\Delta x = 1.$):" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x_pts = np.arange(0.0, 6.0, 1.0) # creates an array [-3.,-2.,..., 2.0]\n", "y_pts = func_1(\n", " x_pts\n", ") # computes the function at each point in x_pts, stores result in array y_pts\n", "plt.plot(x_pts, y_pts, \"-o\") # plot with points" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x f(x)\n", " 0.0, 20.62\n", " 1.0, 8.38\n", " 2.0, 5.12\n", " 3.0, 4.88\n", " 4.0, 1.62\n", " 5.0, -10.62\n" ] } ], "source": [ "# print out points\n", "print(f\" x f(x)\")\n", "for j in range(len(x_pts)):\n", " print(f\"{x_pts[j]: 3.1f}, {y_pts[j]: 3.2f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Backward difference\n", "\n", "Let's look at evaluating the derivative at $x=2.0$ using values of the function at neighbouring points. One option is to make a straight-line approximation using the value of the function at $x=1$ and $x=2$:\n", "

\n", "\\begin{align}\n", "\\left.{df(x)\\over dx} \\right| & \\approx \\frac{f(x)-f(x-\\Delta x)}{\\Delta x} \\\\\n", "\\left.{df(x)\\over dx} \\right|_{x=2} & \\approx \\frac{f(2)-f(1)}{2-1} = (5.12 - 8.38)/1.0 = -3.26\\\\\n", "\\end{align}\n", "

\n", "\n", "So, we approximate the slope at $x=2$ by the slope of the line that connects $f(1)$ and $f(2)$:\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x_pts, y_pts, \"-o\") # plot the function\n", "plt.title(\"Backward difference\")\n", "plt.plot(x_pts[1:3], y_pts[1:3], \"-r\", linewidth=5) # plot the line segment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Forward difference\n", "\n", "Here we make a straight-line approximation for the derivative at $x=2$ using the value of the function at $x=3$ and $x=2$:\n", "

\n", "\\begin{align}\n", "\\left.{df(x)\\over dx} \\right| & \\approx \\frac{f(x+\\Delta x)-f(x)}{\\Delta x} \\\\\n", "\\left.{df(x)\\over dx} \\right|_{x=2} & \\approx \\frac{f(3)-f(2)}{3-2} = (4.88 - 5.12)/1.0 = -0.24\\\\\n", "\\end{align}\n", "

\n", "\n", "Shown graphically:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x_pts, y_pts, \"-o\")\n", "plt.title(\"Forward difference\")\n", "\n", "plt.plot(x_pts[2:4], y_pts[2:4], \"-r\", linewidth=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Central difference\n", "\n", "Here we make a straight-line approximation for the derivative at $x=2$ using the value of the function at $x=3$ and $x=1$:\n", "

\n", "\\begin{align}\n", "\\left.{df(x)\\over dx} \\right| & \\approx \\frac{f(x+\\Delta x)-f(x-\\Delta x)}{2\\Delta x} \\\\\n", "\\left.{df(x)\\over dx} \\right|_{x=2} & \\approx \\frac{f(3)-f(1)}{3-1} = {(4.88 - 8.38)\\over 2.0} = -1.75\\\\\n", "\\end{align}\n", "

\n", "\n", "Shown graphically:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x_pts, y_pts, \"-o\")\n", "plt.title(\"Central difference\")\n", "\n", "plt.plot((x_pts[1], x_pts[3]), (y_pts[1], y_pts[3]), \"-r\", linewidth=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Collecting them all together, and including the tangent line at that point, which is computed using the exact derivative:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "lines_to_next_cell": 2 }, "outputs": [ { "data": { "text/plain": [ "(0, 5.0, 3.0, 10.0)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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xBAUFETnzp3x9PQkOjqaKlWqMHnyZGJjYylXrhxbtmyhbNmydO/ePct+Fk8jd8g5VKVKlcifPz8XL17k4sWL1g5HCCEszjBkfejQIZYtWwaohNq3b18A/P39KVGihDEhN2/e3LjrU8OGDdm5cyfHjx+nUqVKeHt7ExERwd69e403NDNnziQgIIC6dety8eJFTp06Bahn1507dwYgLCyMUqVKUa5cOTRNo0+fPtn6M0hJEnIO5eDgYJxtLXfJQojc4klbQebNm9f42rAz3vr162nUqBENGzZkyZIl5MuXDw8PD7Zt28amTZvYu3cvhw8fpnr16sbdpPLkyZPqubGmZd0IQUbIkHUO1rBhQzZs2MD27dutOowihLBvTxpWzm6NGjVi0aJFNG3alJMnT3LhwgUqVKjA33//nebcevXq8cUXX7BlyxYiIyPp0qULXbp0AeDu3bsULFgQd3d3wsLCHlv50N/fn7Nnz3L69GnKlCnDzz//nKXf35PIHXIO9txzzwEYJzUIIYS9e/3110lKSqJq1ap0796defPm4erq+shzGzZsSGJiImXLlqVGjRrcunWLhg0bAtCqVSsSExOpVq0aEydOpG7duo/sI0+ePMyaNYs2bdoQHBxMiRIlsux7exrtScMDllarVi19//792XY9W5eQkEDBggWJjo7mypUr+Pj4WDskIYSd+Pfff6lYsaK1w7Arj/qZapp2QNf1dO0VKXfIOZizszPBwcGAWqwuhBDCfklCzuFk2FoIIXIHScg5nCRkIYTIHSQh53A1atTAw8OD8PBwLl26ZO1whBBCZBFJyDmck5OTcdag3CULIYT9koRsA2TYWggh7J8kZBtgSMgy01oIYU8M2y8GBARQo0aNTFcl7N+/P0uXLrVwdI9XsmRJbt68afF+JSHbgMDAQAoUKMDZs2c5f/68tcMRQgiLMNSyPnz4MB999BHjxo2zdkhpJCYmZtu1JCHbAEdHRxo1agTIsLUQwj7du3ePggULAnD//n2ef/55atSoQdWqVVmxYoXxvAULFlCtWjUCAgKMm1CkNHHiRPr3709oaCidOnUCYMWKFbi5uREfH09sbCylS5cGYPbs2QQFBREQEEDnzp158OABoO64R40axXPPPcc777xDZGQkLVq0oHr16rzyyitPrLdtDqllbSOee+45Vq5cydatW+nfv7+1wxFC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LC6Xi549exIcHHxdn7lp0yZiY2MpKCggJSWFPn36eDKy+DlNWYvITaegoID33nuv+LW1lg0bNtCvXz9q167NhAkTOHjw4DV/7ncXeQ0ePJj9+/d7LLPId6kgi4hfCAgIYN++faxatYouXbq47Tt79ixz5szhjjvu4Oc///k1Nx156qmnGDBgAP/+97/p1asXmZmZno4voilrEfFPR44cYenSpSQlJXHq1KkS+/ft28edd9551Z+Xk5NDmzZt2LNnD927d2ft2rUlnnIl8n2ashaRm150dDTTp0/n2LFjrFu3jl69ehEYGAjAvffeW6IYZ2VlXbHpyDeLvKpWrcq6detYunSpV/PLzUcFWUT8WmBgIN26dWP16tWcPHmSl156ifHjx5cYFx8f/6NNR6Kjo3nttdcAePLJJ3/wylvkemnKWkRuetZaYmJiSEtLK94WExODy+Vi8ODB1KhRw21sXFwc7777rqau5UdpylpE5BqcPXuWChUquG07ePAg48ePJyIign79+rFx40by8/MxxhAfH8+tt97KunXrWLFihUOpxd+oIIvITa9mzZrs3r2b7du3M2LECEJDQ4v35eXlkZKSwv3338/tt9/OtGnTqFq1Kq+88goAY8aM4cyZM05FFz9ywwXZGBNojNlljHnXE4FERJxgjOGee+5h8eLFnD59mqVLl9KmTRu3McePHycxMZHy5cszbNgw7rvvPjIzMxk9erRXHnQhNxdPXCGPBT7zwOeIiPiE0NBQhg0bxt/+9jf279/PE088QfXq1QEYPnw4gYGBGGNISEggNDSUt99+m3nz5jmcWsq6GyrIxphIoDuQ6Jk4IiK+pXHjxrzyyiucOnWKVatWuT1dqk6dOsyZMweAcePG0aZNG5YvX86FCxeciitl2A2tsjbGvAW8BFQGfmut7fEDYx4FHgWoU6dOi2PHjl338UREfE1aWhoNGzZ023brrbcyaNAgRowYQfPmzR1KJr6gVFZZG2N6AGettTuvNM5au9ha29Ja2/InP/nJ9R5ORMQn5eXllWjVee7cORYsWMBdd91Fy5YtiY+Pv2LTERG4sSnrtkCcMeYo8CbQyRjzPx5JJSJSRjRq1Ij33nuPadOmARR3A/vGzp07GTVqFGFhYYwePdqJiFJGXHdBttZOstZGWmujgP5AqrX2EY8lExEpQ5599lnatm1Lfn4+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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x_pts2 = np.linspace(0.5, 5.0) # x points at which to plot tangent line\n", "tangent = 5.12 - 3.0 * 0.5 ** 2 * (\n", " x_pts2 - 2.0\n", ") # formula for the tangent line at x = 2\n", "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", "ax.plot(x_pts2, func_1(x_pts2), \"k\", linewidth=2, label=\"f(x)\")\n", "ax.plot(x_pts[2:4], y_pts[2:4], \"-g\", linewidth=3, label=\"Forward\")\n", "ax.plot(x_pts[1:3], y_pts[1:3], \"-b\", linewidth=3, label=\"Backward\")\n", "ax.plot((x_pts[1], x_pts[3]), (y_pts[1], y_pts[3]), \"-r\", linewidth=3, label=\"Central\")\n", "ax.plot(x_pts2, tangent, \"--k\", linewidth=3, label=\"Tangent\")\n", "ax.legend(loc=\"best\")\n", "ax.axis((0, 5.0, 3.0, 10.0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example: approximation error\n", "\n", "Let's compute the error in the approximations at $x=2$.\n", "

\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "lines_to_next_cell": 2 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exact derivative at x = 2.00, df/dx = -0.7500\n", " FD approximation |error|\n", " forward backward central forward backward central \n", " -0.250 -3.250 -1.750 0.500 2.500 1.000\n", " -0.250 -1.750 -1.000 0.500 1.000 0.250\n", " -0.438 -1.188 -0.812 0.312 0.438 0.062\n", " -0.578 -0.953 -0.766 0.172 0.203 0.016\n", " -0.660 -0.848 -0.754 0.090 0.098 0.004\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = 2.0\n", "exact_d = dfunc_1(x) # exact derivative coded above\n", "print(f\"Exact derivative at x = {x:2.2f}, df/dx = {exact_d:3.4f}\")\n", "print(f\" FD approximation |error|\")\n", "print(f\" forward backward central forward backward central \")\n", "\n", "# Compute the error for a sequence of values of dx that decrease by a factor of two in size\n", "dx_vals = np.array([1.0, 0.5, 0.25, 0.125, 0.0625])\n", "\n", "# python - empty arrays that will hold the errors as we loop through the computation for different dx\n", "for_err = []\n", "back_err = []\n", "cent_err = []\n", "\n", "# python iteration over elements in the np array dx_vals\n", "for dx in np.nditer(dx_vals):\n", " # to avoid repeated function calls (for efficiency) store function calls in temporary variables\n", " f_xpdx = func_1(x + dx) # f(x+dx) value of the function at x+dx\n", " f_x = func_1(x) # f(x) value of the function at x\n", " f_xmdx = func_1(x - dx) # f(x-dx) value of the function at x-dx\n", "\n", " for_dif = (f_xpdx - f_x) / dx # compute forward, backward and central difference\n", " back_dif = (f_x - f_xmdx) / dx\n", " cent_dif = (f_xpdx - f_xmdx) / (2.0 * dx)\n", "\n", " # compute the absolute value of the error, add to a list using .append method\n", " for_err.append(abs(for_dif - exact_d)) \n", " back_err.append(abs(back_dif - exact_d))\n", " cent_err.append(abs(cent_dif - exact_d))\n", " # erros are now stored in lists - these are not numpy arrays\n", " sv = [\n", " f\"{item:8.3f}\"\n", " for item in [\n", " for_dif,\n", " back_dif,\n", " cent_dif,\n", " for_err[-1],\n", " back_err[-1],\n", " cent_err[-1],\n", " ]\n", " ]\n", "\n", " print(\n", " f\"{sv[0]:8>} {sv[1]:8<} {sv[2]:8<} {sv[3]:8>} {sv[4]:8>} {sv[5]:8>}\"\n", " )\n", "\n", "\n", "# must convert lists that contain errors to numpy arrays to plot with matplotlib\n", "np.asarray(for_err)\n", "np.asarray(back_err)\n", "np.asarray(cent_err)\n", "\n", "# plot it!\n", "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", "ax.loglog(dx_vals, for_err, \"k\", linewidth=2, label=\"Forward\")\n", "ax.loglog(dx_vals, back_err, \"-g\", linewidth=3, label=\"Backward\")\n", "ax.loglog(dx_vals, cent_err, \"-b\", linewidth=3, label=\"Central\")\n", "ax.set_xlabel(\"dx\", fontsize=\"large\")\n", "ax.set_ylabel(\"|error|\", fontsize=\"large\")\n", "ax.legend(loc=\"best\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Assess error\n", "\n", "Contemplate\n", "\n", "1. Which approximation is the most accurate?\n", "* Does the error depend upon $dx$?\n", "* For which approximation does the error decrease the fastest as $dx$ shrinks?\n", "\n", "

\n", "\n", "1. The accuracy depends upon $\\Delta x$. In all cases, the backwards difference is the least accurate. At large $\\Delta x$ the forward difference is the most accurate. At small $\\Delta x$, the central difference is the most accurate. Generally, we will never know which difference is the most accurate for an approximation and discretization $\\Delta x$ or $\\Delta t$. \n", "2. Yes, clearly they all drop as $\\Delta x$ decreases. Note for the forward difference that the rate of decrease only becomes regular for a sufficiently small value of $\\Delta x$. \n", "3. The error drops the most rapidly for the central difference. \n", "\n", "


\n", "In the application of finite differences to solve differential equations, the function that we are solving for is not known a priori, so the error in the approximation cannot be computed. For that reason, when we assess a finite-difference approximation, we look at **how quickly the error shrinks as we shrink** $\\Delta x$. To see that we have to revisit Taylor series.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Taylor Series analysis of finite-difference approximations\n", "\n", "Taylor series reference: Khan Academy https://www.khanacademy.org/math/ap-calculus-bc/bc-series-new/bc-10-11/v/maclaurin-and-taylor-series-intuition\n", "UBC Patrick Wall https://www.math.ubc.ca/~pwalls/math-python/differentiation/\n", "

Video - Taylor series and finite differences https://www.coursera.org/lecture/computers-waves-simulations/w2v3-taylor-series-PEN8L\n", "


\n", "#### Approach\n", "* manipulate Taylor series approximations to develop exact expressions for derivatives.\n", "* compare these expressions to finite-difference approximations and thereby develop expressions for the **truncation error** = exact - approximate.\n", "\n", "


\n", "Recall a Taylor series gives you the value of a function at a location $x_i + dx$ using the value of the function and its derivatives at the point $x_i$. Functions that can be approximated in this way are called analytic https://en.wikipedia.org/wiki/Analytic_function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "Let's represent a function $f$ at points $x_i+\\Delta x$ and $x_i-\\Delta x$:\n", "\\begin{align}\n", "f(x_i+\\Delta x) &= f(x_i) + (\\Delta x){df(x_i)\\over dx} + {(\\Delta x)^2\\over 2!}{d^2f(x_i)\\over dx^2} + {(\\Delta x)^3\\over 3!}{d^3f(x_i)\\over dx^3} \\nonumber \\\\\n", "&+ \\cdots + {(\\Delta x)^n\\over n!}{d^nf(x_i)\\over dx^n} + \\cdots \\label{8fd884} \\\\\n", "f(x_i-\\Delta x) &= f(x_i) + (-\\Delta x){df(x_i)\\over dx} + {(-\\Delta x)^2\\over 2!}{d^2f(x_i)\\over dx^2} + {(-\\Delta x)^3\\over 3!}{d^3f(x_i)\\over dx^3} + \\nonumber\\\\\n", "&\\cdots + {(-\\Delta x)^n\\over n!}{d^nf(x_i)\\over dx^n} + \\cdots \\label{8fd885} \\\\\n", "\\end{align}\n", "

\n", "#### Forward difference Taylor analysis\n", "

\n", "Subtract $f(x_i)$ from the Taylor approximation $f(x_i+\\Delta x)$ \\ref{8fd884}\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{align}\n", "f(x_i+\\Delta x) - f(x_i) &= (\\Delta x){df(x_i)\\over dx} + {(\\Delta x)^2\\over 2!}{d^2f(x_i)\\over dx^2} + {(\\Delta x)^3\\over 3!}{d^3f(x_i)\\over dx^3} + \\cdots + {(\\Delta x)^n\\over n!}{d^nf(x_i)\\over dx^n} + \\cdots \\label{8fd886} \\\\\n", "\\end{align}\n", "

\n", "Solve for ${df(x_i)\\over dx}$, the derivative at point $x_i$:\n", "

\n", "\\begin{align}\n", "{df(x_i)\\over dx} & = \\overbrace{{f(x_i+\\Delta x) - f(x_i)\\over \\Delta x}}^\\text{forward difference approximation} \\nonumber\\\\\n", "&- \\overbrace{\\frac{1}{\\Delta x}\\left[ {(\\Delta x)^2\\over 2!}{d^2f(x_i)\\over dx^2} +\n", "{(\\Delta x)^3\\over 3!}{d^3f(x_i)\\over dx^3} + \\cdots + {(\\Delta x)^n\\over n!}{d^nf(x_i)\\over dx^n} + \\cdots \\right]}^\\text{truncation error} \\label{8fd887} \\\\\n", "\\end{align}\n", "

\n", "Let's pause for a moment. The expression \\ref{8fd887} is exact. In words this expression says that the exact derivative at point $x_i$ is given by the forward-difference approximation minus a **truncation error**, all the terms in the $[]$ braces. That is, true = approximate - error.\n", "

\n", "##### Truncation error\n", "The forward difference truncation error is\n", "

\n", "\\begin{align}\n", "\\left[ \\underbrace{\\frac{(\\Delta x)}{2!}}_\\text{leading term}{d^2f(x_i)\\over dx^2} + \\underbrace{(\\Delta x)^2\\over 3!}_\\text{2nd term}{d^3f(x_i)\\over dx^3} + \\cdots + {(\\Delta x)^{n-1}\\over n!}{d^nf(x_i)\\over dx^n} + \\cdots \\right] \\label{8fd888} \\\\\n", "\\end{align}\n", "

\n", "1. What controls the size of the truncation error?\n", "* How can we characterize this truncation error?\n", "

\n", "##### Order of approximation\n", "**Problem**: when we used finite-difference approximations to compute Euler timesteps or fluxes, we did not know the function, and therefore in general we don't know the values of the derivatives ${df(x_i)\\over dx}$, ${d^2f(x_i)\\over dx^2}$, etc, in the truncation error. So instead we focus on the effects of changing $\\Delta x$ on the truncation error.\n", "

\n", "\n", "\\begin{align*}\n", "\\begin{matrix}\n", "& & \\text{leading term} & &\\text{2nd term} \\\\\n", "\\text{Reduce }\\quad \\Delta x \\quad \\text{by}\\quad 1/2 & \\text{reduces by}\\quad &1/2& \\text{reduces by}\\quad &1/4 \\\\\n", "\\text{Reduce }\\quad \\Delta x \\quad \\text{by}\\quad 1/4 & \\text{reduces by}\\quad &1/4& \\text{reduces by}\\quad &1/16 \\\\\n", "\\text{Reduce }\\quad \\Delta x \\quad \\text{by}\\quad 1/8 & \\text{reduces by}\\quad &1/8& \\text{reduces by}\\quad &1/64 \\\\\n", "\\end{matrix}\n", "\\end{align*}\n", "\n", "

\n", "When $\\Delta x$ is reduced, the leading term $(\\Delta x){df(x_i)\\over dx}$ decreases the most slowly. When $\\Delta x$ is reduced by a factor of 8, the leading term is reduced by a factor of 8, but the second term is reduced by a factor of 64. So, the error is dominated by the leading order behavior. Higher-order terms are eventually insignificant.\n", "

\n", "So, we now write\n", "

\n", "\\begin{align}\n", "{df(x_i)\\over dx} & = \\overbrace{{f(x_i+\\Delta x) - f(x_i)\\over \\Delta x}}^\\text{forward difference approximation} \\nonumber\\\\\n", "&- \\overbrace{\\left[ {(\\Delta x)\\over 2!}{d^2f(x_i)\\over dx^2} + {(\\Delta x)^2\\over 3!}{d^3f(x_i)\\over dx^3} + \\cdots + {(\\Delta x)^{n-1}\\over n!}{d^nf(x_i)\\over dx^n} + \\cdots \\right]}^\\text{truncation error} \\label{8fd889} \\nonumber \\\\\n", "& = \\overbrace{{f(x_i+\\Delta x) - f(x_i)\\over \\Delta x}}^\\text{forward difference approximation} + \\mathcal{O}(\\Delta x) \\label{8fd8810} \\\\\n", "\\end{align}\n", "

\n", "For this reason, we say that the forward difference approximation is **First order** because as $\\Delta x \\rightarrow 0$, the truncation error shrinks by $(\\Delta x)^1$." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "import antigravity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Backward difference Taylor analysis\n", "

\n", "Subtract expansion for $f(x_i-\\Delta x)$, \\ref{8fd885} from $f(x_i)$.\n", "

\n", "\\begin{align}\n", "{df(x_i)\\over dx} & = \\overbrace{{f(x_i) - f(x_i-\\Delta x)\\over \\Delta x}}^\\text{backward difference approximation} + \\mathcal{O}(\\Delta x) \\label{8fd8811} \\\\\n", "\\end{align}\n", "

\n", "The backward difference is also a **First order** approximation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Central difference Taylor analysis\n", "

\n", "Subtract expansion for $f(x_i+ \\Delta x)$, \\ref{8fd884} from $f(x_i-\\Delta x)$, \\ref{8fd885}.\n", "

\n", "\\begin{align}\n", "{df(x_i)\\over dx} & = \\overbrace{{f(x_i + \\Delta x) - f(x_i-\\Delta x)\\over 2\\Delta x}}^\\text{central difference approximation} + \\mathcal{O}(\\Delta x)^2 \\label{8fd88112} \\\\\n", "\\end{align}\n", "

\n", "The central difference is a **Second order** approximation because as $\\Delta x \\rightarrow 0$, the truncation error shrinks by $(\\Delta x)^2$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Second derivative\n", "

\n", "Add the Taylor expansions for $f(x_i+\\Delta x)$ \\ref{8fd884} and $f(x_i-\\Delta x)$ \\ref{8fd885}\n", "

\n", "\\begin{align}\n", "f(x_i + \\Delta x) + f(x_i - \\Delta x)&= 2 f(x_i) + 2{(\\Delta x)^2\\over 2!}{d^2f(x_i)\\over dx^2} + 2\\left[{(\\Delta x)^4\\over 4!}{d^4f(x_i)\\over dx^4} + \\cdots + \\right] \\label{8fd8812} \\\\\n", "\\end{align}\n", "

\n", "Solve for ${d^2f(x_i)\\over dx^2}$:\n", "

\n", "\\begin{align}\n", "{d^2f(x_i)\\over dx^2}&= \\overbrace{{f(x_i + \\Delta x) - 2 f(x_i) + f(x_i - \\Delta x)\\over (\\Delta x)^2}}^\\text{central second derivative} + \\mathcal{O}(\\Delta x)^2 \\label{8fd8813} \\\\\n", "\\end{align}\n", "

\n", "The central second derivative is also **second order**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summary of finite difference approximations\n", "We derived three approximations for the first derivative: forward, backward and central. Let's express them in terms of values of, say, concentration on a grid with constant grid spacing $\\Delta x$ and\n", "\\begin{align*}\n", "c_i = c(&x_i) \\\\\n", "c_{i+1} = c(x_i &+\\Delta x) \\\\\n", "c_{i-1} = c(x_i &- \\Delta x) \\\\\n", "\\end{align*}\n", "\n", "#### First derivative\n", "

\n", "\\begin{align}\n", "\\text{Forward} \\qquad {dc(x_i)\\over dx} =& {c_{i+1} - c_{i} \\over \\Delta x} + \\mathcal{O}(\\Delta x) \\label{8fd8814} \\\\\n", "\\text{Backward}\\qquad {dc(x_i)\\over dx}= & {c_{i} - c_{i-1} \\over \\Delta x} + \\mathcal{O}(\\Delta x) \\label{8fd8815} \\\\\n", "\\text{Central} \\qquad{dc(x_i)\\over dx} =& {c_{i+1} - c_{i-1} \\over 2\\Delta x} + \\mathcal{O}(\\Delta x)^2 \\label{8fd8816}\\\\\n", "\\end{align}\n", "

\n", "#### Second derivative\n", "

\n", "\\begin{align}\n", "\\text{Central} \\qquad{d^2c(x_i)\\over dx^2}= & {c_{i+1} -2 c_i + c_{i-1} \\over (\\Delta x)^2} + \\mathcal{O}(\\Delta x)^2 \\label{8fd8817}\\\\\n", "\\end{align}\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implications for finite volumes\n", "\n", "#### Euler methods\n", "

\n", "In the forward and backward Euler (or explicit and implicit) time stepping the time derivative is approximated as:\n", "

\n", "\\begin{align}\n", "{dc\\over dt} \\approx {c(t+\\Delta t) - c(t)\\over \\Delta t} \\label{8fd8818}\\\\\n", "\\end{align}\n", "

\n", "What is the order of this approximation?\n", "

\n", "This is a first-order forward in time approximation. Or, in math notation $\\mathcal{O}(\\Delta x)$. We do not know the value of the error, just the rate that it will decline when $\\Delta x$ is sufficiently small. \n", "

\n", "#### Fluxes\n", "

\n", "In our stencil, we approximate fluxes such as $j_{EC}$ as:\n", "

\n", "\\begin{align}\n", "j_{EC}&= D\\theta {c_E - c_C \\over \\Delta x} \\label{8fd8819}\\\\\n", "\\end{align}\n", "

\n", "Although this looks like a first order approximation, it's really a second order. Why? It's because\n", "the flux is really being approximated at the interface between the two gridblocks." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 15, "metadata": { "image/png": { "width": "40%" } }, "output_type": "execute_result" } ], "source": [ "Image(\"figures/flux_fd.png\",width=\"40%\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To emphasize this, let's use this finite-difference notation, $c_{i-1}=c_C$, $c_{i+1} = c_E$ and write:\n", "

\n", "\\begin{align}\n", "j_{EC}&= D\\theta {c_{i+1} - c_{i-1} \\over \\Delta x} \\label{8fd8820}\\\\\n", "\\end{align}\n", "

\n", "The idea is that we are approximating the flux at a point $x_i$, between $x_{i+1}$ and $x_{i-1}$. So, the term looks like a central difference, where the grid points are separated by $\\Delta x /2$. Accordingly, the order is order $\\mathcal{O}((\\Delta x)^2)$\n", "

\n", "#### Why not finite differences?\n", "Finite-difference methods are straightforward to apply to simple equations (see the assignment below) with constant coefficients. However, for cases where the material properties vary with location (heterogeneous), they can be difficult to apply, for example, when the material properties are heterogeneous (diffusion coefficient, hydraulic conductivity, thermal conductivity, etc). A naive application can lead to **non-conservative** schemes - that is, ones that do not produce discrete approximations that are conservative. In contrast, the finite-volume method is a conservative discrete approximation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Assignment\n", "## Finite difference stencil for diffusion\n", "### 1-D Steady-state diffusion with constant coefficients\n", "#### Partial differential equation for diffusion with homogeneous diffusion coefficient\n", "To apply finite-difference approximations to solve differential equations, one simply replaces the derivatives that appear in the equations with a finite difference approximation. \n", "

\n", "The partial differential equation for diffusion in three dimensions (not in porous media) is (see `9_pdes_1.ipynb`):\n", "

\n", "\\begin{align}\n", "&{\\partial c\\over \\partial t} = {\\partial \\over \\partial x}\\left( D {\\partial c \\over \\partial x}\\right) + {\\partial \\over \\partial y}\\left( D {\\partial c \\over \\partial y}\\right)+ {\\partial \\over \\partial z}\\left( D {\\partial c \\over \\partial z}\\right) \\label{8fd8821}\\\\\n", "\\text{or}&\\nonumber\\\\\n", "&{\\partial c\\over \\partial t} = \\vec{\\nabla} \\cdot (D \\vec{\\nabla} c)\\label{8fd8822}\\\\\n", "\\end{align}\n", "

\n", "Write the partial differential equation for 1-D (in the $x$ direction) steady-state diffusion where the diffusion coefficient is spatially homogeneous.\n", "\n", "**Put your equation here**\n", "

\n", "\\begin{align}\n", "&0 = {d^2 c\\over dx^2}\\\\\n", "\\text{or}&\\nonumber\\\\\n", "&0 = {\\nabla}^2 c \\\\\n", "\\end{align}\n", "

\n", "Under these conditions, the concentration is described by Laplace's equation.\n", "

\n", "\n", "#### Finite-difference stencil for steady-state diffusion with homogeneous diffusion coefficient\n", "

\n", "To construct a finite-difference approximation to a differential equation, we simply replace the derivatives in the equation with a finite difference approximation. For example, for an ordinary differential equation of the form\n", "

\n", "\\begin{align}\n", "{dy\\over dx} &= 2 y + 6 \\label{8fd8824}\\\\\n", "\\end{align}\n", "

\n", "we develop a finite - difference stencil by replacing the derivative by a finite difference approximation. For example a forward difference approximation would be:\n", "

\n", "\\begin{align}\n", "{y(x_{i+1}) - y(x_i)\\over \\Delta x} &= 2 y(x_i) + 6 \\label{8fd8825}\\\\\n", "\\end{align}\n", "

\n", "This is usual written using this notation: $y(x_i)\\rightarrow y_i$:\n", "

\n", "\\begin{align}\n", "{y_{i+1} - y_i\\over \\Delta x} &= 2 y_i + 6 \\label{8fd8826}\\\\\n", "\\end{align}\n", "

\n", "Write the finite-difference approximation for 1-D (in the $x$ direction) steady-state diffusion where the diffusion coefficient is spatially homogeneous (that is, for the equation you developed above). Use a centered approximation.\n", "

\n", "In a finite-difference approach, we look at the differential equation and replace derivatives with a finite-difference approximation. We developed the second - order central difference in \\ref{8fd8817} so we replace the second derivative with that approximation. Since the right side of the equation equals zero, the $(\\Delta x)^2$ divides out to give:\n", "
\n", "\\begin{align}\n", "c_{i+1} - 2 c_{i} + c_{i-1} = 0\\\\\n", "\\end{align}\n", "

\n", "Note the finite difference equation does not depend upon $\\Delta x$, but the error does! So, for a more accurate solution, we would use more, closer - spaced (smaller $\\Delta x$) gridpoints.\n", "

\n", "\n", "#### Finite-volume stencil for steady-state diffusion with homogeneous diffusion coefficient\n", "The finite-volume approximation for one-dimensional steady diffusion (not in porous media) is:\n", "

\n", "\\begin{align}\n", "&\\left(D {c_E - c_C \\over \\Delta x} + D {c_W - c_C \\over \\Delta x} \\right) (\\Delta y) (\\Delta z) =0 \\label{8fd8823}\\\\\n", "\\end{align}\n", "

\n", "Write this equation for the case of homogeneous diffusion coefficient and constant gridblock size in the form $a_W c_W + a_C c_C + a_E c_E = rhs$ (that is, determine $a_W$, $a_C$, $a_E$ and $rhs$).\n", "

\n", "**Write your equation here.**\n", "
\n", "\n", "\\begin{align}\n", "&c_{W} - 2 c_{C} + c_{E} = 0\\\\\n", "\\end{align}\n", "

\n", "Note this is the same discrete approximation that we developed with a finite-difference method! " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Approximation error\n", "Compute the forward, backward and central difference error of `cos(x)` at $x = 0.7$, starting at $\\Delta x = 0.5$, and the halving $\\Delta x$ 10 times (see code snippet below). Write a python code to:\n", "1. compute and print the error for each value of $\\Delta x$ for the forward,centered and backwards approximations.\n", "* plot the error of each expression versus $\\Delta x$ \n", "* What should the slope of this plot be for the different approximations?\n", "\n", "

\n", "You can reuse most of the code above for this assignment." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.50, -0.801\n", " 0.25, -0.628\n", " 0.12, -0.526\n", " 0.06, -0.472\n", " 0.03, -0.444\n", " 0.02, -0.430\n", " 0.01, -0.423\n", " 0.00, -0.420\n", " 0.00, -0.418\n", " 0.00, -0.417\n" ] } ], "source": [ "# code fragment to compute and print the values of delta x to be used in the error computation\n", "dx_vals = 2.**-np.arange(1,11)\n", "for dx in np.nditer(dx_vals):\n", " y = np.cos(x+dx)\n", " print(f\"{dx:9.2f}, {y:9.3f}\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exact derivative at x = 0.70, df/dx = -0.6442177\n", " FD approximation |error i-i /error _i|\n", " forward backward central forward backward central \n", " -0.805 -0.430 -0.618 0.161 0.214 0.027\n", " -0.733 -0.542 -0.638 0.088 0.102 0.007\n", " -0.690 -0.595 -0.643 0.046 0.049 0.002\n", " -0.668 -0.620 -0.644 0.023 0.024 0.000\n", " -0.656 -0.632 -0.644 0.012 0.012 0.000\n", " -0.650 -0.638 -0.644 0.006 0.006 0.000\n", " -0.647 -0.641 -0.644 0.003 0.003 0.000\n", " -0.646 -0.643 -0.644 0.001 0.001 0.000\n", " -0.645 -0.643 -0.644 0.001 0.001 0.000\n", " -0.645 -0.644 -0.644 0.000 0.000 0.000\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = 0.7\n", "exact_d = -np.sin(x) # exact derivative coded above\n", "print(f\"Exact derivative at x = {x:2.2f}, df/dx = {exact_d:3.7f}\")\n", "print(f\" FD approximation |error i-i /error _i|\")\n", "print(f\" forward backward central forward backward central \")\n", "\n", "# python - empty arrays that will hold the errors as we loop through the computation for different dx\n", "for_err = []\n", "back_err = []\n", "cent_err = []\n", "# initialize \n", "# python iteration over elements in the np array dx_vals\n", "for dx in np.nditer(dx_vals):\n", " # to avoid repeated function calls (for efficiency) store function calls in temporary variables\n", " f_xpdx = np.cos(x + dx) # f(x+dx) value of the function at x+dx\n", " f_x = np.cos(x) # f(x) value of the function at x\n", " f_xmdx = np.cos(x - dx) # f(x-dx) value of the function at x-dx\n", "\n", " for_dif = (f_xpdx - f_x) / dx # compute forward, backward and central difference\n", " back_dif = (f_x - f_xmdx) / dx\n", " cent_dif = (f_xpdx - f_xmdx) / (2.0 * dx)\n", "\n", " # compute the absolute value of the error, add to a list using .append method\n", " for_err.append(abs(for_dif - exact_d)) \n", " back_err.append(abs(back_dif - exact_d))\n", " cent_err.append(abs(cent_dif - exact_d))\n", " # errors are now stored in lists - these are not numpy arrays\n", " sv = [\n", " f\"{item:8.3f}\"\n", " for item in [\n", " for_dif,\n", " back_dif,\n", " cent_dif,\n", " for_err[-1],\n", " back_err[-1],\n", " cent_err[-1],\n", " ]\n", " ]\n", "\n", " print(\n", " f\"{sv[0]:8>} {sv[1]:8<} {sv[2]:8<} {sv[3]:8>} {sv[4]:8>} {sv[5]:8>}\"\n", " )\n", "\n", "# plot it!\n", "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", "ax.loglog(dx_vals, for_err, \"k\", linewidth=2, label=\"Forward\")\n", "ax.loglog(dx_vals, back_err, \"-g\", linewidth=3, label=\"Backward\")\n", "ax.loglog(dx_vals, cent_err, \"-b\", linewidth=3, label=\"Central\")\n", "ax.set_xlabel(\"dx\", fontsize=\"large\")\n", "ax.set_ylabel(\"|error|\", fontsize=\"large\")\n", "ax.legend(loc=\"best\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reflection\n", "\n", "* What dictates your choice in the order of approximation used in a finite - difference approximation?\n", "* How does the finite-difference approximation differ from the finite-volume approximation for the case you considered in the assignment above?" ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "all", "formats": "ipynb,python//py:percent", "notebook_metadata_filter": "all" }, "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" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }