Atkins Dynamic graph: 7D.9

7d_9_penetration_1000
import math
import cmath
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib import figure
from matplotlib.patches import Rectangle
import matplotlib.patches as mpatches
from ipywidgets import interact
from ipywidgets import interact, fixed, FloatSlider, HBox, VBox, Layout, Output, Label, Box, GridspecLayout, GridBox
import ipywidgets as widgets
from matplotlib import ticker



def k1(m,E):
  k1=(2*m*E)**0.5
  return k1
def k3(m,E):
  k3=(2*m*E)**0.5
  return k3
def k2(m,E,V):
  k2=(2*m*(V-E))**0.5
  return k2
def A2(m,E,W,V): 
  A2=(0.5+(cmath.exp(2*W*k2(m,E,V))*(k2(m,E,V)-complex(0.0,1.0)*k3(m,E)))/(2*(k2(m,E,V)+complex(0.0,1.0)*k3(m,E)))+(k2(m,E,V)*(k2(m,E,V)-complex(0.0,1.0)*k3(m,E)))/(2*complex(0.0,1.0)*k1(m,E)*(k2(m,E,V)+complex(0.0,1.0)*k3(m,E)))-(k2(m,E,V)*cmath.exp(2*k2(m,E,V)*W)*(k2(m,E,V)-complex(0.0,1.0)*k3(m,E)))/(2*complex(0.0,1.0)*k1(m,E)*(k2(m,E,V)+complex(0.0,1.0)*k3(m,E))))**(-1)
  return A2
def B2(m,E,W,V): 
  B2=A2(m,E,W,V)*((k2(m,E,V)+complex(0.0,1.0)*k3(m,E))/(cmath.exp(2*k2(m,E,V)*W)*(k2(m,E,V)-complex(0.0,1.0)*k3(m,E))))**(-1)
  return B2
def A3(m,E,W,V): 
  A3=cmath.exp(-complex(0.0,1.0)*k3(m,E)*W)*(A2(m,E,W,V)*cmath.exp(k2(m,E,V)*W)+B2(m,E,W,V)*cmath.exp(-k2(m,E,V)*W))
  return A3
def B1(m,E,W,V): 
  B1=1-(1/(complex(0.0,1.0)*k1(m,E)))*(A2(m,E,W,V)*k2(m,E,V)-B2(m,E,W,V)*k2(m,E,V))
  return B1
px=1.0/96 #pixel in inches

xmin=-1
xmax=2
xrange=xmax-xmin
xgrid=1
x_ticks = np.arange(xmin,xmax+xgrid,xgrid)
show_x_ticks=False
show_x_tick_labels=False
ymin=-3
ymax=3
yrange=ymax-ymin
ygrid=1
show_y_ticks=False
show_y_tick_labels=False
y_ticks = np.arange(ymin, ymax+ygrid, ygrid)
show_grid=False
npts=300


def pvplot(m,E,W,V):
  x1 = np.linspace(xmin, 0, npts)
  x2 = np.linspace(0, W, npts)
  x3 = np.linspace(W, xmax, npts)
  psi1=np.linspace(-100, 100, npts)
  psi2=np.linspace(-100, 100, npts)
  psi3=np.linspace(-100, 100, npts)

  for i in range (0,npts):
    psi1[i] = (cmath.exp(complex(0.0,1.0)*k1(m,E)*x1[i])+B1(m,E,W,V)*cmath.exp(complex(0.0,-1.0)*k1(m,E)*x1[i])).real+E/20
  for i in range (0,npts):
    psi2[i]=(A2(m,E,W,V)*math.exp(k2(m,E,V)*x2[i])+B2(m,E,W,V)*math.exp(-k2(m,E,V)*x2[i])).real+E/20
  for i in range (0,npts):
    psi3[i]=(A3(m,E,W,V)*cmath.exp(complex(0,1)*k3(m,E)*x3[i])).real+E/20

  fig = plt.figure(figsize=(750*px,550*px),dpi=96) 
  ax = fig.add_subplot(111)
  plt.plot(x1,psi1,linewidth=2,linestyle='-',color='maroon',clip_on=True)
  plt.plot([xmin,xmax],[0+E/20,0+E/20],linewidth=1,linestyle='-',color='black',clip_on=True)
  plt.plot(x2,psi2,linewidth=2,linestyle='-',color='red',clip_on=True)
  plt.plot(x3,psi3,linewidth=2,linestyle='-',color='orangered',clip_on=True)
  plt.text(0,0-3.35,'0',fontsize='x-large',horizontalalignment='center')
  plt.text(W,0-3.35,'$W$',fontsize='x-large',horizontalalignment='center')
  plt.plot([0,0],[-3.3,-2.9],linewidth=1,linestyle='-',color='black',clip_on=True)
  plt.plot([W,W],[-3.3,-2.9],linewidth=1,linestyle='-',color='black',clip_on=True)

