2016-11-10 10 views
2

Schrodinger方程式、y軸上の私のプロットのスケーリングを変更して、理論計算と私たちの差を約0.01%の差異にする必要があります。そのプロットでは、私はスケールが違いを示すのに十分小さいわけではありません。ここに私のプロジェクトのコードがあります。シュレディンガー方程式のスケーリングを変更してください

# -*- coding: utf-8 -*- 
""" 
Created on Sat Nov 05 12:25:14 2016 

@author: produce 
""" 
from __future__ import print_function 
import numpy as np 
import matplotlib.pyplot as plt 

# 
c = .5/500 # c = delta x 
x = np.arange(0, .5, c) # creates array of argument values from 0 to 1/2 in increments 
#      of delta x = c 
psi = np.zeros(len(x)) # creates array of zeros which will be replaced by y values 

k = 20 # starting energy for calculator of E 
ans = 0 # The value of k, when we have y as between 0.004 and 0 
ansPsi = 0 
diff = 0.001 
increment = 0.0001 
done = False 
while 1: 
    # print k 
    psi[0] = 1 
    psi[1] = 1 
    for i in range(0, len(x) - 2): 
     psi[i + 2] = psi[i + 1] + (psi[i + 1] - psi[i]) - 2 * k * c * c * psi[i] 
    # plt.plot(x,psi) 
    # print(x,psi) 
    # print (psi[i+2]--->) 
    if (float(psi[i + 2]) < 0.004 and float(psi[i + 2]) > 0): 
     ans = k 
     ansPsi = psi[i + 2] 
     # print ("NOW ENTERING INNER LOOP") 
     while 1: # would be an infinite loop, but have a break statement 
      # k = k - 0.00001 
      k = k + increment 
      for i in range(0, len(x) - 2): 
       psi[i + 2] = psi[i + 1] + (psi[i + 1] - psi[i]) - 2 * k * c * c * psi[i] 
      plt.plot(x, psi, 'r') #red solid line 
      if (psi[i + 2] > ansPsi or psi[i + 2] < 0): 
       done = True 
       break 
      else: 
       ansPsi = psi[i + 2] 
       ans = k 
       # print (k, psi[i+2]) 

    if done: 
     break 
    k = k - diff 

print("Value of k:", ans, "Value of Y:", ansPsi) # prints our answer for energy and psi[1/2] 
k1 = 10 # 1st Higher Energy Value 
k2 = 7 # 2nd Higher Energy Value 
k3 = 3 # 1st Lower Energy Value 
k4 = 1 # 2nd Lower Energy Value 
kt = np.pi * np.pi * .5 # theoretical value 

psi1 = np.zeros(len(x)) 
psi1[0] = 1 
psi1[1] = 1 
for i in range(0, len(x) - 2): 
    psi1[i + 2] = psi1[i + 1] + (psi1[i + 1] - psi1[i]) - 2 * k1 * c * c * psi1[i] 


# psi2 = np.zeros(len(x)) 
# psi2[0] = 1 
# psi2[1] = 1 
# for i in range (0,len(x)-2): 
# psi2[i+2] = psi2[i+1] + (psi2[i+1] - psi2[i]) - 2*k2*c*c*psi2[i] 
# plt.plot(x,psi2,'k') 

# psi3 = np.zeros(len(x)) 
# psi3[0] = 1 
# psi3[1] = 1 
# for i in range (0,len(x)-2): 
# psi3[i+2] = psi3[i+1] + (psi3[i+1] - psi3[i]) - 2*k3*c*c*psi3[i] 
# plt.plot(x,psi3,'p') 

psi4 = np.zeros(len(x)) 
psi4[0] = 1 
psi4[1] = 1 
for i in range(0, len(x) - 2): 
    psi4[i + 2] = psi4[i + 1] + (psi4[i + 1] - psi4[i]) - 2 * k4 * c * c * psi4[i] 

plt.plot(x, psi, 'r-', label='Corrected Energy') 

psiT = np.zeros(len(x)) 
psiT[0] = 1 
psiT[1] = 1 
for i in range(0, len(x) - 2): 
    psiT[i + 2] = psiT[i + 1] + (psiT[i + 1] - psiT[i]) - 2 * kt * c * c * psiT[i] 
plt.plot(x, psiT, 'b-', label='Theoretical Energy') 
plt.ylabel("Value of Psi") 
plt.xlabel("X value from 0 to 0.5") 
plt.title("Schrodingers equation for varying inital energy") 
plt.legend(loc=3) 
plt.yscale() 
plt.show() 

答えて

0

plt.yscale()に引数が必要なので、共有したコードに失敗します。私は単にそのラインアウトをコメントしました。

理論的なエネルギー曲線と補正されたエネルギー曲線がごくわずかであるため、y軸の縮尺を変更することはできません。は、xの全範囲(つまり0〜0.5) 。代わりに、おそらくあなたは2つの曲線の違いをプロットする必要がありますか?

plt.plot(x, psiT-psi) 
plt.title("Size of Correction for Varying Initial Energy") 
plt.ylabel(r"$\Delta$E") 
plt.xlabel("X value from 0 to 0.5") 
plt.show() 

また、xとyのラベルにいくつかのユニットを付けるのもいいかもしれません。 :)

関連する問題