{ "cells": [ { "cell_type": "markdown", "id": "edfa5ba5", "metadata": {}, "source": [ "## Trajectory of Light Signal using Jacobi’s Elliptic Function.\n", "\n", "\n", "This workbook describes the: Trajectory of Light Signal using Jacobi’s Elliptic Function. The light deflection arround the sun is determined. \n", "\n", "The theory behind the method is found in paper: 'Equations of Orbits, Deflection of Light, Mercury’s Perihelion Shift, Period of Revolution and Time Delay of Signals in Schwarzchild’s Geometry. Some closed-form solutions using Weinberg’s approach. New Version (19/08/2016) Solomon M. Antoniou'. [Researchgate](https://www.researchgate.net/publication/306379858_Equations_of_Orbits_Deflection_of_Light_Mercury%27s_Perihelion_Shift_Period_of_Revolution_and_Time_Delay_of_Signals_in_Schwarzchild%27s_Geometry_Some_closed-form_solutions_using_Weinberg%27s_approach)\n", "\n", "This project was started based upon a topic on: [Wetenschapsforum](https://www.wetenschapsforum.nl/viewtopic.php?f=85&t=212427). \n", "\n", "Here follows a summary of the result found on forum Wetenschapsforum. The mean set of formulas required are found in article. Where $r_s$ is Schwarzschild radius and $r_0$ radius lightbeam from center mass and $\\varphi$ is the angle following the light signal. The radius $r$ with angle $\\varphi$ are computed with $(6)$. Finally the startcondition $\\sigma$ and $\\varphi$ range are computed:\n", "\n", "$$e_1 = \\frac{r_0 - r_s + \\sqrt{(r_0 - r_s)(r_0 + 3r_s)}}{2 r_s r_0} \\tag{1}$$\n", "\n", "$$e_2 = \\frac{1}{r_0} \\tag{2}$$\n", "\n", "$$e_3 = \\frac{r_0 - r_s - \\sqrt{(r_0 - r_s)(r_0 + 3r_s)}}{2 r_s r_0} \\tag{3}$$\n", "\n", "$$\\tau = \\sqrt{ \\frac{ r_s (e_1 - e_3)}{ 4 }} \\tag{4}$$\n", "\n", "$$h = \\sqrt{ \\frac{ e_2 - e_3}{ e_1 - e_3 }} \\tag{5}$$\n", "\n", "$$\\boxed{ r = \\frac{1}{ e_3 + (e_2 - e_3) \\mathrm{sn}^2( \\tau \\varphi + \\sigma ; h^2)}} \\tag{6}$$\n", "\n", "Start conditions for $r=r_{0}$ at $\\varphi=\\pi/2$ determine $\\sigma$ substitude $(2)$:\n", "\n", "$$r_{0} = \\frac{1}{ e_3 + (e_2 - e_3) \\mathrm{sn}^2( \\tau \\frac{\\pi}{2} + \\sigma ; h^2)}=\\frac{1}{e_2} \\tag{7}$$\n", "\n", "After simplification:\n", "\n", "$$\\mathrm{sn}( \\tau \\frac{\\pi}{2} + \\sigma ; h^2) = 1 \\tag{8}$$\n", "\n", "Property elliptic integrals:\n", "\n", "$$\\mathrm{sn}(K,h^2)=\\sin \\left( \\frac{\\pi}{2} \\right) \\tag{10} $$\n", "\n", "Where $\\tau$ and $h^2$, are given and the startcondition $\\sigma$ can be solved with standard form complete elliptic integral [Wiki](https://en.wikipedia.org/wiki/Jacobi_elliptic_functions#Definition_as_inverses_of_elliptic_integralshttps://en.wikipedia.org/wiki/Jacobi_elliptic_functions#Definition_as_inverses_of_elliptic_integrals). In the simulation the following integral solver was used from scipy: [special.ellipk]. Definition of complete Jacobi elliptic integral:\n", "\n", "$$K(h^2)=\\int_{0}^{\\frac{\\pi}{2}} \\frac{d t}{\\sqrt{1-h^2 \\sin^2(t) }} =\\tau \\frac{\\pi}{2} + \\sigma \\tag{9} $$ \n", "\n", "Not all solutions are valid, the root of $(6)$ van have zeros. The $x$-range is found by searching the roots of $(6)$. \n", "\n", "$$e_3 + (e_2 - e_3) \\mathrm{sn}^2( \\tau \\varphi + \\sigma ; h^2) = 0 \\tag{12}$$\n", "\n", "$$ \\mathrm{sn}( \\tau \\varphi + \\sigma ; h^2) =\\sqrt{ -\\frac{e_3}{e_2 - e_3}} \\tag{13}$$\n", "\n", "$$\\mathrm{sn}(K|h^2)=\\sin \\left( \\phi \\right) \\tag{14} $$\n", "\n", "$$\\phi=\\arcsin \\left( \\sqrt{ -\\frac{e_3}{e_2 - e_3}} \\right) \\tag{15}$$\n", "\n", "Where $\\tau$, $h^2$, $\\phi$ and $\\sigma$ are given and can be solved with incomplete elliptic integral [scipy: special.ellipkinc]. The maximum angle $\\varphi$ can be calulated with:\n", "\n", "$$K(\\phi|h^2)=\\int_{0}^{\\phi} \\frac{d t}{\\sqrt{1-h^2 \\sin^2(t) }} =\\tau \\varphi + \\sigma \\tag{16} $$" ] }, { "cell_type": "code", "execution_count": 11, "id": "7448a161", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a4d79ae8337042308ccf0ffda151f4e2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Version 25.0 Schwarzschild, Jacobi Elliptic\n", "#https://www.wetenschapsforum.nl/viewtopic.php?f=85&t=212427\n", "\n", "#Open pyplot in separate interactive window\n", "#from IPython import get_ipython\n", "#get_ipython().run_line_magic('matplotlib', 'qt5')\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "#import matplotlib.gridspec as gridspec\n", "import scipy.special as sps\n", "from scipy import optimize\n", "from matplotlib.widgets import Slider, CheckButtons\n", "import matplotlib.ticker as ticker \n", "\n", "%matplotlib widget\n", "\n", "fig= plt.figure(figsize=(9, 5)) \n", "\n", "ax1 = plt.subplot2grid((3, 3), (0, 0),rowspan=2)\n", "ax2 = plt.subplot2grid((3, 3), (0, 1),rowspan=2)\n", "ax3 = plt.subplot2grid((3, 3), (0, 2),rowspan=2)\n", "ax4 = plt.subplot2grid((3, 3), (2, 0),colspan=3)\n", "ax4.axis('off')\n", "\n", "plt.suptitle('Schwarzschild, Jacobi Elliptic', fontsize=20)\n", "#fig.set_tight_layout(True)\n", "plt.tight_layout(pad=1.5, w_pad=1, h_pad=1)\n", "\n", "# Draw slider alpha\n", "axcolor = 'lightgoldenrodyellow'\n", "axalpha = plt.axes([0.25, 0.01,0.4, 0.04], facecolor=axcolor)\n", "s_zoom = Slider(axalpha, 'zoom: ', 0, 1, valinit=0.9)\n", "\n", "axsm = plt.axes([0.25, 0.06,0.4, 0.04], facecolor=axcolor)\n", "s_sm = Slider(axsm, 'solar masses: ', 1,157280, valinit=1)\n", "\n", "radius = plt.axes([0.25, 0.11,0.4, 0.04], facecolor=axcolor)\n", "s_sr = Slider(radius, 'radius: ', 0.1, 5, valinit=1)\n", "\n", "rax = plt.axes([0.75, 0.01, 0.075, 0.14])\n", "check = CheckButtons(rax, ('x=y', 'sun'), (True, True))\n", "\n", "#Set constants note G is divided by c^2 \n", "global M\n", "global G\n", "global Ro\n", "\n", "M=1.989e30\n", "G=6.67408e-11/((3e8)**2)\n", "Ro=696340000\n", "\n", "def e1(sm,sr):\n", " esqrt=np.sqrt((sr*Ro-sm*2*M*G)*(sr*Ro+sm*6*M*G))\n", " e1=(sr*Ro-sm*2*M*G+esqrt)/(sm*4*M*G*sr*Ro)\n", " return e1\n", "\n", "def e2(sr):\n", " e2=1/(sr*Ro)\n", " return e2\n", "\n", "def e3(sm,sr):\n", " esqrt=np.sqrt((sr*Ro-sm*2*M*G)*(sr*Ro+sm*6*M*G))\n", " e3=(sr*Ro-sm*2*M*G-esqrt)/(sm*4*M*G*sr*Ro)\n", " return e3\n", " \n", "def r(phi):\n", " sm = s_sm.val\n", " sr = s_sr.val\n", " \n", " e1v=e1(sm,sr)\n", " e2v=e2(sr)\n", " e3v=e3(sm,sr)\n", "\n", " tau=np.sqrt(sm*M*G*(e1v-e3v)/2)\n", " h = (e2v-e3v)/(e1v-e3v)\n", "\n", " sigma = -tau*np.pi/2 - sps.ellipk(h) \n", " sn,_,_,_=sps.ellipj(tau*phi+sigma, h)\n", " r=e3v+(e2v-e3v)*sn**2\n", " \n", " return r\n", "\n", "def alpha():\n", " #Determine the root of solution\n", " sm = s_sm.val\n", " sr = s_sr.val\n", " \n", " e1v=e1(sm,sr)\n", " e2v=e2(sr)\n", " e3v=e3(sm,sr)\n", "\n", " h = (e2v-e3v)/(e1v-e3v) \n", " phi=np.arcsin(np.sqrt(-e3v/(e2v-e3v))) \n", " angle= sps.ellipkinc(phi, h) \n", "\n", " tau=np.sqrt(sm*M*G*(e1v-e3v)/2)\n", " sigma = -tau*np.pi/2 - sps.ellipk(h) \n", "\n", " alphav = (angle-sigma) /tau-2*np.pi\n", "\n", " return alphav\n", "\n", "#The following function updateplot runs whenever slider changes value\n", "def updateplot(val):\n", " \n", " #Solar masses/radius and magnification alpha\n", " zoom = s_zoom.val\n", " sm = s_sm.val\n", " sr = s_sr.val\n", "\n", " #Find x range for all valid solutions \n", " alphamax=alpha()\n", "\n", " #Set angle range and calculate radius\n", " phi= np.linspace(alphamax/2,np.pi-alphamax/2,500)\n", " phi=phi[int(0.5*(1-zoom)*500):int(0.5*(1+zoom)*500)]\n", " #phi= np.linspace(0,np.pi,500)\n", " \n", " rv=1/r(phi)\n", "\n", " clearsetplot() \n", " \n", " #Check if results a biggen than photon sphere\n", " if sr*Ro>sm*3*G*M:\n", " x=rv*np.cos(phi)\n", " y=rv*np.sin(phi)\n", " \n", " #plot lightpath curve\n", " ax1.plot(x,y)\n", " ax1.grid()\n", " \n", " #Angular Deflection\n", " dx=np.diff(x)\n", " dy=np.diff(y)\n", " dydx=dy/dx\n", " da=np.arctan(dydx)\n", " dam=np.max(da)\n", " ax2.plot(x[:-1],-da)\n", " ax2.grid()\n", " \n", " #Angular Distribution\n", " ddy=np.diff(da)\n", " ddydx=ddy/dx[:-1]\n", " ax3.plot(x[:-2],-ddydx) \n", " ax3.grid() \n", " \n", " plotdatatext(sm,sr,dam)\n", "\n", " #scaling method and draw sun\n", " plotoptions(x,y,-da,-ddydx,sr,sm) \n", " \n", " else:\n", " #Plot Text No solution\n", " plotnosolutiontext()\n", " \n", " fig.canvas.draw_idle()\n", " plt.plot\n", "\n", "def plotdatatext(sm,sr,dam):\n", " e1v=e1(sm,sr)\n", " e2v=e2(sr)\n", " e3v=e3(sm,sr)\n", " \n", " tau=np.sqrt(sm*M*G*(e1v-e3v)/2)\n", " h = (e2v-e3v)/(e1v-e3v)\n", " \n", " text=('$r / r_s$: ' + str('{:.4e}'.format(Ro/(sm*2*G*M))) + '\\n' + \n", " str( '$r / r_p$: ' +'{:.4e}'.format(Ro/(sm*3*G*M))) ) \n", " ax1.text(0.98,0.98,text, horizontalalignment='right',verticalalignment='top', transform=ax1.transAxes, fontsize=10) \n", "\n", " \n", "\n", "\n", " text=(str('{:.6f}'.format(dam)) + ' $[rad]$\\n' +\n", " str('{:.6f}'.format(np.degrees(dam))) + '$^{\\circ}$\\n' +\n", " str('{:.6f}'.format(np.degrees(dam)*3600)) + \"$''$\\n\") \n", " ax2.text(0.02,0.98,text, horizontalalignment='left',verticalalignment='top', transform=ax2.transAxes, fontsize=10)\n", " \n", " text=('$e1$: ' + str('{:.4e}'.format(e1v)) + '\\n' +\n", " str('$e2$: ' + '{:.4e}'.format(e2v)) + '\\n' +\n", " str('$e3$: ' + '{:.4e}'.format(e3v)) + '\\n' +\n", " str('$h^2$: ' + '{:.4e}'.format(h)) ) \n", " ax3.text(0.98,0.98,text, horizontalalignment='right',verticalalignment='top', transform=ax3.transAxes, fontsize=10)\n", "\n", " \n", "def plotnosolutiontext(): \n", " text=('No solution') \n", " ax2.annotate(text,xy=(0.5,0.5), xycoords='axes fraction',ha='center',color='red', fontsize=20)\n", " \n", "#This function set scaling axis and drawes sun\n", "def plotoptions(x,y,dy,ddy,sr,sm):\n", " i=0\n", " for r in check.get_status():\n", " \n", " if i==0:\n", " #Set scaling auto or equal\n", " if r==False:\n", " ax1.axis('auto') \n", " \n", " #Set y scaling plot ax1 \n", " range=np.max(y)-np.min(y)\n", " binsy=np.linspace(np.min(y)-range*2/100,np.max(y)+range*2/100, 5)\n", " ax1.yaxis.set_ticks(binsy) \n", " ax1.set_yticklabels(binsy, rotation=90, va=\"center\") \n", " ax1.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n", " #plt.setp(ax2.get_yticklabels()[-1], visible=False) \n", "\n", " else:\n", " ax1.axis('equal')\n", " \n", " #Set y scaling plot ax1 (equal x=y and 5 bins) \n", " a=ax1.get_yticks().tolist()\n", " ax1.yaxis.set_major_locator(ticker.FixedLocator(a))\n", " ax1.set_yticklabels(a,rotation=90, va=\"center\") \n", " ax1.yaxis.set_major_locator(ticker.MaxNLocator(5)) \n", " ax1.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e')) \n", " \n", " if i==1:\n", " #Draw Sun yes/no\n", " if r==True:\n", " circle=plt.Circle((0,0),Ro, color='orange',label='$r_{sun}$: sun')\n", " ax1.add_patch(circle)\n", " \n", " circle=plt.Circle((0,0),sr*Ro,fill=False, ls='--')\n", " ax1.add_patch(circle)\n", "\n", " circle=plt.Circle((0,0),sm*3*G*M, color='gray',label='$r_p$: photon sphere')\n", " ax1.add_patch(circle)\n", " \n", " circle=plt.Circle((0,0),sm*2*G*M, color='black',label='$r_s$: Schwarzschild radius')\n", " ax1.add_patch(circle) \n", " \n", " ax1.legend(loc=3,fontsize='8',markerscale=0.25,facecolor='none',frameon=False,prop={'size': 8})\n", " \n", " i=i+1 \n", " #Set x axis ticks\n", " range=np.max(x)-np.min(x) \n", " max=np.max(x) \n", " binsx=np.linspace(-max-range*2/100,max+range*2/100, 5) \n", " \n", " ax1.xaxis.set_ticks(binsx) \n", " ax1.set_xticklabels(binsx, rotation=0, ha=\"left\") \n", " ax1.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n", " plt.setp(ax1.get_xticklabels()[-1], visible=False) \n", "\n", " ax2.xaxis.set_ticks(binsx) \n", " ax2.set_xticklabels(binsx, rotation=0, ha=\"left\") \n", " ax2.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n", " plt.setp(ax2.get_xticklabels()[-1], visible=False) \n", " \n", " ax3.xaxis.set_ticks(binsx) \n", " ax3.set_xticklabels(binsx, rotation=0, ha=\"left\") \n", " ax3.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n", " plt.setp(ax3.get_xticklabels()[-1], visible=False) \n", "\n", "\n", " #Set y axis plots ax2 and ax3 \n", " range=np.max(dy)-np.min(dy)\n", " binsy=np.linspace(np.min(dy)-range*2/100,np.max(dy)+range*2/100, 5)\n", " ax2.yaxis.set_ticks(binsy) \n", " ax2.set_yticklabels(binsy, rotation=90, va=\"center\") \n", " ax2.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n", " #plt.setp(ax2.get_yticklabels()[-1], visible=False) \n", "\n", " range=np.max(ddy)-np.min(ddy)\n", " binsy=np.linspace(np.min(ddy)-range*2/100,np.max(ddy)+range*2/100, 5)\n", " ax3.yaxis.set_ticks(binsy) \n", " ax3.set_yticklabels(binsy, rotation=90, va=\"center\") \n", " ax3.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1e'))\n", " #plt.setp(ax3.get_yticklabels()[-1], visible=False) \n", " \n", " \n", " \n", "def clearsetplot():\n", " #plot lightpath curve\n", " \n", " ax1.clear()\n", " ax1.set_title('Light path', fontsize=12, pad=10)\n", " ax1.set_xlabel('x [m]', fontsize=12)\n", " ax1.set_ylabel('y [m]', fontsize=12)\n", " ax1.tick_params(axis='both', which='major', labelsize=8)\n", " \n", " ax2.clear()\n", " ax2.set_title('Angular Deflection', fontsize=12, pad=10)\n", " ax2.set_xlabel('x [m]', fontsize=12)\n", " ax2.set_ylabel('deflection angle [rad]', fontsize=12)\n", " ax2.tick_params(axis='both', which='major', labelsize=8)\n", " \n", " ax3.clear()\n", " ax3.set_title('Angular Distribution', fontsize=12, pad=10)\n", " ax3.set_xlabel('x [m]', fontsize=12)\n", " ax3.set_ylabel('angular change [rad/m]', fontsize=12)\n", " ax3.tick_params(axis='both', which='major', labelsize=8)\n", " \n", "#Display plot n startup.\n", "updateplot(1)\n", "\n", "#The following code checkes if slider changes. This line is looped automatic by pyplot\n", "s_sm.on_changed(updateplot);\n", "s_sr.on_changed(updateplot);\n", "s_zoom.on_changed(updateplot);\n", "check.on_clicked(updateplot);" ] }, { "cell_type": "code", "execution_count": 11, "id": "402b17ba-f09b-483f-9ebf-5480a3030e62", "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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KRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQB2XKRi+pocJeIcpGL6mhwl4jjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/9k=\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('0xngLoNqM1g')" ] }, { "cell_type": "code", "execution_count": null, "id": "bab2372a-dfe9-4c9b-8434-42a57ea2c444", "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.8.10" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "04a87474071e48a09ae13bd21a6d9dde": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_5a4b6230142d483ea3109c4f124a665b", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "076caa1a2eee4b62a80fcc1d14dc57ce": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "095b29e578584867928d445c70c40d2d": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_a4c590be5dcc40b6a0569eee10823759", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "13186ebf73ca4d509de1c0c70c640010": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "19d2819f6e294dc882110001c1236811": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_2c113d2882754782959903f51dc47ce4", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "1faa548b3f6c41e79e308c3f4cb1a681": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "2148f7fc1ee54a57bb7f8f8934eb8c44": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "2c113d2882754782959903f51dc47ce4": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "2d74b4245b5e454bb8e38e790c141bfa": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "407d1906153e4eb999f08e56a34541da": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "449eecf81cce4e92a32f350c97f8a724": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "551805b2255d4143b2b8d941e0893f8b": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "5a03548beb1a4fb7be405029af49d5b9": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "5a4b6230142d483ea3109c4f124a665b": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "68c416ffb48e470d9577335f2a7ec153": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "6c44351932264a97b8c8a9d2667724e3": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "70eefb89f9c7431db23202d6188f8121": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_68c416ffb48e470d9577335f2a7ec153", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "716b44a8037548559371350a9ff99fc2": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_d931b624bee148ad89d2ea2e3108fc11", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "7c9874dabbe3437f8aa1ccc7104ccce8": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "9b5dc96c3220426796655b8c721f9cc5": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "9b9f6565fd0a474dbb135f264ba551e6": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "a4c590be5dcc40b6a0569eee10823759": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "a4d79ae8337042308ccf0ffda151f4e2": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "MPLCanvasModel", "state": { "_cursor": "default", "_figure_label": "Figure 1", "_height": 500, "_image_mode": "diff", "_width": 900, "layout": "IPY_MODEL_076caa1a2eee4b62a80fcc1d14dc57ce", "toolbar": "IPY_MODEL_beb8c9bb165b4baa9a387d1291ef8bc2", "toolbar_position": "left" } }, "a70cdca027ac4881808c9aa2f041342e": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "b09c31148fbc49619a262a8e0ec2647b": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "beb8c9bb165b4baa9a387d1291ef8bc2": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_9b9f6565fd0a474dbb135f264ba551e6", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "c00dd2ac301b42ae9f752a7f1584909e": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_a70cdca027ac4881808c9aa2f041342e", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "c6f4c7b7533c4ab09b69acf9e00d66e8": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_2148f7fc1ee54a57bb7f8f8934eb8c44", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "d25f5ea1f4ed40bca27e72efc3d9a087": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "d6325cfb5eea40c6843169f38b5fdae0": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_5a03548beb1a4fb7be405029af49d5b9", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "d931b624bee148ad89d2ea2e3108fc11": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "d9cc69478c2a4ff7901bb45dee1fc3d0": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "e9381ac511874f3aa07344d7aed7ffcc": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_b09c31148fbc49619a262a8e0ec2647b", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } }, "fb656b5dfe92484597c17ab902e41854": { "model_module": "jupyter-matplotlib", "model_module_version": "^0.9.0", "model_name": "ToolbarModel", "state": { "layout": "IPY_MODEL_7c9874dabbe3437f8aa1ccc7104ccce8", "toolitems": [ [ "Home", "Reset original view", "home", "home" ], [ "Back", "Back to previous view", "arrow-left", "back" ], [ "Forward", "Forward to next view", "arrow-right", "forward" ], [ "Pan", "Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect", "arrows", "pan" ], [ "Zoom", "Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect", "square-o", "zoom" ], [ "Download", "Download plot", "floppy-o", "save_figure" ] ] } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }