{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e49ad235",
   "metadata": {},
   "source": [
    "# Interpolation of data\n",
    "- Börge Göbel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9a5970cf",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42e0d49c",
   "metadata": {},
   "source": [
    "## 1. Taylor expansion"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50b6c172",
   "metadata": {},
   "source": [
    "You can expand any continuous function as a polynomials\n",
    "\n",
    "\\\\( f(x)=\\sum_{n=0}^\\infty \\frac{1}{n!}f^{(n)}(x_0)\\,(x-x_0)^n\\\\)\n",
    "\n",
    "Here, \\\\( f^{(n)} \\\\) is the nth derivative and \\\\( x_0 \\\\) is the argument around which we expand the function"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43d6a72a",
   "metadata": {},
   "source": [
    "### 1.1 Example: Exponential function"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "522c0227",
   "metadata": {},
   "source": [
    "\\\\( f(x)=f'(x)=f''(x)=\\dots=f^{(n)}(x)=\\exp(x) \\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6bf6da3e",
   "metadata": {},
   "outputs": [],
   "source": [
    "def expTaylor(x, x0, nmax):\n",
    "    # x: Argument\n",
    "    # x0: Argument at which the derivatives will be calculated\n",
    "    # nmax: n at which the series will terminate\n",
    "    t = 0\n",
    "    for n in range(nmax+1):\n",
    "        t = t + np.exp(x0) * (x-x0)**n / np.math.factorial(n)\n",
    "    return t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2ab652dc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.7182818011463845"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expTaylor(1, 0, 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "431760f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.718281828459045"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.exp(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aecf0d85",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ed480430>]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.ylim([-5,100])\n",
    "\n",
    "x_list = np.linspace(-5,5,101)\n",
    "plt.scatter(x_list, np.exp(x_list))\n",
    "\n",
    "nmax = 5\n",
    "plt.plot(x_list, expTaylor(x_list, 0, nmax), 'blue')\n",
    "plt.plot(x_list, expTaylor(x_list, -3, nmax), 'red')\n",
    "plt.plot(x_list, expTaylor(x_list, 2, nmax), 'green')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79d68bef",
   "metadata": {},
   "source": [
    "### 1.2 Example: sin function at \\\\(x_0 = 0\\\\)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ac2e6a0",
   "metadata": {},
   "source": [
    "\\\\( f(0) = f''(0) = f^{(4)}(0) = \\dots = 0 \\\\)\n",
    "\n",
    "\\\\( f'(0) = f^{(5)}(0) = f^{(9)}(0) = \\dots = 1 \\\\)\n",
    "\n",
    "\\\\( f'''(0) = f^{(7)}(0) = f^{(11)}(0) = \\dots = -1 \\\\)\n",
    "\n",
    "\\\\( \\sin(x) = x - \\frac{1}{3!}x^3 + \\frac{1}{5!}x^5  - \\frac{1}{7!}x^7 \\pm \\dots = \\sum_{n=0}^\\infty \\frac{(-1)^n}{(2n+1)!}x^{2n+1}\\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c3f8ca47",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sinTaylor(x, nmax):\n",
    "    # x: Argument\n",
    "    # nmax: n at which the series will terminate\n",
    "    t = 0\n",
    "    for n in range(nmax+1):\n",
    "        t = t + (-1)**n * x**(2*n+1) / np.math.factorial(2*n+1)\n",
    "    return t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "249444a2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ed6800a0>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.ylim([-2,2])\n",
    "\n",
    "x_list = np.linspace(-10,10,101)\n",
    "plt.scatter(x_list, np.sin(x_list))\n",
    "\n",
    "plt.plot(x_list, sinTaylor(x_list, 3), 'blue')\n",
    "plt.plot(x_list, sinTaylor(x_list, 6), 'red')\n",
    "plt.plot(x_list, sinTaylor(x_list, 9), 'green')\n",
    "plt.plot(x_list, sinTaylor(x_list, 18), 'black')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b9303de",
   "metadata": {},
   "source": [
    "- Accuracy of \\\\( \\sin(10.5) \\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a69d9367",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.844391389089651e-13"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sin(10.5) - sinTaylor(10.5, 50)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fa84c9d",
   "metadata": {},
   "source": [
    "### 1.3 Implementation of a general function"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0b2914c",
   "metadata": {},
   "source": [
    "Derivative (more details in separate section): \\\\( f'(x) = \\lim_{h\\rightarrow 0} \\frac{f(x+h)-f(x)}{h} \\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8fa7e6b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def derivative(f, x, h):\n",
    "    # f: Function\n",
    "    # x: Argument of f\n",
    "    # h: Stepsize\n",
    "    return (f(x+h) - f(x)) / h"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f78a17f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def func(x):\n",
    "    return 2*np.sin(x)**2 + x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6b41c634",
   "metadata": {},
   "outputs": [],
   "source": [
    "x0 = 10.5\n",
    "h = 0.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bfb4c660",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12.04772926022427"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "func(x0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "294c4fff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.5529969724111723"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "derivative(func, x0, h)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3797164",
   "metadata": {},
   "source": [
    "Higher derivatives: \\\\( f^{(n)}(x) = \\lim_{h\\rightarrow 0} \\frac{1}{h^n}\\sum_{k=0}^n(-1)^{k+n} \\,\\frac{n!}{k!(n-k)!} \\,f(x+kh)\\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "79be1154",
   "metadata": {},
   "outputs": [],
   "source": [
    "def nDerivative(f, x, h, n):\n",
    "    # f: Function\n",
    "    # x: Argument of f\n",
    "    # h: Stepsize\n",
    "    # n: nth derivative\n",
    "    t = 0\n",
    "    for k in range(n+1):\n",
    "        t = t + (-1)**(k+n) * np.math.factorial(n) / (np.math.factorial(k) * np.math.factorial(n-k)) * f(x + k*h)\n",
    "    return t / h**n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f903abeb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12.04772926022427"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nDerivative(func, x0, h, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "367e0c4c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.5529969724111723"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nDerivative(func, x0, h, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "87d7053e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.802754599797907"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nDerivative(func, x0, h, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "3712d068",
   "metadata": {},
   "outputs": [],
   "source": [
    "def taylor(f, x, x0, nmax, h):\n",
    "    # f: Function\n",
    "    # x: Argument\n",
    "    # x0: Argument at which the derivatives will be calculated\n",
    "    # nmax: n at which the series will terminate\n",
    "    # h: Stepsize\n",
    "    t = 0\n",
    "    for n in range(nmax+1):\n",
    "        t = t + nDerivative(f, x0, h, n) * (x-x0)**n / np.math.factorial(n)\n",
    "    return t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "5c6f7f2b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ed81f820>]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.ylim([-5,8])\n",
    "\n",
    "x_list = np.linspace(-5,5,101)\n",
    "plt.scatter(x_list, func(x_list))\n",
    "\n",
    "nmax = 15\n",
    "h = 0.05\n",
    "\n",
    "plt.plot(x_list, taylor(func, x_list, 0, nmax, h), 'blue')\n",
    "plt.plot(x_list, taylor(func, x_list, 2, nmax, h), 'red')\n",
    "plt.plot(x_list, taylor(func, x_list, -3, nmax, h), 'green')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f9568b43",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ed919a30>]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def func(x):\n",
    "    return 2*np.sin(x)**2 * np.exp(-0.1*x**2)\n",
    "\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.ylim([-2,3])\n",
    "\n",
    "x_list = np.linspace(-5,5,101)\n",
    "plt.scatter(x_list, func(x_list))\n",
    "\n",
    "nmax = 15\n",
    "h = 0.05\n",
    "\n",
    "plt.plot(x_list, taylor(func, x_list, 0, nmax, h), 'blue')\n",
    "plt.plot(x_list, taylor(func, x_list, 2, nmax, h), 'red')\n",
    "plt.plot(x_list, taylor(func, x_list, -3, nmax, h), 'green')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "777c00ec",
   "metadata": {},
   "source": [
    "## 2. Interpolation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c44bbf6",
   "metadata": {},
   "source": [
    "### 2.1 Generate data points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2459d9c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def correctFunction(x):\n",
    "    return 15 + 2.4*x - 0.5*x**2 - 0.35*x**3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "4bd36ffd",
   "metadata": {},
   "outputs": [],
   "source": [
    "npoints = 21\n",
    "x_list = np.linspace(-5,5,npoints)\n",
    "data0 = np.array([x_list, correctFunction(x_list)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c8527901",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7ff1ed995370>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.scatter(data0[0], data0[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ed78b40",
   "metadata": {},
   "source": [
    "Modify x and y values by adding random numbers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "105ae97a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.07385667, -0.05203294, -0.06616717, -0.09274954,  0.06544891,\n",
       "        0.09480814, -0.08577929, -0.06729723,  0.03897896,  0.07606921,\n",
       "        0.05620807, -0.09332577,  0.01806781, -0.08577827,  0.07427868,\n",
       "       -0.06086389, -0.06105936,  0.00102702, -0.00455917, -0.04832517,\n",
       "        0.01356398])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "0.1 * (2*np.random.rand(npoints)-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b7400b2a",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.array([data0[0] + 0.25 * (2*np.random.rand(npoints)-1), data0[1] + 5.0 * (2*np.random.rand(npoints)-1)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "843a30d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7ff1edaf1c10>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "\n",
    "# plt.plot(data0[0], data0[1], 'black')\n",
    "plt.scatter(data[0], data[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11eb81d5",
   "metadata": {},
   "source": [
    "## 2.2 Spline interpolation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61bc4320",
   "metadata": {},
   "source": [
    "A spline interpolation always fits the data perfectly and even has a continuous derivative, if a cubic spline is used.\n",
    "\n",
    "The spline is defined piecewise."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bfd29e75",
   "metadata": {},
   "source": [
    "### 2.2.1 Unperturbed data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "c40c6fa1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7ff1edbf91f0>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.scatter(data0[0], data0[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "6f72d71d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import interpolate"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a60f24f5",
   "metadata": {},
   "source": [
    "- linear splines"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "5e3f4cab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee06ff40>]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "splineLinear0 = interpolate.interp1d(data0[0], data0[1], kind = 'linear')\n",
    "\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.scatter(data0[0], data0[1])\n",
    "plt.plot(data0[0], splineLinear0(data0[0]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83643535",
   "metadata": {},
   "source": [
    "- zoom"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "c1b15609",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee143a90>]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.xlim([2,4])\n",
    "plt.ylim([-5,15])\n",
    "plt.scatter(data0[0], data0[1])\n",
    "\n",
    "x_list = np.linspace(2,4,201)\n",
    "plt.plot(x_list, splineLinear0(x_list))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23b0b018",
   "metadata": {},
   "source": [
    "- cubic spline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "d84b93e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee27f520>]"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "splineCubic0 = interpolate.interp1d(data0[0], data0[1], kind = 'cubic')\n",
    "\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.xlim([2,4])\n",
    "plt.ylim([-5,15])\n",
    "plt.scatter(data0[0], data0[1])\n",
    "\n",
    "x_list = np.linspace(2,4,201)\n",
    "plt.plot(x_list, splineCubic0(x_list))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b2b89c3",
   "metadata": {},
   "source": [
    "### 2.2.2 Perturbed data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "3bc08378",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee3991c0>]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "splineCubic = interpolate.interp1d(data[0], data[1], kind = 'cubic')\n",
    "\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "\n",
    "plt.plot(data0[0], data0[1])\n",
    "\n",
    "x_list = np.linspace(-4.5,4.5,901)\n",
    "plt.scatter(data[0], data[1])\n",
    "plt.plot(x_list, splineCubic(x_list))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7353a64a",
   "metadata": {},
   "source": [
    "- How to handle data which is not smooth?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "519df67c",
   "metadata": {},
   "outputs": [],
   "source": [
    "splineSmooth = interpolate.UnivariateSpline(data[0], data[1])\n",
    "splineSmooth.set_smoothing_factor(500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "9d3f9095",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee49a9d0>]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "\n",
    "x_list = np.linspace(-4.5,4.5,901)\n",
    "plt.scatter(data[0], data[1])\n",
    "plt.plot(x_list, splineSmooth(x_list))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1af7cd1f",
   "metadata": {},
   "source": [
    "### Add-on: How you can always fit data with a polynomial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "1cf0aee9",
   "metadata": {},
   "outputs": [],
   "source": [
    "datapoly = data[:,7:14]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "af641203",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.40554636, -1.1141895 , -0.29101779,  0.05021112,  0.57725991,\n",
       "         1.23277864,  1.54387654],\n",
       "       [15.62146975,  8.50888864, 13.56330264, 10.98824374, 18.20744418,\n",
       "        18.40423228, 20.3428787 ]])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datapoly"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cc36a15",
   "metadata": {},
   "source": [
    "We have 7 data points. That means we need a 6th order polynomial for the perfect interpolation\n",
    "\n",
    "\\\\( f(x) = a_0 + a_1x + a_2x^2 + a_3x^3 + a_4x^4 + a_5x^5 + a_6x^6 \\\\).\n",
    "\n",
    "This polynomial gives the correct value for all points \\\\( x_i, y_i \\\\)\n",
    "\n",
    "\\\\( y_i = a_0 + a_1x_i + a_2x_i^2 + a_3x_i^3 + a_4x_i^4 + a_5x_i^5 + a_6x_i^6 \\\\)\n",
    "\n",
    "We can express these 7 equations (\\\\( i = 0,\\dots, 6 \\\\)) as a matrix equation\n",
    "\n",
    "\\\\( \n",
    "\\begin{pmatrix}\n",
    "y_0\\\\y_1\\\\y_2\\\\y_3\\\\y_4\\\\y_5\\\\y_6\n",
    "\\end{pmatrix} = \\begin{pmatrix}\n",
    "1&x_0&x_0^2&x_0^3&x_0^4&x_0^5&x_0^6\\\\\n",
    "1&x_1&x_1^2&x_1^3&x_1^4&x_1^5&x_1^6\\\\\n",
    "1&x_2&x_2^2&x_2^3&x_2^4&x_2^5&x_2^6\\\\\n",
    "1&x_3&x_3^2&x_3^3&x_3^4&x_3^5&x_3^6\\\\\n",
    "1&x_4&x_4^2&x_4^3&x_4^4&x_4^5&x_4^6\\\\\n",
    "1&x_5&x_5^2&x_5^3&x_5^4&x_5^5&x_5^6\\\\\n",
    "1&x_6&x_6^2&x_6^3&x_6^4&x_6^5&x_6^6\n",
    "\\end{pmatrix}\\begin{pmatrix}\n",
    "a_0\\\\a_1\\\\a_2\\\\a_3\\\\a_4\\\\a_5\\\\a_6\n",
    "\\end{pmatrix}\n",
    "\\\\)\n",
    "\n",
    "The middle matrix is just a matrix of numbers that we can calculate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "04254b3e",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.transpose(\n",
    "    np.array([\n",
    "        datapoly[0,:]**0, datapoly[0,:]**1, datapoly[0,:]**2, datapoly[0,:]**3, datapoly[0,:]**4, datapoly[0,:]**5, datapoly[0,:]**6\n",
    "    ])\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "91a2178d",
   "metadata": {},
   "outputs": [],
   "source": [
    "y = datapoly[1,:]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6be8b485",
   "metadata": {},
   "source": [
    "Now, we can solve the system of linear (in \\\\(a_i\\\\)) equations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "8a87f94f",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.linalg.solve(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "bcd6d960",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 11.03087868,  -2.32244099,  28.7120829 ,  14.27629997,\n",
       "       -33.91290606,  -6.5302877 ,  10.47681919])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "5955358d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee5a9880>]"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.ylim([0,30])\n",
    "\n",
    "x_list = np.linspace(-2.5,2.5,901)\n",
    "y_list = a[0]*x_list**0 + a[1]*x_list**1 + a[2]*x_list**2 + a[3]*x_list**3 + a[4]*x_list**4 + a[5]*x_list**5 + a[6]*x_list**6\n",
    "plt.scatter(datapoly[0], datapoly[1])\n",
    "plt.plot(x_list, y_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3bab25d9",
   "metadata": {},
   "source": [
    "## 2.3 Fitting a model function"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a6ef777",
   "metadata": {},
   "source": [
    "Choose ideal parameters of a (physically motivated) model function such that error is minimized."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3354650",
   "metadata": {},
   "source": [
    "### 2.3.1 Define model function"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ee68e24",
   "metadata": {},
   "source": [
    "For practice, we consider a polynomial: \\\\( f(x) = a_0 + a_1 x + a_2 x^2 + \\dots + a_n x^n = \\sum_{k=0}^n a_k x^k\\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "5dfbbf96",
   "metadata": {},
   "outputs": [],
   "source": [
    "def polynomialModel(x, a):\n",
    "    t = 0\n",
    "    for k in range(len(a)):\n",
    "        t = t + a[k] * x**k\n",
    "    return t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "0efeef10",
   "metadata": {},
   "outputs": [],
   "source": [
    "a0 = np.array([15, 2.4, -0.5, -0.35])\n",
    "#a0 = np.array([1, 1, 1, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "b0ee8d86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff1ee690850>]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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7n77CXa1imoQESmyqlWrxscff8wtt9xCnz59qFq1Km3atAkdq8iLxdNKIiKnpWzZskyfPp1LL72Url27HrsmmJw5lYOIxIUyZcowa9YsEhMTuemmm/j5559DRyrSVA4iEjdq1KjB9OnTyczMpFu3bhw+fDh0pCJL5SAicaV58+Y899xzzJkzh2HDhoWOU2TpMpciEnfuvfdeVq9ezejRo2nQoAHdunULHanI0ZGDiMSl8ePHc91119G7d290Yc7Tp3IQkbiUnJzM9OnTOf/887n55pvZunVr6EhFispBROJWamoqs2bNYteuXXTp0uW4lQzl5FQOIhLXLr/8ctLT0/nss8/4/e9/r0t9nyKVg4jEvS5duvDEE0/w17/+lQkTJoSOUySoHESkWHjyySfp1KkTDz74IPPnzw8dJ+apHESkWEhISCA9PZ169epx2223kZmZGTpSTFM5iEixcfQSG2bGTTfdRFZWVuhIMUvlICLFSq1atZg+fTpfffUVd9xxhy6xcQIqBxEpdq6//nrGjx/P7Nmzefzxx0PHiUm6fIaIFEt9+/Zl9erVjBw5kgYNGtC1a9fQkWLKLx45mFl/M6sQjTAiItFiZkycOJFmzZpx1113sWLFitCRYsqpnFb6FbDczKaZWVszs0iHEhGJhuTkZGbMmEGlSpXo1KmTBqjz+MVycPfHgDrAi0BPYIOZPW1mF0c4m4hIxFWuXJlp06axadMm/uu//it0nJhxSgPSfmS++bbcLRuoAEw3szERzCYiEhVXXXUVd999NxMmTGDNmjWh48SEUxlzuN/MVgBjgE+Ay9z990BjoEuE84mIRMXIkSM599xz6du3r66/xKkdOVQCOrt7G3d/290PAbh7DtAhoulERKLkvPPOY/To0SxZsoT09PTQcYKzWG1IM2sLjAdKAFPcfdSJnpuWluZazENEzlZOTg7NmjUjMzOT9evXU6FCfH9Q08xWuHtaQftichKcmZUAngfaAfWA282sXthUIhLvEhISmDRpEjt37iz260/HZDkATYBMd//a3Q8CU4GOgTOJSDFwxRVX0K9fPyZPnlyslxeN1XK4EPguz/1NuY8dY2Z9zCzDzDJ27NgR1XAiEt+eeuopKleuTN++fYvttZditRwKmmh33OCIu7/g7mnunpaamhqlWCJSHJQvX56xY8eyfPlypkyZEjpOELFa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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "\n",
    "x_list = np.linspace(-5, 5, npoints)\n",
    "plt.plot(x_list, polynomialModel(x_list, a0),'black')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deb94dd0",
   "metadata": {},
   "source": [
    "### 2.3.2 Define error "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba18c206",
   "metadata": {},
   "source": [
    "There are many reasonable definitions of an error function but a very common choice is: \\\\( \\Delta = \\sum_{i=1}^n \\left(y_i-f(x_i)\\right)^2\\\\)\n",
    "\n",
    "\\\\( f \\\\) is the fit function that is determined by the coefficients \\\\( a_i \\\\) in our case.\n",
    "\n",
    "\\\\( (x_i, y_i) \\\\) are the data points that we try to fit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "a2c809aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "def errorFit(f, coefficients, data):\n",
    "    # f: The fit function\n",
    "    # coefficients: ai that we try to optimize\n",
    "    # data: The data we try to fit\n",
    "    error = 0\n",
    "    for i in range(len(data[0])):\n",
    "        error = error + ( data[1,i] - f( data[0,i], coefficients ))**2\n",
    "        # print(error)\n",
    "    return error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "6b7fe9f0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "205.00065737465286"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "errorFit(polynomialModel, a0, data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74701646",
   "metadata": {},
   "source": [
    "### 2.3.3 Update coefficients to reduce the error (gradient descent)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1274500",
   "metadata": {},
   "source": [
    "We can use several different methods to minimize the error, e. g. a Monte-Carlo algorithm. Here, we will use the gradient descent method. The coefficients \\\\( a_i \\\\) will be updated along the gradient direction of the error function \\\\( \\nabla_{\\vec{a}} \\Delta\\\\). The gradient consists of elements \\\\( \\frac{\\partial}{\\partial a_k} \\Delta = -2 \\sum_{i=1}^n \\left(y_i-f(x_i)\\right) \\frac{\\partial}{\\partial a_k}f(x_i) = -2 \\sum_{i=1}^n \\left(y_i-f(x_i)\\right) x_i^{k}\\\\)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "b2e7a9c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def errorFitGradient(f, coefficients, data):\n",
    "    # f: The fit function\n",
    "    # coefficients: ai that we try to optimize\n",
    "    # data: The data we try to fit\n",
    "    return -2 * np.array([\n",
    "            np.sum(np.array([(data[1,i] - f(data[0,i], coefficients)) * data[0,i]**k for i in range(len(data[0]))]))\n",
    "        for k in range(len(coefficients))])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "fb65b35c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   -2.36837702,   -49.67876132,   -92.95686059, -1211.77134611])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "errorFitGradient(polynomialModel, a0, data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23fb3610",
   "metadata": {},
   "source": [
    "### 2.3.4 Loop for the actual fitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "fe7686c6",
   "metadata": {},
   "outputs": [],
   "source": [
    "iterations = 100000\n",
    "h = 0.00001\n",
    "a = 2*np.random.rand(4)-1\n",
    "\n",
    "for i in range(iterations):\n",
    "    a = a - h * errorFitGradient(polynomialModel, a, data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "a0a14f92",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7ff1ee8a0460>"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "\n",
    "x_list = np.linspace(-5, 5, npoints)\n",
    "plt.plot(x_list, polynomialModel(x_list, a),'black')\n",
    "plt.plot(x_list, polynomialModel(x_list, a0),'orange')\n",
    "plt.scatter(data[0], data[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "72e21689",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "196.3697319185757\n",
      "205.00065737465286\n"
     ]
    }
   ],
   "source": [
    "print(errorFit(polynomialModel, a, data))\n",
    "print(errorFit(polynomialModel, a0, data))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72361f21",
   "metadata": {},
   "source": [
    "- Comparison of a and a0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "68042292",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14.81220423  2.1859417  -0.4729714  -0.32868552]\n",
      "[15.    2.4  -0.5  -0.35]\n"
     ]
    }
   ],
   "source": [
    "print(a)\n",
    "print(a0)"
   ]
  }
 ],
 "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.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
