{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Choice of Nodes for Polynomial Interpolation"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "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": {},
      "outputs": [],
      "source": [
        "func = \"runge\"\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": {},
      "outputs": [
        {
          "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": [
        "x_points = []\n",
        "y_points = []\n",
        "deg = [1]\n",
        "\n",
        "def update_plot():\n",
        "    clf()\n",
        "    xlim([-1, 1])\n",
        "    ylim([-1.5, 1.5])\n",
        "    gca().set_autoscale_on(False)\n",
        "    plot(x_points, y_points, 'o')\n",
        "\n",
        "    x = np.linspace(-1, 1, 500)\n",
        "    plot(x, f(x), \"--\")\n",
        "\n",
        "    if len(x_points) >= deg[0]+1:\n",
        "        eval_points = np.linspace(-1, 1, 500)\n",
        "        poly = np.poly1d(np.polyfit(\n",
        "            np.array(x_points),\n",
        "            np.array(y_points), deg[0]))\n",
        "        plot(eval_points, poly(eval_points), \"-\")\n",
        "\n",
        "\n",
        "def click(event):\n",
        "    \"\"\"If the left mouse button is pressed: draw a little square. \"\"\"\n",
        "    tb = get_current_fig_manager().toolbar\n",
        "    if event.button == 1 and event.inaxes and tb.mode == '':\n",
        "        x_points.append(event.xdata)\n",
        "        x_ary = np.array([event.xdata])\n",
        "        y_ary = f(x_ary)\n",
        "        y_points.append(y_ary[0])\n",
        "\n",
        "    if event.button == 3 and event.inaxes and tb.mode == '':\n",
        "        if len(x_points) >= deg[0]+2:\n",
        "            deg[0] += 1\n",
        "\n",
        "    update_plot()\n",
        "    draw()\n",
        "\n",
        "update_plot()\n",
        "connect('button_press_event', click)\n",
        "show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "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.4+"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}