#  plt.axis([xmin,xmax,ymin,ymax])
  plt.annotate(r'', xy=(-0.05, 0+E/20),  xycoords='data',xytext=(-0.05, -3.02), textcoords='data',horizontalalignment='center', verticalalignment='top',fontsize=14,arrowprops=dict(facecolor='black', shrink=20,width=.5,headlength=7,headwidth=5))
  plt.text(-0.12,-1,'$E$',fontsize='x-large',horizontalalignment='center')
  plt.annotate(r'', xy=(W/2, -3+6*V/30),  xycoords='data',xytext=(W/2, -3.02), textcoords='data',horizontalalignment='center', verticalalignment='top',fontsize=14,arrowprops=dict(facecolor='black', shrink=20,width=.5,headlength=7,headwidth=5))
  ax.add_patch(Rectangle((0, -3), W, 6*V/30,color="powderblue"))
  plt.text(W/2+0.075,-1,'$V_\mathrm{0}$',fontsize='x-large',horizontalalignment='center')
  plt.axis([xmin,xmax,ymin,ymax])
  plt.ylabel(r'Wavefunction $\psi$',fontsize='x-large')
  plt.xlabel(r'$x$',fontsize='x-large',labelpad=20)
  plt.xticks(x_ticks)
  plt.yticks(y_ticks)
  if show_grid: plt.grid(True,color='blue',linewidth=.25)
  if not show_x_tick_labels: ax.set_xticklabels([])
  if not show_y_tick_labels: ax.set_yticklabels([])
  plt.tick_params(axis='x',which='both',bottom = show_x_ticks, top= False)
  plt.tick_params(axis='y',which='both',left = show_y_ticks, right= False)
#  plt.axis([xmin,xmax,ymin,ymax])
  
  plt.show()

m=FloatSlider(description='',min=5, max=15, step=0.5, value=8.5,continuous_update=False,
orientation='vertical',readout=False,
style=dict(handle_color='gray'),
layout=dict(height='300px',width='30px',margin='30px 0px 0px 0px'))

E=FloatSlider(description='',min=0.5, max=13, step=0.1, value=10.5,continuous_update=False,
orientation='vertical',readout=False,
style=dict(handle_color='gray'),
layout=dict(height='300px',width='30px',margin='30px 0px 0px 0px'))

W=FloatSlider(description='',min=0.25, max=0.5, step=0.05, value=0.25,continuous_update=False,
orientation='vertical',readout=False,
style=dict(handle_color='gray'),
layout=dict(height='300px',width='30px',margin='30px 0px 0px 0px'))

V=FloatSlider(description='',min=20, max=30, step=0.05, value=0.1,continuous_update=False,
orientation='vertical',readout=False,
style=dict(handle_color='gray'),
layout=dict(height='300px',width='30px',margin='30px 0px 0px 0px'))


out = widgets.interactive_output(pvplot, {'m': m, 'E': E, 'W':W, 'V':V})

m_label=widgets.HTMLMath(value='<i>m<i>',layout=dict(margin='50px 0px 0px 0px'))
E_label=widgets.HTMLMath(value='<i>E<i>',layout=dict(margin='50px 0px 0px 0px'))
W_label=widgets.HTMLMath(value='<i>W<i>',layout=dict(margin='50px 0px 0px 0px'))
V_label=widgets.HTMLMath(value='<i>V<i><sub>0<sub>',layout=dict(margin='50px 0px 0px 0px'))

m_control=VBox([m_label,m],layout=Layout(align_items='center',width='50px'))
E_control=VBox([E_label,E],layout=Layout(align_items='center',width='50px'))
W_control=VBox([W_label,W],layout=Layout(align_items='center',width='50px'))
V_control=VBox([V_label,V],layout=Layout(align_items='center',width='50px'))

GridBox(children=[HBox([m_control,E_control,W_control,V_control]),out],
        layout=Layout(
            width='1000px',
            grid_template_columns='250px 750px',
            grid_template_rows='auto',
            grid_gap='0px 0px'))

Back to top