我需要帮助弄清楚为什么我的 b) 基态图看起来不对,这里是完整的问题:(我认为完整地发布它会给我尝试使用的方法提供上下文)
量子物理背景下,两个练习的边界条件是每个潜在边界处的𝜓(𝑥)=0。这些仅在特定的离散能量值 𝐸 时满足,称为能量特征值,其中最小的称为基态能量。
m_el = 9.1094e-31 # mass of electron in [kg]
hbar = 1.0546e-34 # Planck's constant over 2 pi [Js]
e_el = 1.6022e-19 # electron charge in [C]
L_bohr = 5.2918e-11 # Bohr radius [m]
V0 = 50*e_el
a = 10**(-11)
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
from scipy.integrate import odeint
from scipy import optimize
def eqn(y, x, energy): #part a)
y0 = y[1]
y1 = -2*m_el*energy*y[0]/hbar**2
return np.array([y0,y1])
x = np.linspace(0,L_bohr,1000)
def solve(energy, func):
p0 = 0
dp0 = 1
init = np.array([p0,dp0])
ysolve = odeint(func, init, x, args=(energy,))
return ysolve[-1,0]
def eigen(energy):
return solve(energy, eqn)
root_ = optimize.toms748(eigen,134*e_el,135*e_el)
root = root_/e_el
print('Ground state infinite square well',root,'eV')
intervalb = np.linspace(-10*a,10*a,1000) #part b)
def heqn(y, x2, energy):
f0 = y[1]
f1 = (2.0 * m_el / hbar**2) * (V0 * (x2**2/a**2) - energy) * y[0]
return np.array([f0,f1])
def solveh(energy, func):
ph0 = 0
dph = 1
init = np.array([ph0,dph])
ysolve = odeint(func, init, intervalb, args=(energy,))
return ysolve
def boundary(energy): #finding the boundary V=E to apply the b.c
f = a*np.sqrt(energy/V0)
index = np.argmin(np.abs(intervalb-f))
return index
def eigen2(energy):
return solveh(energy,heqn)[boundary(energy),0]
groundh_ = optimize.toms748(eigen2,100*e_el,200*e_el)
groundh = groundh_/e_el
print('Ground state of Harmonic Potential:', groundh, 'eV')
plt.suptitle('Harmonic Potential Well')
plt.xlabel('x (a [pm])')
plt.ylabel('Psi(x)')
groundsol = solveh(groundh_,heqn)[:,0]
plt.plot(intervalb/a, groundsol)
对于 100 eV 到 200 eV 之间的所有能量值,图形形状看起来像这样。我不明白我哪里出错了。我已尝试尽可能多地测试我的代码。
最佳答案
您的代码或函数 boundary
的任务文本没有任何理由。如 a) 在边界条件的正确区间端取值,理想情况下这将是无穷远的值。
您的代码中还有两个问题并不是您的错:
scipy
中,并且我无法在可用的源代码中找到,您使用的根查找器 toms748
的调用似乎缓存了该函数,而不是将其替换为较新的。这意味着在 b) 部分中,root finder 调用仍然找到了一个根,但它是 a) 部分中 eigen
的一个根。只需检查函数值即可确认这一点。我建议使用带有初始括号区间的更通用的接口(interface),默认情况下使用 Brent 方法的一个版本。 sol = optimize.root_scalar(lambda s: eigen2(s*e_el), bracket=(100,200))
groundh = sol.root
groundh_ = sol.root*e_el
完美运行(可能使用 Brent 方法作为包围方法的标准),在 138.023972 eV 处找到基态能量并生成波形图
继续搜索,首先是符号变化,然后是根,在
50*m*e_el
到 50*(m+1)*e_el
的间隔中,找到下一个状态为关于python - 模拟量子谐振子/SHM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59389223/