{
 "metadata": {
  "name": ""
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import scipy.sparse as sp\n",
      "import scipy.sparse.linalg as alg\n",
      "import math\n",
      "from time import time\n",
      "\n",
      "import pylab as pl\n",
      "\n",
      "%pylab inline --no-import-all"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Populating the interactive namespace from numpy and matplotlib\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# x - bezwymiarowa siatka polozen\n",
      "\n",
      "# Stale 'rho' zadeklerowane dla ponizszych typow potencjalow to bezwymiarowe zmienne\n",
      "# z bezwymiarowego rownania Schrodingera.\n",
      "\n",
      "def rho_infWell():\n",
      "    return 1.0\n",
      "def infWell(x):\n",
      "    # potencjal nieskonczonej studni:\n",
      "    # v(x) = 0\n",
      "    return np.zeros_like(x)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# rozmiar macierzy pieciodiagonalnej:\n",
      "N = 1000\n",
      "    \n",
      "# konce bezwymiarowego przedzialu obustronnie domknietego [x_min,x_max]:\n",
      "x_min = -3.0\n",
      "x_max = 3.0\n",
      "\n",
      "# ilosc wartosci wlasnych i wektorow wlasnych, ktore chcemy wyznaczyc:\n",
      "N_eigvals = 4\n",
      "\n",
      "# wybor potencjalu:\n",
      "potential = infWell\n",
      "# opcjonalne argumenty wybranego potencjalu:\n",
      "args_potential = ()\n",
      "\n",
      "# wybor parametru rho (odpowiedni dla danego potencjalu):\n",
      "#rho = rho_Konwent\n",
      "rho = rho_infWell\n",
      "# opcjonalne argumety wejsciowe funkcji zwracajacej wartosc bezwymiarowej zmiennej rho\n",
      "args_rho = ()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential):\n",
      "    \n",
      "    \"\"\"\n",
      "    funkcja 'EigenvalEigenvecProblem5' rozwiazuje algebraiczne zagadnienie wlasne \n",
      "    wykorzystujac pieciopunktowa metode centralnych roznic skonczonych do przyblizenia \n",
      "    drugiej pochodnej.\n",
      "    \"\"\"\n",
      "    \n",
      "    # dyskretna siatka polozen, gdzie N - ilosc punktow siatki:\n",
      "    x = np.linspace(x_min, x_max, N)\n",
      "    \n",
      "    # krok dyskretnej siatki:\n",
      "    dx = (x_max - x_min) / (N - 1)\n",
      "    \n",
      "    # elementy na glownej diagonali macierzy pentadiagonalnej:\n",
      "    diagonal = 30.0 * np.ones(N) + 12.0 * dx * dx * rho(*args_rho) * potential(x, *args_potential)\n",
      "    # elementy na pierwszych diagonalach macierzy pentadiagonalnej:\n",
      "    diag_edge1 = -16.0 * np.ones(N - 1)\n",
      "    # elementy na drugich diagonalach macierzy pentadiagonalnej:\n",
      "    diag_edge2 = 1.0 * np.ones(N - 2)\n",
      "    # tablica niezerowych element\u00f3w macierzy pentadiagonalnej:\n",
      "    pentadiagonal = np.array([diag_edge2, diag_edge1, diagonal, diag_edge1, diag_edge2])\n",
      "    \n",
      "    # numery diagonali, gdzie 0 oznacza diagonale glowna, \n",
      "    # -1 -pierwsza diagonale dolna, 1 -pierwsza diagonale gorna,\n",
      "    # -2 -druga diagonale dolna, 2 - druga diagonale gorna:\n",
      "    offsets = [-2, -1, 0, 1, 2]\n",
      "    # macierz trojdiagonalna (hamiltonian) zapisana w postaci macierzy rzadkiej:\n",
      "    hamilton = sp.diags(pentadiagonal, offsets)\n",
      "        \n",
      "    start = time()\n",
      "    \n",
      "    # wyznaczenie N_eigvals wartosci wlasnych i odpowiadajacych im wektorow wlasnych\n",
      "    eigvals, eigvecs = alg.eigsh(hamilton, k = N_eigvals, which = \"SM\", tol = 1.0E-4)\n",
      "    # argument \"SM\" oznacza, \u017ce wyznaczone zostanie N_eigvals najmniejszych wartosci\n",
      "    # wlasnych i odpowiadajacych im wektorow wlasnych, a argument \"tol\" oznacza wzgledna \n",
      "    # dokladnosc, z jaka wyznaczone zostana wartosci wlasne\n",
      "    \n",
      "    # !UWAGA! Argument 'eigvecs' stanowi macierz o 'N' wierszach i 'k' kolumnach,\n",
      "    # wiec i-ty wektor wlasny ma 'i' kolumn o dlugosci 'N'.\n",
      "    \n",
      "    #print \"'alg.eigsh(...)' time: %.2fs\" % (time() - start)\n",
      "    \n",
      "    eigvals = eigvals / (12.0 * dx * dx * rho(*args_rho))\n",
      "    \n",
      "    return eigvals, eigvecs"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# DYSKUSJA BLEDOW\n",
      "\n",
      "eigvals_a, eigvecs_a = EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential)\n",
      "\n",
      "N_max = 825\n",
      "\n",
      "N_list = range(50, N_max, 200)\n",
      "measures = 5\n",
      "\n",
      "time_list = []\n",
      "digits_list = []\n",
      "\n",
      "for N in N_list:\n",
      "    eigvals_num, eigvecs_num = EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential)\n",
      "    \n",
      "    time_start = time()\n",
      "    for m in xrange(measures):\n",
      "        EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential)\n",
      "    exec_time = (time() - time_start) / measures\n",
      "    \n",
      "    time_list.append( exec_time )\n",
      "    digits = [-math.log10( abs( (e_num - e_a) / e_a ) )\n",
      "                  for e_num, e_a in zip(eigvals_num, eigvals_a) ]\n",
      "    digits_list.append(digits)\n",
      "    \n",
      "for idx in xrange(N_eigvals):\n",
      "    \n",
      "    digit_data = [digit[idx] for digit in digits_list]\n",
      "    pl.plot(N_list, digit_data, \".-\", label = \"$\\widetilde{E}_{%d}$\" % idx+1)\n",
      "    \n",
      "pl.legend(bbox_to_anchor=(1.16, 0.7))\n",
      "pl.xlabel(\"$N_{}^2$\", {\"fontsize\": \"xx-large\"})\n",
      "pl.ylabel(\"$l_n$\", {\"fontsize\": \"xx-large\", \"rotation\": \"horizontal\"})\n",
      "pl.xlim(None, N_max)\n",
      "pl.xlim(50,1000)\n",
      "pl.savefig(\"well_num_l_N2.png\")\n",
      "pl.show()\n",
      "\n",
      "for idx in xrange(N_eigvals):\n",
      "    \n",
      "    digit_data = [digit[idx] for digit in digits_list]\n",
      "    pl.plot(time_list, digit_data, \".-\", label = \"$\\widetilde{E}_{%d}$\" % idx+1)\n",
      "\n",
      "pl.legend(bbox_to_anchor=(1.16, 0.7))    \n",
      "pl.xlabel(\"$t \\, [s]$\", {\"fontsize\": \"xx-large\"})\n",
      "pl.ylabel(\"$l_n$\", {\"fontsize\": \"xx-large\", \"rotation\": \"horizontal\"})\n",
      "pl.savefig(\"well_num_l_t.png\")\n",
      "pl.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "ename": "KeyboardInterrupt",
       "evalue": "",
       "output_type": "pyerr",
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
        "\u001b[1;32m<ipython-input-40-e1b583ea2a4c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     19\u001b[0m     \u001b[0mtime_start\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     20\u001b[0m     \u001b[1;32mfor\u001b[0m \u001b[0mm\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mxrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmeasures\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 21\u001b[1;33m         \u001b[0mEigenvalEigenvecProblem5\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_min\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_max\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN_eigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpotential\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs_potential\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     22\u001b[0m     \u001b[0mexec_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mtime_start\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mmeasures\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     23\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m<ipython-input-39-412d5ad0f512>\u001b[0m in \u001b[0;36mEigenvalEigenvecProblem5\u001b[1;34m(N, x_min, x_max, N_eigvals, potential, *args_potential)\u001b[0m\n\u001b[0;32m     32\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     33\u001b[0m     \u001b[1;31m# wyznaczenie N_eigvals wartosci wlasnych i odpowiadajacych im wektorow wlasnych\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 34\u001b[1;33m     \u001b[0meigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0meigvecs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0malg\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0meigsh\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhamilton\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mN_eigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mwhich\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"SM\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtol\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1.0E-4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     35\u001b[0m     \u001b[1;31m# argument \"SM\" oznacza, \u017ce wyznaczone zostanie N_eigvals najmniejszych wartosci\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     36\u001b[0m     \u001b[1;31m# wlasnych i odpowiadajacych im wektorow wlasnych, a argument \"tol\" oznacza wzgledna\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.pyc\u001b[0m in \u001b[0;36meigsh\u001b[1;34m(A, k, M, sigma, which, v0, ncv, maxiter, tol, return_eigenvectors, Minv, OPinv, mode)\u001b[0m\n\u001b[0;32m   1570\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1571\u001b[0m     \u001b[1;32mwhile\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconverged\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1572\u001b[1;33m         \u001b[0mparams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miterate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1573\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1574\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextract\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mreturn_eigenvectors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.pyc\u001b[0m in \u001b[0;36miterate\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    540\u001b[0m             \u001b[1;31m# compute y = Op*x\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    541\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 542\u001b[1;33m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0myslice\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOP\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mxslice\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    543\u001b[0m             \u001b[1;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    544\u001b[0m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mxslice\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOPb\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mxslice\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.pyc\u001b[0m in \u001b[0;36mdot\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m    244\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    245\u001b[0m         \"\"\"\n\u001b[1;32m--> 246\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    247\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    248\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m__eq__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.pyc\u001b[0m in \u001b[0;36m__mul__\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m    294\u001b[0m             \u001b[1;31m# Fast path for the most common case\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    295\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 296\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_mul_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    297\u001b[0m             \u001b[1;32melif\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    298\u001b[0m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_mul_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/dia.pyc\u001b[0m in \u001b[0;36m_mul_vector\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m    178\u001b[0m         \u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mN\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    179\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 180\u001b[1;33m         \u001b[0mdia_matvec\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moffsets\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mL\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moffsets\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    181\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    182\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
       ]
      }
     ],
     "prompt_number": 40
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# WYKRES WARTOSCI ENERGII DLA KOLEJNYCH POZIOMOW ENERGETYCZNYCH:\n",
      "\n",
      "N_eigvals = 4\n",
      "\n",
      "eigvals, eigvecs = EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential)\n",
      "\n",
      "fig, ax1 = pl.subplots(figsize = (8, 5))\n",
      "ax1.set_yticklabels([])\n",
      "ax1.set_ylabel(\"$\\psi_n$\", {\"fontsize\": \"xx-large\", \"rotation\": \"horizontal\"})\n",
      "\n",
      "ax2 = ax1.twinx()\n",
      "\n",
      "num_x = len(eigvecs)\n",
      "dx = (x_max - x_min) / (num_x - 1) \n",
      "x_list = [x_min + i * dx for i in xrange(num_x)]\n",
      "print len(x_list)\n",
      "h_list = [potential(x_i) for x_i in x_list]\n",
      "ax2.plot(x_list, h_list, color = \"black\")\n",
      "\n",
      "#\"FUNKCJE FALOWE x5!\"\n",
      "for i in xrange(N_eigvals):\n",
      "    ax2.plot([x_min, x_max], [eigvals[i],eigvals[i]], color = \"orange\")\n",
      "    ax2.plot(x_list, 5.0*eigvecs[:,i] + eigvals[i], color = \"green\")\n",
      "\n",
      "ax2.set_xticks([x_min, x_max])\n",
      "ax2.set_xticklabels([\"$x_{min}$\", \"$x_{max}$\"])\n",
      "ax2.set_xlim(x_min, x_max)\n",
      "ax2.set_yticks(eigvals)\n",
      "ax2.set_yticklabels([\"$n = %d$\" % i for i in range(1,len(eigvals)+1)])\n",
      "ax2.set_ylim(None, eigvals[-1] + 1)\n",
      "\n",
      "pl.savefig(\"well_num_all.png\")\n",
      "pl.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "ename": "KeyboardInterrupt",
       "evalue": "",
       "output_type": "pyerr",
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
        "\u001b[1;32m<ipython-input-5-b26a0615cadd>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mN_eigvals\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0meigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0meigvecs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mEigenvalEigenvecProblem5\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_min\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_max\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mN_eigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpotential\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs_potential\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      7\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0max1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpl\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msubplots\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m<ipython-input-4-412d5ad0f512>\u001b[0m in \u001b[0;36mEigenvalEigenvecProblem5\u001b[1;34m(N, x_min, x_max, N_eigvals, potential, *args_potential)\u001b[0m\n\u001b[0;32m     32\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     33\u001b[0m     \u001b[1;31m# wyznaczenie N_eigvals wartosci wlasnych i odpowiadajacych im wektorow wlasnych\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 34\u001b[1;33m     \u001b[0meigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0meigvecs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0malg\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0meigsh\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhamilton\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mN_eigvals\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mwhich\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"SM\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtol\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1.0E-4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     35\u001b[0m     \u001b[1;31m# argument \"SM\" oznacza, \u017ce wyznaczone zostanie N_eigvals najmniejszych wartosci\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     36\u001b[0m     \u001b[1;31m# wlasnych i odpowiadajacych im wektorow wlasnych, a argument \"tol\" oznacza wzgledna\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.pyc\u001b[0m in \u001b[0;36meigsh\u001b[1;34m(A, k, M, sigma, which, v0, ncv, maxiter, tol, return_eigenvectors, Minv, OPinv, mode)\u001b[0m\n\u001b[0;32m   1570\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1571\u001b[0m     \u001b[1;32mwhile\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconverged\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1572\u001b[1;33m         \u001b[0mparams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miterate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1573\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1574\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextract\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mreturn_eigenvectors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.pyc\u001b[0m in \u001b[0;36miterate\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    540\u001b[0m             \u001b[1;31m# compute y = Op*x\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    541\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 542\u001b[1;33m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0myslice\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOP\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mxslice\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    543\u001b[0m             \u001b[1;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    544\u001b[0m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mxslice\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOPb\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mworkd\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mxslice\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.pyc\u001b[0m in \u001b[0;36mdot\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m    244\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    245\u001b[0m         \"\"\"\n\u001b[1;32m--> 246\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    247\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    248\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m__eq__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.pyc\u001b[0m in \u001b[0;36m__mul__\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m    294\u001b[0m             \u001b[1;31m# Fast path for the most common case\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    295\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 296\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_mul_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    297\u001b[0m             \u001b[1;32melif\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    298\u001b[0m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_mul_vector\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/scipy/sparse/dia.pyc\u001b[0m in \u001b[0;36m_mul_vector\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m    178\u001b[0m         \u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mN\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    179\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 180\u001b[1;33m         \u001b[0mdia_matvec\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mN\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moffsets\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mL\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moffsets\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    181\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    182\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# WYKRES FUNKCJI FALOWEJ:\n",
      "\n",
      "x = np.linspace(x_min, x_max, N)\n",
      "eigvals, eigvecs = EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential)\n",
      "\n",
      "fig, ax1 = pl.subplots(figsize = (8, 5))\n",
      "ax2 = ax1.twinx()\n",
      "\n",
      "for idx in range(N_eigvals)[0:4]:\n",
      "    \n",
      "    psi = 9.0 * eigvecs[:,idx]\n",
      "    ax2.plot(x, psi + eigvals[idx], label = \"$\\psi_{%d}(x)$\" % idx, color = \"red\")\n",
      "    \n",
      "ax1.set_ylabel(\"$\\psi_n(x)$\", {\"fontsize\": \"xx-large\", \"rotation\": \"horizontal\"})\n",
      "ax1.set_yticks([])\n",
      "ax1.set_xticks([])\n",
      "ax1.set_xlabel(\"$x$\", {\"fontsize\": \"xx-large\"})\n",
      "\n",
      "ax2.set_xlim(x_min, x_max)\n",
      "ax2.set_xticklabels([x_min, x_max], [\"$x_{min}$\", \"$x_{max}$\"], size = 15)\n",
      "ax2.set_yticks(eigvals)\n",
      "ax2.set_yticklabels([\"$n = %d$\" % i for i in range(1,len(eigvals)+1)])\n",
      "\n",
      "pl.savefig(\"well_num_psi.png\")\n",
      "pl.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nlqZNXY9ln1f16Hzu68vAUllp2LDqzzk/X9lmblXNgan4ccPgnILSUu7pUvGxso+VfSwqYkCorBQU\nVP05ZykbGho14mvZvHn5MFfdv8sGiLIhwll0SUIsZJe+T0FDxFMZBjvT3NzyHWt1j5V9rKiofMde\nWanu8xWPraqOtao+7gwzNT1W/FjDhgxJTZpUXZxhqqpSNjhodEjqGbv0fQoaIiIi9ZBd+j7dwEJE\nRERMo6AhIiIiplHQEBEREdMoaIiIiIhpFDRERETENAoaIiIiYhoFDRERETGNgoaIiIiYRkFDRERE\nTKOgISIiIqZR0BARERHTKGiIiIiIaRQ0RERExDQKGiIiImIaBQ0RERExjYKGiIiImEZBQ0REREyj\noCEiIiKmUdAQERER0yhoiIiIiGkUNERERMQ0ChoiIiJiGgUNERERMY2ChoiIiJhGQUNERERMo6Ah\nIiIiplHQEBEREdMoaIiIiIhpFDRERETENAoaIiIiYhoFDRERETGNgoaIiIiYRkFDRERETKOgISIi\nIqZR0BARERHTKGiIiIiIaRQ0RERExDQKGiIiImKaRlZXwF18fHysroKIiIjX8YqgYRiG1VUQERHx\nSrp0IiIiIqZR0BARERHTKGiIiIiIaRQ0RERExDQKGiIiImIaBQ0RERExjVcsbxUR93r99deRl5eH\nvXv34qWXXsKnn34KwzCQmZmJ1157zerqiYgbaURDROrU3LlzMW7cODz33HO46667EBsbi8ceewyF\nhYVYtGiR1dUTETdT0BCROlVSUoLevXsDAFJTUxEZGYnOnTvjySefxKZNmyyunYi4m4+hbTNFxCSj\nRo3C2LFj8dvf/tbqqoiIRTSiISKmKCwsxI4dOxATE2N1VUTEQgoaIlJniouLsW7dOgDA9u3bYRgG\noqKiAADp6elYuHChldUTEQsoaIhInXn77bcxfvx45Ofn44svvkD79u3RqBEXt73xxhuYMGGCxTUU\nEXfTHA0RqTMHDx7EK6+8gtDQUIwbNw6rV69Gbm4umjVrhsmTJ6N///5WV1FE3ExBQ0REREyjSyci\nIiJiGgUNERERMY2ChoiIiJhGQUNERERMo6AhIiIiplHQEBEREdMoaIiIiIhpFDRERETENP8fXKl5\nRAsSvYAAAAAASUVORK5CYII=\n",
       "text": [
        "<matplotlib.figure.Figure at 0x9e6bbac>"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# WYKRES GESTOSCI PRAWDOPODOBIENSTWA: \n",
      "\n",
      "x = np.linspace(x_min, x_max, N)\n",
      "eigvals, eigvecs = EigenvalEigenvecProblem5(N, x_min, x_max, N_eigvals, potential, *args_potential)\n",
      "\n",
      "fig, ax1 = pl.subplots(figsize = (8, 5))\n",
      "ax2 = ax1.twinx()\n",
      "\n",
      "for idx in range(N_eigvals)[0:4]:\n",
      "    \n",
      "    psi = 9.0 * eigvecs[:,idx]\n",
      "    ax2.plot(x, psi ** 2 + eigvals[idx], label = \"$P_{%d}(x)$\" % idx, color = \"red\")\n",
      "    \n",
      "ax1.set_ylabel(\"$P_n(x)$\", {\"fontsize\": \"xx-large\", \"rotation\": \"horizontal\"})\n",
      "ax1.set_yticks([])\n",
      "ax1.set_xticks([])\n",
      "ax1.set_xlabel(\"$x$\", {\"fontsize\": \"xx-large\"})\n",
      "\n",
      "ax2.set_xlim(x_min, x_max)\n",
      "ax2.set_xticklabels([x_min, x_max], [\"$x_{min}$\", \"$x_{max}$\"], size = 15)\n",
      "ax2.set_yticks(eigvals)\n",
      "ax2.set_yticklabels([\"$n = %d$\" % i for i in range(1,len(eigvals)+1)])\n",
      "\n",
      "plt.savefig(\"well_num_P.png\")\n",
      "pl.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAhoAAAE2CAYAAAAnPzv2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtwlNd9//HP6n6/ICEECGQuBixzt7FDRAC7Pwc7M8RT\nF3fcNgNNWrdN06QzjtNxpmSSODNOmQSP7YxTD6nHdS9xWxeXSTq0HdIGJC52jI25CGxu5iLuCF1Z\n3Va7vz++fnh2pZWQsI52hd6vmTPPanclnt3znHM+z3kuBCKRSEQAAAAOpCR6BQAAwO2LoAEAAJwh\naAAAAGcIGgAAwBmCBgAAcCYt0SswEgKBQKJXAQCAEZcMF5aOiaAhJceXDQDASEmWnWwOnQAAAGcI\nGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACcIWgAAABnCBoAAMAZggYAAHCG\noAEAAJwhaAAAAGcIGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACcIWgAAABn\nCBoAAMAZggYAAHCGoAEAAJxJS/QK4CZ6eqT6euncOenqVb+0tkpdXX6RpKwsKTvblgUF0oQJfqmo\nkPLzE/tZxqKuLun0aeniRenKFStXr0rBoL3W2WnLtDS/7rKzpXHjpLIyq7uyMmnKFHsNI6utzerv\n8mW//hoapI4Ov+66u6XMTKufrCwpJ0cqLbV68+qwosLqGCPr2jXp7NnY+mtq8uuvs1MKh2PrLzfX\nr7uyMmniRCuBQKI/zagViEQikUSvhGuBQEBJ/zGvX5cOHpT275cOHJBOnJBOnpTOnLFOa/Jkafx4\nK6WlFhoyM6WMDCuRiDWe9nZbNjdLly75pb5eysuT7rxTmjlTmjVLmj9fWrRImjSJRvRpXbtmdffB\nB1JdndXdiRMWMCoqrKPy6q601Dozr+4yMqRQyOrNq8Nr16xz9Orv3DkbsGbOtDJ7trRwoZVx4xL9\n6Ue3SEQ6f96vvw8/tLo7cUJqaZGmTrXv3mt/JSUWBjMzraSlWeDw6i8YtAHt8mUrFy7YsrLSr7+7\n7rK2N2+ebQu4deGwtbcPPrA6PHrUr79w2L73sjK//oqL/brLzJRSUixweOGjtTW2/s6ds8A5fbpf\nf3PnWturqpLS0xP9DfQrWcY+gkYihMPSoUNSba2Vffssdd91l7RggQWAO++UZsyQ7rhjePZkIxHr\n8I4fl44dkz76yBrlvn32+qJF0uLF0mc/a6Wk5NP/m7erri5p716ppkbavds6uMZGq7sFC2zwmDnT\nOqapU4dnTzYUsm3k+HErR45Y3e3fb0Fj4ULp3nul6mrpvvsYvAbS2mr1VlMj/eY3Vn+SH9yqqqzt\nzZhhATFlGI4wd3RIp0757a+uzurvyBEbCBctkpYssfpbtCipB6+Eu3TJ7zvfe892zIqL7XtbsMBC\nuFd/JSXDsxPV2mphxqu/Awdsuzl1Spozx/7tz3zG6m/OnOHZZoZBsox9BI2R0N1tnUpNjZWdO22v\ndvly6XOfk+65xxpHIjoXb2/u/fet0e7aJb3zju2FL1tmDWfZMhs0x+qsx/Xr0ttvW93V1trgNGuW\n1V91tQW0adMS07mEw7bntm+frdeuXdYJ3n23X3fV1VJ5+civW7JoaLA257W/I0eszS1fboPDokWJ\nmxrv7vZD49tvW/19/LEfGqurLfgXFo78uiWLM2f8uqupsVnCZcus77zvPgsXiZrVCwZtJvq996Q9\ne6z+mpulpUv9+rvvvoQd9kz42OetB0HDgfZ26/Rra61hvP22zUwsX+6Hi4kTR259hioUssFq1y7r\noHfutEASvf533500qX3YNTXZZ/c6tgMHbE/X++zV1cnd8be324zLzp32OXbtsinj6Pq7447bNzie\nP++3vZoaO8di6VL/8y9ZktznuzQ1+aFj1y7p3Xdthiy6/srKEr2WbkQiNmvg1d2OHTaYe599+XKb\nMUxNTfSa9u/CBZsx8/rPw4dj+48RDI4EjRHk/MuOnoqtqbHZgbvv9hvGsmWj+zh6JGJ7Wd4efU2N\nnUPg7VUsXz66p3svXYrd4z1+3PZCvPq7/347wW+0ij5U533GtDS/41u+3A7bjcbg4W2b0Z/t2jX/\nc33uc7ZtjuYTMbu6bI/Z+4y7dtk5I9GfsbJydNZff9vmihV++5s9e3R+Nk9bW+yM6Lvv2oxodP05\nCo4EjRE07F/2uXP+3uLOnXa+wz33+I1j6VI78fJ2duFCbOdw6pQNyF7Duf9+O2Eu2Xh7TDt32vrv\n3Gknfn32s379LV5sJ2jerqL3Gr06bG21evM6vwULknNw7umxGSZvpq33bNvy5XaOxe062ybZd9B7\ncM7I8Otu+XI7TyAZB+fOThtovfa3e7cNssuW+e1vtIamwersjB8co4P/MH0HLoNGY2Oj/uZv/kYb\nNmy4+XoQNG6isdFO+nn/fSu7d1un7B1/W7bMQkZm5vCu9Ghz7Zp/uKG21o5bLlrkh4758226fqQH\ngIsX/bp77z2rP69T/tznrP5u58NAg3X2rH+CXU2NXaX02c/ad7R4sQWP8vKRHQAiETsBb98+q7+9\ne+38ocmTrd68Mm3a7T0w3czNguO999rhhqKikV2vUMh2wt57zy8ffGAhyFu36mobZMeynh7rL6Pb\nX3q6Hzruu89mHG9hx81l0Hj55Ze1d+9evfbaazdfD4KGrEFcvGhnEx87Zo326FE7o//qVRskFy+2\ngXPpUpvKG+sD081ETxd6Z4Y3N1uHt2CBTR1Om+aXT3OPj85OOy5/7JjVm1cOHLDXFi+2MOjV39Sp\nw/c5b1dXrvgzBt7VLamp1hbmz7dzBqZNs5OEKys/3TkP169b0PHq7dgxu8R0/37bLhYv9svSpXYi\nNQZWXx97VduhQ3b4dt48K3feacF/2jQ78ftWD3tGInZOiVd/H33kLw8dskvn77nHb4NLlnA/n5vx\ngqMXOt57z36eOjW2/iorrUyc2O85K66CxrFjx3Ts2DG9+eabBA3P3EBAh772NTtJziutrf49Chob\nrfOaOdMq0LvXhNehJvOJR6NJQ4Ml9wMHbDD5+GO/ZGXZpWheKSqyzi893abwU1Ks3oJBK179Xbxo\noWbiRP/+ILNmWR3Om2eNcyzv7Q4X7+qkAwesDk+csHo7edIGmYICa0Ne/eXn+/WXnm6/Hwz6ddjU\nZHV38aIF/YoKv9685YIFt+9JjyMtHLb68urv5En7+dQpq4PSUgsiXikosHbnlUjEAqFXmpvt8OnF\nizZD6NXf7Nl+G5w3L7lPmh5NuroswB086Le/06etXLtm/d+4cdoeiWh7Z+eN+7t8f+/ePkGjtrZW\nmzdv1ooVKyRJdXV1Wr9+/ZBW5z/+4z+0ePFife973xtU0EjCg7DDLyhZA8jO9u++mJ/v3zWztDQ5\nj0ffbkpKpJUrrUSLRCyERJemJhuAQiG7BDActhMyc3KsDvPybCq/vNyuoWeGya1AwA5ZTJ4sPfJI\n7Gs9PTbz19DgL9varN68EgjYvT2ys60OCwv9+svPJwy6lpLi31vit3879rXubgsMjY02aF27Zjcq\nC4WsbkMhe19url+8+ps4cXSfKD1aZGTYTcLmzpV+7/diX+vosJ2Axkat/KSopUXq6tL39+7t86cC\nn7S1iooKLVmyRFu2bLnx2uHDh7Vt27a4q7Bu3ToVFRVp9+7dqq6uVjAYHPTqj4kZjWQ58xYAgJHS\n39i3evVq/fKXv1Rzc7Oeeuopvfrqq4P+m6+99ppSUlJ09epVbdmyRT/60Y/0mc98ZsDfYTceAIAx\nor29XVmfnFO1detWPfTQQ9qzZ4+WLl064IzG2rVrVVxcrC9/+cuSpFOnTunQoUM3DRkSQQMAgDGj\nrq7uxvkZ+fn5OnHihKqrqyVJVVVVqqqquunf6Ojo0E9+8hO9++67qqmp0fLlywd8P4dOAAC4DSXL\n2McZdAAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACcIWgAAABnCBoAAMAZggYA\nAHCGoAEAAJwhaAAAAGcIGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACcIWgA\nAABnCBoAAMAZggYAAHCGoAEAAJwhaAAAAGcIGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIG\nAABwhqABAACcIWgAAABnCBoAAMAZggYAAHCGoAEAAJwhaAAAAGcIGgAAwBmCBgAAcIagAQAAnCFo\nAAAAZwgaAADAGYIGAABwhqABAACcIWgAAABnCBoAAMAZggYAAHCGoAEAAJwhaAAAAGcIGgAAwBmC\nBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACcIWgAAABnCBoAAMAZggYAAHCGoAEAAJwh\naAAAAGcIGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACcIWgAAABnCBoAAMAZ\nggYAAHCGoAEAAJwhaAAAAGcIGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADAGYIGAABwhqABAACc\nIWgAAABnCBoAAMAZggYAAHCGoAEAAJwhaAAAAGcIGgAAwBmCBgAAcIagAQAAnCFoAAAAZwgaAADA\nGYIGAABwJimCxscff6zXX399yL/33HPPqaury8EaAQCA4ZDwoNHQ0KD169frS1/60pB/d82aNfqz\nP/szB2sFAACGQyASiUQG++bt27frpz/9qbZs2aLCwkKtWrVKgUBA7e3t+vjjj/Xggw/qBz/4gbKy\nsga9Ak8++aS+9rWvaeHChbf0ATZu3Kjx48dr7dq1/b4nEAhoCB9z9GttlS5e7FuuXZNaWux1b3n9\n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\nTkSuQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0xae03b8c>"
       ]
      }
     ],
     "prompt_number": 7
    }
   ],
   "metadata": {}
  }
 ]
}