{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Taking Derivatives with Vandermonde Matrices\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": [
"import numpy as np\n",
"import numpy.linalg as la\n",
"import matplotlib.pyplot as pt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here are a few functions:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"if 1:\n",
" def f(x):\n",
" return np.sin(5*x)\n",
" def df(x):\n",
" return 5*np.cos(5*x)\n",
"elif 0:\n",
" gamma = 0.15\n",
" def f(x):\n",
" return np.sin(1/(gamma+x))\n",
" def df(x):\n",
" return -np.cos(1/(gamma+x))/(gamma+x)**2\n",
"else:\n",
" def f(x):\n",
" return np.abs(x-0.5)\n",
" def df(x):\n",
" # Well...\n",
" return -1 + 2*(x<=0.5).astype(np.float)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"