{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Choice of Nodes for Polynomial Interpolation\n",
"\n",
"Copyright (C) 2020 Andreas Kloeckner\n",
"\n",
"\n",
"MIT License\n",
"Permission is hereby granted, free of charge, to any person obtaining a copy\n",
"of this software and associated documentation files (the \"Software\"), to deal\n",
"in the Software without restriction, including without limitation the rights\n",
"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n",
"copies of the Software, and to permit persons to whom the Software is\n",
"furnished to do so, subject to the following conditions:\n",
"\n",
"The above copyright notice and this permission notice shall be included in\n",
"all copies or substantial portions of the Software.\n",
"\n",
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n",
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n",
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n",
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n",
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n",
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n",
"THE SOFTWARE.\n",
""
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"%matplotlib qt5"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import numpy.linalg as la\n",
"\n",
"from matplotlib.pyplot import (\n",
" clf, plot, show, xlim, ylim,\n",
" get_current_fig_manager, gca, draw, connect)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Choose a function below:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"func = \"sin\"\n",
"\n",
"if func == \"sin\":\n",
" def f(x):\n",
" return np.sin(5*x)\n",
"elif func == \"jump\":\n",
" def f(x):\n",
" result = 0*x\n",
" result.fill(-1)\n",
" result[x > 0] = 1\n",
" return result\n",
"elif func == \"runge\":\n",
" def f(x):\n",
" return 1/(1+25*x**2)\n",
"else:\n",
" raise RuntimeError(\"unknown function '%s'\" % func)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Run this cell to play with the node placement toy:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"