{ "cells": [ { "cell_type": "markdown", "id": "1b0099ed", "metadata": {}, "source": [ "# Tutorial 1 : using the `qmat.lagrange` module\n", "\n", "📜 _The_ `LagrangeApproximation` _class from_ `qmat.lagrange` _is a multi-purpose class to perform interpolation, integration or derivative approximation from a given set of 1D points._\n", "_It is based on the Barycentric Lagrange interpolation theory, originally developed by Joseph-Louis Lagrange around 1795, and widely popularized by the paper of Jean-Paul Berrut ahd Llyod N. Trefethen: [\"Barycentric Lagrange interpolation\"](https://doi.org/10.1137/S0036144502417715)._\n", "\n", "The main concept behind this class is to precompute the barycentric weights for any provided set of points, then use them to generate value-independent matrices used later to compute approximations (interpolation, integration or derivative) from values vectors." ] }, { "cell_type": "markdown", "id": "3c5bc03c", "metadata": {}, "source": [ "## Basic usage\n", "\n", "Whatever the application, one needs a set of $M$ interpolation points ${\\bf t}$ to instantiate a `LagrangeApproximation` object :" ] }, { "cell_type": "code", "execution_count": 1, "id": "e5e036f9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "points : [0. 0.25 0.5 0.75 1. ] (size: 5)\n", "weights : [ 10.66666667 -42.66666667 64. -42.66666667 10.66666667]\n" ] } ], "source": [ "from qmat.lagrange import LagrangeApproximation\n", "\n", "points = [0, 0.25, 0.5, 0.75, 1]\n", "approx = LagrangeApproximation(points)\n", "\n", "print(f\"points : {approx.points} (size: {approx.nPoints})\")\n", "print(f\"weights : {approx.weights}\")" ] }, { "cell_type": "markdown", "id": "53428ba1", "metadata": {}, "source": [ "When initializing the `approx` variable, weights are already pre-computed and stored as attribute, along with the given points. \n", "\n", "> 💡 There is no constrains on the lower and upper bound for the points, but they **have to be sorted in ascending order** (if not, an error is raised)." ] }, { "cell_type": "markdown", "id": "9b326f42", "metadata": {}, "source": [ "### Interpolation\n", "\n", "Let's interpolate a function on $S$ \"fine\" points ${\\bf s}$, knowing \"coarse\" function values ${\\bf f_t}$ on the interpolated points.\n", "We can generate the $P$ matrix of shape $(S,M)$ that allows to interpolate the function values on the $S$ fine points :\n", "\n", "$$\n", "{\\bf f_s} = P {\\bf f_t},\n", "$$\n", "\n", "simply like this :" ] }, { "cell_type": "code", "execution_count": 2, "id": "9f937a0c", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "finePoints = np.linspace(0, 1, num=200)\n", "P = approx.getInterpolationMatrix(finePoints)" ] }, { "cell_type": "markdown", "id": "af5631a4", "metadata": {}, "source": [ "Then, $P$ can be stored and use for multiple interpolations on the same points :" ] }, { "cell_type": "code", "execution_count": 3, "id": "fed98b77", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fValues = np.cos(2*np.pi*approx.points)\n", "interpolated = P @ fValues\n", "reference = np.cos(2*np.pi*finePoints)\n", "\n", "# Some plotting for demonstration\n", "import matplotlib.pyplot as plt\n", "plt.plot(points, fValues, \"o\", label=\"coarse points\")\n", "plt.plot(finePoints, interpolated, label=\"interpolation\")\n", "plt.plot(finePoints, reference, \"--\", color=\"gray\", label=\"reference\")\n", "plt.xlabel(\"points\"); plt.ylabel(\"function values\"); plt.legend();" ] }, { "cell_type": "markdown", "id": "7ac9867b", "metadata": {}, "source": [ "> 💡 Note that there is a visible error with the reference close to the boundary (Runge effect), which is due to the choice of interpolated points. \n", "> Those can be selected differently to improve the quality of the interpolation, see the [tutorial on node generation ...](./22_nodes.ipynb)." ] }, { "cell_type": "markdown", "id": "a0d1fa3c", "metadata": {}, "source": [ "### Integration\n", "\n", "Let's integrate a function to on $N$ intervals $(t_{n}^{beg}, t_{n}^{end})$, knowing function values ${\\bf f_t}$ on the interpolated points.\n", "We can generate the $I$ matrix of shape $(N,M)$ that allows to integrate the interpolant polynomial on the $N$ \n", "intervals and approximate it with $int[f]_N$:\n", "\n", "$$\n", "int[f]_N = I {\\bf f_t},\n", "$$\n", "\n", "where $I$ is a $(N,M)$ quadrature matrix generated like this :" ] }, { "cell_type": "code", "execution_count": 4, "id": "8aeafd44", "metadata": {}, "outputs": [], "source": [ "tBeg = 0\n", "tEnd = np.linspace(0, 1, num=200)\n", "\n", "intervals = [(tBeg, t) for t in tEnd]\n", "I = approx.getIntegrationMatrix(intervals)" ] }, { "cell_type": "markdown", "id": "f8becb03", "metadata": {}, "source": [ "Then, $I$ can be stored and used for multiple integrations on the same points :" ] }, { "cell_type": "code", "execution_count": 5, "id": "dadfcc12", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAGwCAYAAAC5ACFFAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWCRJREFUeJzt3Qd4VFX+xvE3nd5LaNKkNynSXKwIKIJYcUEU24quq4hYWHUVdeWvu3aFVddekFVBURHFQhMUQXqX3gLSA6RAMv/nd4YJk3YJkDbJ9/M812Tu3JnMXIfcN+f8zjlhPp/PJwAAAGQpPOvdAAAAICwBAAAcBy1LAAAAHghLAAAAHghLAAAAHghLAAAAHghLAAAAHiK97kTOpKamauvWrSpbtqzCwsI4bQAAhACbajI+Pl41a9ZUeHj27UeEpVxgQalOnTq58VQAACCfbdq0SbVr1872fsJSLrAWpcDJLleuXG48JQAAyGP79+93jR2B63h2CEu5IND1ZkGJsAQAQGg5XgkNBd4AAAAeCEsAAAAeCEsAAAAeCEsAAAAeCEsAAAAeCEsAAAAeCEsAAAAeCEsAAAAeCEsAAAAemMG7kEpJ9WnOut3aEZ+oamVLqGP9SooIZ5FeAEDxkVJIroUh1bI0ffp09enTx60ObFOTf/bZZ8d9zLRp09S+fXuVKFFCDRo00H/+859Mx3z66adq3ry5YmJi3NcJEyaoIE1esk1/euoH/fn1n3XXRwvcV7tt+wEAKA4mF6JrYUiFpYMHD6pNmzZ6+eWXc3T8unXrdPHFF6tbt26aP3++/v73v+vOO+904Shg9uzZ6t+/vwYNGqSFCxe6r1dffbV++eUXFQT7ENz2/m/ati8x3f64fYluP4EJAFDUTS5k18Iwn8/nUwiyliVrAerXr1+2x9x///2aOHGili9fnrZvyJAhLhRZSDIWlGzV4a+//jrtmF69eqlixYoaO3Zsjl6LPb58+fLat2/fKS2ka82NlpozfjgCrOExtnwJzbz/fLrkAABFUko+Xgtzev0OqZalE2WBqEePHun29ezZU3PnztXhw4c9j5k1a1a2z5uUlOROcPCWG6xfNrsPh7FUa/fbcQAAFEVzCuG1sEiHpbi4OFWvXj3dPrt95MgR7dy50/MY25+dUaNGuSQa2OrUqZMrr9cK2HLzOAAAQs2OQngtLNJhKdBdFyzQ6xi8P6tjMu4LNmLECNdkF9g2bdqUK6/VKv1z8zgAAEJNtUJ4LSzSUwfExsZmaiHasWOHIiMjVblyZc9jMrY2BbNRc7blNhsSWaN8CVfA5vPop7XjAAAoijoWwmthkW5Z6tKli6ZMmZJu37fffqsOHTooKirK85iuXbsqv1mh2iN9mrvvM7ZrBW7b/cy3BAAoqiIK4bUwpMLSgQMHtGDBArcFpgaw7zdu3JjWPXbdddelG/m2YcMGDRs2zI2Ie/PNN/XGG29o+PDhacfcddddLhw99dRTWrFihfv63XffaejQoQXwDqVeLWtozLXtXGoOZrdtv90PAEBR1quQXQtDauqAqVOn6rzzzsu0//rrr9fbb7+twYMHa/369e644Ekp7777bi1dutRNZmnTCViICvbJJ5/ooYce0tq1a9WwYUP985//1OWXX57j15VbUwcUxllLAQAoKHl9Lczp9TukwlJhlRdhCQAA5C3mWQIAAChuNUsAAAD5jbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAADggbAEAABQlMLS6NGjVb9+fZUoUULt27fXjBkzsj128ODBCgsLy7S1aNEi7Zi33347y2MSExPz6R0BAIDCLKTC0rhx4zR06FA9+OCDmj9/vrp166aLLrpIGzduzPL4F154Qdu2bUvbNm3apEqVKumqq65Kd1y5cuXSHWebhTEAAICQCkvPPvusbrrpJt18881q1qyZnn/+edWpU0djxozJ8vjy5csrNjY2bZs7d6727NmjG264Id1x1pIUfJxtAAAAIRWWkpOTNW/ePPXo0SPdfrs9a9asHD3HG2+8oe7du6tu3brp9h84cMDtq127ti655BLXauUlKSlJ+/fvT7cBAICiKWTC0s6dO5WSkqLq1aun22+34+Lijvt461r7+uuvXatUsKZNm7q6pYkTJ2rs2LGu++2ss87S6tWrs32uUaNGuVarwGatWwAAoGgKmbAU3GUWzOfzZdqXFQtEFSpUUL9+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AAAeCEsAAACEJQAAgJNDyxIAAIAHwhIAAIAHwhIAAIAHwhIAAIAHwhIAAIAHwhIAAIAHwhIAAIAHwhIAAEBRCEt79uzRoEGDVL58ebfZ93v37vV8zODBgxUWFpZu69y5c7pjkpKS9Le//U1VqlRR6dKl1bdvX23evDmP3w0AAAgVIROWBgwYoAULFmjy5Mlus+8tMB1Pr169tG3btrRt0qRJ6e4fOnSoJkyYoI8++kgzZ87UgQMHdMkllyglJSUP3w0AAAgVkQoBy5cvdwHp559/VqdOndy+119/XV26dNHKlSvVpEmTbB8bExOj2NjYLO/bt2+f3njjDb333nvq3r272/f++++rTp06+u6779SzZ888ekcAACBUhETL0uzZs13XWyAoGetOs32zZs3yfOzUqVNVrVo1NW7cWLfccot27NiRdt+8efN0+PBh9ejRI21fzZo11bJlS8/nta67/fv3p9sAAEDRFBJhKS4uzgWejGyf3Zediy66SB988IF++OEHPfPMM/r11191/vnnu7ATeN7o6GhVrFgx3eOqV6/u+byjRo1Kq52yzVqiAABA0VSgYenRRx/NVICdcZs7d6471r7PyOfzZbk/oH///urdu7drKerTp4++/vprrVq1Sl999ZXn6zre844YMcJ14QW2TZs2ndD7BgAAoaNAa5buuOMOXXPNNZ7H1KtXT4sWLdL27dsz3ffHH3+4VqCcqlGjhurWravVq1e721bLlJyc7EbaBbcuWVdd165dPeugbAMAAEVfgYYlG65v2/FYIbe14MyZM0cdO3Z0+3755Re3zyvUZLRr1y7XCmShybRv315RUVGaMmWKrr76arfPRswtWbJETz/99Em/LwAAUHSERM1Ss2bN3BQAVqBtI+Jss+9tiH/wSLimTZu6aQCMTQEwfPhwVxy+fv16V+htXXEWzi677DJ3jNUb3XTTTbrnnnv0/fffa/78+br22mvVqlWrtNFxAACgeAuJqQOMFWrfeeedaSPXbPLIl19+Od0xNo2AtTaZiIgILV68WO+++66bvNJak8477zyNGzdOZcuWTXvMc889p8jISNeylJCQoAsuuEBvv/22ezwAAECYz6qZcUps6gBrpbKgVq5cOc4mAABF6PodEt1wAAAABYWwBAAA4IGwBAAA4IGwBAAA4IGwBAAA4IGwBAAA4IGwBAAA4IGw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2zVr1nRD+s3NN9/shtxbGLHWn3POOcd9H2hZKleunL744gsXeGz6gAcffFD/+Mc/3H3BdUxZee6551SxYkV17drVjYLr2bOn2rVrl6ko3FqbrCg8UISeUb9+/VyYs1FuNpLP3oMFuuDpDwAAxVeYL7sCEeTY/v37XcGytabYxT9YYmKi1q1b58LB8S7+UNoIORu6b+eTySNPDJ83AMid63cwCrxR4N5991035N/qm6w7zaYluPrqqwlKAIBCgbCEAhcXF+e63uxrjRo1dNVVV+mf//xnQb8sAAAcwhIKnM3MbRsAAIURo+EAAAA8EJYAAAA8EJYAAAA8EJYAAAA8EJYAAAA8EJYAAAA8EJaQq2xCeFvnrVKlSm5tN1vGBACAUMY8S8hVtpCurf02depUNyt3lSpVOMMAgJBGWEKOJScnKzo62vOYNWvWuFm4bXHbU2mdSklJcYvzAgBQ0OiGK8Dgkd125MiRHB97+PDhHB17Ms4991zdcccdGjZsmGshuvDCC7Vs2TJdfPHFKlOmjKpXr65BgwZp586d7vjBgwfrb3/7mzZu3Oi64OrVq5cWfp5++mnX0mQL47Zp00affPJJ2s+xVig7/ptvvlGHDh0UExOjGTNm5Phx33//vXtcqVKlXEhbuXJluvcxceJEd78tZGzv4/LLL093vmz2cFuXrnTp0urUqZN7XgAAAvjTvYCMGjUq2/saNWqkAQMGpN3+97//nSkUBdStW9eFlIAXXnhBhw4dynTcI488clKv85133tFtt92mn376Sbt379Y555yjW265Rc8++6wSEhLSFr394Ycf3M9u2LChXnvtNf3666+KiIhwz/HQQw9p/PjxGjNmjHtv06dP17XXXquqVau65wuw0GLv1cJRhQoVcvy4Bx98UM8884zbP2TIEN14443u9ZqvvvrKhSM75r333nPhyPYF3HDDDVq/fr0++ugj1axZUxMmTFCvXr20ePFi9zNRvKWk+jRn3W7tiE9UtbIl1LF+JUWEhxX0ywKQz0ImLNnCqnaRs4Jh6wrau3fvcR9jLRMjR450F+89e/a4VoNXXnlFLVq0SDsmKSlJw4cP19ixY93F/4ILLtDo0aNVu3btPH5HoeH00093rTvGFrtt166dnnzyybT733zzTdWpU0erVq1S48aNVbZsWReSYmNj3f0HDx50wcrCVJcuXdw+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9m3YsCHL49euXesrVaqUO86Ot8fZ4z/55JN8f+1F+Tzb/U899ZRvzpw5vlWrVvlGjBjhHv/bb7/l+2sv6uc6YO/evb4GDRr4evTo4WvTpk2+vd7idJ779u3r69Spk2/KlCm+devW+X755RffTz/9lK+vu6if5xkzZvjCw8N9L7zwgvt9bbdbtGjh69evX76/9lAyadIk34MPPuj79NNPbTVb34QJEzyPL4hrIWGpAHXs2NE3ZMiQdPuaNm3qe+CBB7I8/r777nP3B7v11lt9nTt3ztPXWdzOc1aaN2/uGzlyZB68uqLlZM91//79fQ899JDvkUceISzlwXn++uuvfeXLl/ft2rUrJ0+PkzzP//rXv1zoD/biiy/6ateuzTnNoZyEpYK4FtINV0CSk5M1b9489ejRI91+uz1r1qwsHzN79uxMx/fs2VNz587V4cOH8/T1FqfznNVCybbQYqVKlfLoVRbvc/3WW29pzZo1btI55M15njhxojp06KCnn35atWrVUuPGjTV8+HAlJCRwynPxPHft2lWbN2/WpEmT3AKt27dv1yeffKLevXtznnNRQVwLWUi3gOzcuVMpKSmqXr16uv12Oy4uLsvH2P6sjj9y5Ih7Pusfx6mf54yeeeYZHTx4UFdffTWnN5c/06tXr9YDDzzg6kCsXgl5c57Xrl2rmTNnuvqOCRMmuOe4/fbbtXv3buqWcvE8W1iymqX+/fsrMTHR/W7u27evXnrpJT7auaggroW0LBUwK2YLZn+NZNx3vOOz2o9TO88BY8eO1aOPPqpx48apWrVqnNZcPNd2IRowYIBGjhzpWjqQd59pax21++xC3rFjR1188cV69tln9fbbb9O6lIvnedmyZbrzzjv1j3/8w7VKTZ48WevWrdOQIUNO7H8ujiu/r4X8KVdAqlSpooiIiEx/oezYsSNTYg6IjY3N8nj7i7xy5cp5+nqL03kOsIB000036eOPP1b37t3z+JUWv3NtXZvWbD5//nzdcccdaRd1+6Vnn+lvv/1W559/fr69/qL8mba/tK37rXz58mn7mjVr5s61dRs1atQoz193cTjPo0aN0llnnaV7773X3W7durVKly6tbt266YknnqD1P5cUxLWQlqUCEh0d7YY9TpkyJd1+u21NuVmxIewZj7cLitUiREVF5enrLU7nOdCiNHjwYH344YfUG+TRubZpGRYvXqwFCxakbfYXeJMmTdz3nTp1yumPLlZO5jNtF/CtW7fqwIEDaftWrVql8PBw1a5dO89fc3E5z4cOHXLnNJgFruCWD5y6ArkW5lnpOHI8LPWNN95wwx+HDh3qhqWuX7/e3W8jLgYNGpRpuOTdd9/tjrfHMXVA7p/nDz/80BcZGel75ZVXfNu2bUvbbHg7cvdcZ8RouLw5z/Hx8W5E1pVXXulbunSpb9q0ab5GjRr5br75Zj7SuXie33rrLfe7Y/To0b41a9b4Zs6c6evQoYMbVYfs2edz/vz5brNY8uyzz7rvA1M0FIZrIWGpgNkFuW7dur7o6Ghfu3bt3C+xgOuvv953zjnnpDt+6tSpvrZt27rj69Wr5xszZkwBvOqifZ7te/sHm3Gz45C75zojwlLefKbN8uXLfd27d/eVLFnSBadhw4b5Dh06xEc6l8+zTRVgU43Yea5Ro4Zv4MCBvs2bN3OePfz444+ev3MLw7UwzP6TN21WAAAAoY+aJQAAAA+EJQAAAA+EJQAAAA+EJQAAAA+EJQAAAA+EJQAAAA+EJQAAAA+EJQAAAA+EJQDF1tSpU90q5Xv37i3olwKgEGMGbwDFxrnnnqszzjhDzz//vLudnJys3bt3u1XkLTQBQFYis9wLAMVkZfnY2NiCfhkACjm64QAUC4MHD9a0adP0wgsvuFYk295+++103XB2u0KFCvryyy/VpEkTlSpVSldeeaUOHjyod955R/Xq1VPFihX1t7/9TSkpKWnPbS1U9913n2rVqqXSpUurU6dOrosPQNFAyxKAYsFC0qpVq9SyZUs99thjbt/SpUszHXfo0CG9+OKL+uijjxQfH6/LL7/cbRaiJk2apLVr1+qKK67Qn/70J/Xv39895oYbbtD69evdY2rWrKkJEyaoV69eWrx4sRo1apTv7xVA7iIsASgWypcv77rdrLUo0PW2YsWKTMcdPnxYY8aMUcOGDd1ta1l67733tH37dpUpU0bNmzfXeeedpx9//NGFpTVr1mjs2LHavHmzC0pm+PDhmjx5st566y09+eST+fxOAeQ2whIABLEwFQhKxoq/rfvNglLwvh07drjvf/vtN/l8PjVu3DjdeUxKSlLlypU5t0ARQFgCgCBRUVHpzofVNGW1LzU11X1vXyMiIjRv3jz3NVhwwAIQughLAIoN64YLLszODW3btnXPaS1N3bp1y9XnBlA4MBoOQLFh3Wm//PKLK8beuXNnWuvQqbDut4EDB+q6667T+PHjtW7dOv3666966qmnXEE4gNBHWAJQbFjhtXWVWZF21apVtXHjxlx5XivktrB0zz33uCkH+vbt60JZnTp1cuX5ARQsZvAGAADwQMsSAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAB8ISAACAsvf/nAC5usnHYKYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fValues = np.cos(2*np.pi*approx.points)\n", "\n", "integrated = I @ fValues\n", "reference = 1/(2*np.pi)*np.sin(2*np.pi*tEnd)\n", "\n", "# Some plotting for demonstration\n", "plt.plot(points, fValues, \"o\", label=\"function values\")\n", "plt.plot(tEnd, integrated, label=\"integration\")\n", "plt.plot(tEnd, reference, \"--\", color=\"gray\", label=\"reference\")\n", "plt.xlabel(\"time\"); plt.ylabel(\"integral\"); plt.legend();" ] }, { "cell_type": "markdown", "id": "9b190798", "metadata": {}, "source": [ "> 💡 Integration errors increases with time, which is expected since we start the integration at $t=0$." ] }, { "cell_type": "markdown", "id": "b0b613e8", "metadata": {}, "source": [ "### Differentiation\n", "\n", "Let's compute the derivative matrix for a stencil of $N$ points, allowing to approximate the derivative of any 1D function known on the $N$ stencil points.\n", "We can generate this $D$ matrix like this :" ] }, { "cell_type": "code", "execution_count": 6, "id": "d7cad800", "metadata": {}, "outputs": [], "source": [ "D = approx.getDerivativeMatrix()" ] }, { "cell_type": "markdown", "id": "b5da96e7", "metadata": {}, "source": [ "Considering the chosen points here $[0, 0.25, 0.5, 0.75, 1]$, we can then retrieve the classical centered fourth order finite-difference coefficients, looking at the center row of this matrix (derivative for point $0.5$) :" ] }, { "cell_type": "code", "execution_count": 7, "id": "288afb0c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.allclose(D[2]*0.25, [1/12, -2/3, 0, 2/3, -1/12])" ] }, { "cell_type": "markdown", "id": "1b9d2484", "metadata": {}, "source": [ "Similarly, second derivative coefficients can be retrieved like this :" ] }, { "cell_type": "code", "execution_count": 8, "id": "c1a36555", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D2 = approx.getDerivativeMatrix(order=2)\n", "np.allclose(D2[2]*(0.25)**2, [-1/12, 4/3, -5/2, 4/3, -1/12])" ] }, { "cell_type": "markdown", "id": "63b48a46", "metadata": {}, "source": [ "Or simply using a matrix power of the original $D$ matrix :" ] }, { "cell_type": "code", "execution_count": 9, "id": "59b5bc0e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.allclose(D2, D @ D)" ] }, { "cell_type": "markdown", "id": "94001027", "metadata": {}, "source": [ "> 💡 Note that we cannot retrieve the function derivative on any points, as we did for the interpolation. However, we can still use the interpolation matrix $P$ determined later, and combine with the derivative matrix $D$ :" ] }, { "cell_type": "code", "execution_count": 10, "id": "2ed81fde", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fValues = np.cos(2*np.pi*approx.points)\n", "\n", "derived = P @ D @ fValues\n", "reference = -2*np.pi*np.sin(2*np.pi*finePoints)\n", "\n", "# Some plotting for demonstration\n", "plt.plot(points, D @ fValues, \"o\", label=\"function derivatives\")\n", "plt.plot(finePoints, derived, label=\"derived\")\n", "plt.plot(finePoints, reference, \"--\", color=\"gray\", label=\"reference\")\n", "plt.xlabel(\"time\"); plt.ylabel(\"derivative\"); plt.legend();" ] }, { "cell_type": "markdown", "id": "e8a56088", "metadata": {}, "source": [ "But this approach has some accuracy issue, especially on points close to the boundary, which is one reason why backward or forward finite differences are usually not used in practical applications ..." ] }, { "cell_type": "markdown", "id": "9864774a", "metadata": {}, "source": [ "## Handling duplicated points\n", "\n", "📜 _While the base theory behind Barycentric Interpolation required all points to be unique, the_ `LagrangeApproximation` _class can also take interpolation points with duplicates._\n", "\n", "Let's consider the following example :" ] }, { "cell_type": "code", "execution_count": 11, "id": "51bc5fef", "metadata": {}, "outputs": [], "source": [ "points = [0, 0.5, 1, 1, 1.25, 1.75, 2, 2, 2.5, 3]" ] }, { "cell_type": "markdown", "id": "38889432", "metadata": {}, "source": [ "Those corresponds to fine points, that we could need for instance to interpolate those on some \"coarse\" points :" ] }, { "cell_type": "code", "execution_count": 12, "id": "0cad3200", "metadata": {}, "outputs": [], "source": [ "coarse = [0, 1.5, 3]" ] }, { "cell_type": "markdown", "id": "7f77893d", "metadata": {}, "source": [ "While the values for $0$ and $3$ can easily be retrieve from the fine points, the value for $1.5$ is more problematic, as two different function values could be taken for $1$ and $2$.\n", "\n", "The `LagrangeApproximation` handles that automatically by taking **per default** the incoming value at the left, i.e taking the first value given for $1$ and $2$ and ignoring the next one(s). This can be seen on the interpolation matrix :" ] }, { "cell_type": "code", "execution_count": 13, "id": "6ca828f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fine points = [0, 0.5, 1, 1, 1.25, 1.75, 2, 2, 2.5, 3]\n", "P (transpose) = \n", "[[ 1. -0.00142857 -0. ]\n", " [-0. 0.02 0. ]\n", " [ 0. -0.25 -0. ]\n", " [ 0. 0. 0. ]\n", " [-0. 0.73142857 0. ]\n", " [ 0. 0.73142857 -0. ]\n", " [-0. -0.25 0. ]\n", " [ 0. 0. 0. ]\n", " [ 0. 0.02 -0. ]\n", " [-0. -0.00142857 1. ]]\n", "coarse points = [0, 1.5, 3]\n" ] } ], "source": [ "P = LagrangeApproximation(points).getInterpolationMatrix(coarse)\n", "\n", "print(f\"fine points = {points}\")\n", "print(f\"P (transpose) = \\n{P.T}\")\n", "print(f\"coarse points = {coarse}\")" ] }, { "cell_type": "markdown", "id": "e3d469fa", "metadata": {}, "source": [ "For the coarse points $0$ and $3$ (first and last column), the interpolation simply corresponds to a copy the associated function values.\n", "But for the coarse point $1.5$, the class build an interpolation stencil that has a coefficient for the first fine value for $1$ and $2$, and zero for the others.\n", "\n", "$P$ is similar as the matrix obtained without duplicated points :" ] }, { "cell_type": "code", "execution_count": 14, "id": "edf34330", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , -0.00142857, -0. ],\n", " [-0. , 0.02 , 0. ],\n", " [ 0. , -0.25 , -0. ],\n", " [-0. , 0.73142857, 0. ],\n", " [ 0. , 0.73142857, -0. ],\n", " [-0. , -0.25 , 0. ],\n", " [ 0. , 0.02 , -0. ],\n", " [-0. , -0.00142857, 1. ]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LagrangeApproximation(points).getInterpolationMatrix(coarse, duplicates=False).T" ] }, { "cell_type": "markdown", "id": "fc2080fb", "metadata": {}, "source": [ "... except there are some zeros columns (rows in the transposed representation) added to the final matrix with duplicates.\n", "\n", "Additionally duplicated values can be handled differently by **using the right values** rather than the left ones (default) :" ] }, { "cell_type": "code", "execution_count": 15, "id": "b6a6ca85", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fine points = [0, 0.5, 1, 1, 1.25, 1.75, 2, 2, 2.5, 3]\n", "P (transpose) = \n", "[[ 1. -0.00142857 -0. ]\n", " [-0. 0.02 0. ]\n", " [ 0. 0. 0. ]\n", " [ 0. -0.25 -0. ]\n", " [-0. 0.73142857 0. ]\n", " [ 0. 0.73142857 -0. ]\n", " [ 0. 0. 0. ]\n", " [-0. -0.25 0. ]\n", " [ 0. 0.02 -0. ]\n", " [-0. -0.00142857 1. ]]\n", "coarse points = [0, 1.5, 3]\n" ] } ], "source": [ "P = LagrangeApproximation(points, duplicates=\"USE_RIGHT\").getInterpolationMatrix(coarse)\n", "\n", "print(f\"fine points = {points}\")\n", "print(f\"P (transpose) = \\n{P.T}\")\n", "print(f\"coarse points = {coarse}\")" ] }, { "cell_type": "markdown", "id": "4e7b56b9", "metadata": {}, "source": [ "... here the zeros coefficients are simply applied to the first duplicated values in the interpolation matrix.\n", "\n", "> 📣 The same behavior is also applied for the `getIntegrationMatrix` and `getDerivativeMatrix` methods, and for each of those using the parameter `duplicates=False` return the matrix as if there was not duplicates in the points (default is `True`)." ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 5 }