{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# 2-Dimensional Least Squares Fit\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import ndsplines \nfrom scipy import interpolate\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nfrom mpl_toolkits.mplot3d import Axes3D\n\n\nNUM_X = 50\nNUM_Y = 50\nx = np.linspace(-3, 3, NUM_X)\ny = np.linspace(-3, 3, NUM_Y)\nmeshx, meshy = np.meshgrid(x,y, indexing='ij')\ninput_coords = np.stack((meshx, meshy), axis=-1)\nK = np.array([[1, -0.7,], [-0.7, 1.5]])\nmeshz = np.exp(-np.einsum(K, [1,2,], input_coords, [...,1], input_coords, [...,2])) + 0.1 * np.random.randn(NUM_X,NUM_Y)\n\n\nxt = [-1, 0, 1]\nyt = [-1, 0, 1]\nk = 3\nxt = np.r_[(x[0],)*(k+1),\n          xt,\n          (x[-1],)*(k+1)]\nyt = np.r_[(y[0],)*(k+1),\n          yt,\n          (y[-1],)*(k+1)]\n          \nts = [xt, yt]\n\nsamplex = input_coords.reshape((-1,2))\nsampley = meshz.reshape((-1))\n\nspl = ndsplines.make_lsq_spline(samplex, sampley, ts, np.array([3,3]))\n\nfig = plt.figure()\nax = fig.add_subplot(111, projection='3d')\n\nax.scatter(meshx, meshy, meshz, alpha=0.25)\nax.plot_wireframe(meshx, meshy, spl(input_coords), color='C1')\nplt.show()"
      ]
    }
  ],
  "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.3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}