Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import matplotlib.animation as animation
  4.  
  5. N = 5
  6. L = 1 # hva er L?????
  7. V0_list = np.linspace(1.6E-19,5E-19,num = 10)
  8. V0 = V0_list[9]
  9. print(V0_list)
  10. E_list = np.array([9.11213087913E-31,9.11172385727E-31,9.11144738959E-31,9.11124734388E-31,9.11109588069E-31,9.11097721845E-31,
  11. 9.11088174309E-31,9.11080326334E-31,9.110737612E-31,9.11068188132E-31])
  12. E_list_right = (6.24150913E18)*np.sort(E_list)
  13. T_list = np.array([0.775063189968,0.796204285259,0.824575490579,0.85665191579,0.889358375188,0.920129681519,
  14. 0.947395154217,0.968861578924,0.984525146436,0.992670126337])
  15. T_analytic = np.zeros(len(V0_list))
  16.  
  17.  
  18.  
  19. #Potensialprofilen for en enkelt barriere
  20. left = [0.0]*100*N
  21. barrier = [V0]*N
  22. right = [0.0]*100*N
  23. V = np.asarray(left+barrier+right)
  24. # Tabellen V har nå 201*N elementer
  25.  
  26.  
  27. #Med Ntot punkter langs x-aksen, far vi Ntot ortonormerte egenfunksjoner
  28. #og energiegenverdier ved ̊a bruke numpyfunksjonen linalg.eigh,
  29. #pa samme mate som i eksempelprogrammene som ligger tilgjengelig
  30.  
  31. #m=masse (SI)
  32. hbar = 1.05E-34
  33. m = 9.11E-31 #elektron
  34. #dx = skrittlengde
  35. dx = 1.0E-10
  36.  
  37. E0 = V0 + (np.pi)**2*V0/16
  38. p0 = np.sqrt(2*m*E0)
  39. k0 = p0/hbar
  40. Ntot = len(V)
  41.  
  42. #distance = 101*N*dx
  43. #middle_length = 10
  44.  
  45. #V = potensialet i boksen (V=0)
  46. #d = liste med diagonalelementer i Hamiltonmatrisen H
  47. d = [v + hbar**2/(m*dx**2) for v in V]
  48. #e = verdi til ikke-diagonale elementer i H, dvs H(i,i+-1)
  49. e = - hbar**2/(2*m*dx**2)
  50.  
  51.  
  52.  
  53. #Initialisering av matrisen H: Legger inn verdi 0 i samtlige elementer
  54. H = [[0]*(Ntot) for n in range(Ntot)]
  55. for i in range(Ntot):
  56. for j in range(Ntot):
  57. if i==j:
  58. H[i][j]=d[i]
  59. if abs(i-j)==1:
  60. H[i][j]=e
  61.  
  62. H = np.asarray(H)
  63. energy,psi_matrix = np.linalg.eigh(H)
  64.  
  65. #Siden matrisen H er tridiagonal, finnes det helt sikkert mer e↵ektive funksjoner enn eigh.
  66.  
  67. # En gaussformet starttilstand med senterposisjon midt i “venstre kontakt”
  68. #og romlig utstrekning 1/10 av venstre kontakt
  69. #kan for eksempel lages omtrent slik (se Oppgave 7 i øvingene):
  70.  
  71. #k0= 10 # k=skarpt definert bolgetall, endre denne verdien
  72. x = np.asarray([dx*n for n in range(Ntot)])
  73. x0 = 50*N*dx
  74. sigma = 10*N*dx
  75. Delta_x = sigma
  76. Delta_p = hbar/(2.0*sigma)
  77.  
  78. normfactor = (2*np.pi*sigma**2)**(-0.25)
  79. gaussinit = np.exp(-(x-x0)**2/(4*sigma**2))
  80. planewavefactor = np.exp(1j*k0*x)
  81. Psi0 = normfactor*gaussinit*planewavefactor
  82.  
  83.  
  84. #Hvis for eksempel N = 10, har barrieren en tykkelse p ̊a 1.0 nm,
  85. #mens de to kontaktene her har en bredde 100 nm.
  86. #Planbølgefaktoren exp(ik0x) sørger for at bølgepakken har middelimpuls p0 = h ̄k0
  87. #og middelhastighet v0 = p0/m = h ̄k0/m.
  88.  
  89.  
  90.  
  91.  
  92.  
  93. #Integral cj, regnes ut slik:
  94. psi_matrix_complex = psi_matrix*(1.0 + 0.0j)
  95. c = np.zeros(Ntot, dtype = np.complex128)
  96. for n in range(Ntot):
  97. c[n] = np.vdot(psi_matrix_complex[:,n],Psi0)
  98.  
  99. #Forbereder figur, akser, og plotteelementet som skal animeres:
  100. fig = plt.figure('Wave packet animation' , figsize=(16,8))
  101. ymax = 10**8 #Ma justeres etter behov, eller beregnes
  102. ax = plt.axes(xlim=(0, Ntot*dx), ylim=(0, ymax))
  103. line, = ax.plot([], [], lw=1)
  104. Vmax = np.argmax(V) #riktig def???
  105.  
  106. #Initialisering; plotter bakgrunnen:
  107. def init():
  108. line.set_data([], [])
  109. return line,
  110.  
  111.  
  112. #Setter tidssteget, justeres etter behov, eller beregnes
  113. tidssteg = 3.0E-15
  114.  
  115.  
  116. def findRho():
  117. i = 13
  118. tidssteg = 3.0E-15
  119. t = i*tidssteg
  120. Psi_t = np.zeros(Ntot,dtype=np.complex128)
  121. for n in range(Ntot):
  122. Psi_t = Psi_t + c[n]*psi_matrix_complex[:,n]*np.exp(-1j*energy[n]*t/hbar)
  123.  
  124. rho_t = np.abs(Psi_t)**2
  125. return rho_t
  126.  
  127.  
  128. mid_index = Ntot//2
  129. E = hbar**2*(k0**2 + 1./(4.*sigma**2))/(2*E0)# Calculate energy expectation value [MeV]
  130. rho_pluss = findRho()[mid_index:]
  131. x_pluss = x[mid_index:]# Slice away list for x < 0
  132. p_midlere = hbar*k0
  133. I = np.trapz(rho_pluss,None,dx) # Integrate with trapezoidal method
  134. print("E: ", E)
  135. print("T: ",I)
  136.  
  137. #Animasjonsfunksjon; kalles sekvensielt:
  138. def animate(i):
  139. t = i*tidssteg
  140. #Beregner Psi(x,t)
  141. Psi_t = np.zeros(Ntot,dtype=np.complex128)
  142. for n in range(Ntot):
  143. Psi_t = Psi_t + c[n]*psi_matrix_complex[:,n]*np.exp(-1j*energy[n]*t/hbar)
  144.  
  145. rho_t = np.abs(Psi_t)**2
  146. line.set_data(x, rho_t)
  147. return line,
  148.  
  149. def T(V0,E):
  150. E0 = V0 + (np.pi)**2*V0/16
  151. #T = 1. / (1. + (V0**2/(4.*(V0-E)*E))*np.sinh(np.sqrt(2.*E0*(V0-E))/hbar*L)**2)
  152. T = (1 + (np.sinh(k0*L*np.sqrt(np.abs(E/V0-1)))**2)/(4*(E/V0)*(E/V0-1)))**(-1)
  153. return T
  154.  
  155.  
  156. plt.plot(x,V*ymax/Vmax)
  157. plt.xlabel('$x$ (m)',fontsize=20)
  158. #Kaller animatoren.
  159. #frames=antall bilder, dvs maxverdi for i;
  160. #interval=varighet av hvert bilde i animasjonen m ̊alt i millisekunder
  161. anim = animation.FuncAnimation(fig, animate, init_func=init, repeat=False,
  162. frames=14, interval=1, blit=True)
  163.  
  164.  
  165. '''for e in range(len(V0_list)):
  166. T_analytic[e] = T(V0_list[e],np.sort(E_list)[e])'''
  167.  
  168. fig2 = plt.figure("Transmission probability", figsize=(7,5),)
  169. plt.plot(E_list_right,T_list, 'ro')
  170. plt.xlabel('$E$ [eV]', fontsize=14)
  171. plt.ylabel('$T(E)$', fontsize = 14)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement