我需要帮助弄清楚为什么b)的基态图看起来不正确,以下是完整问题:(我认为将其完整发布可以为我尝试使用的方法提供背景)
(a)考虑一个方形势阱,两个无限高的壁之间的距离等于玻尔半径,即对于所有x在区间[0,]中,()= 0。编写一个函数solve(energy,func),该函数采用参数能量和python函数func。此函数应解决上述情况下的薛定谔ODE,并仅返回边界处()的最终值。 编写一个使用函数solve(energy,func)的脚本,以eV为单位计算电子在该势阱中的基态能量(即将结果除以元电荷值)。对于初始条件,请参见以下技术提示。建议解决()的值1000。 您的计算结果应该是134 eV到135 eV之间的数字。其中一个测试将评估您的solve(energy,func)函数是否为扭曲势阱。 (b)考虑谐振势 ()=02/2,其中0和=10-11 m是常数。将变量的无限范围限制在[-10,10]区间内,0=50 eV。 已知谐振子具有等差能级。通过计算基态和前2个激发态来检查这一点,以您的计算精度为准。 (提示:基态的能量范围在100到200 eV之间。) 为了测试您的结果,编写一个函数result(),它必须返回以eV为单位的计算能量本征值之间的差异作为单个数字。请注意,测试所需的数字已隐藏,并将以±1 eV的精度测试您的结果。 提供绘图标题和适当的轴标签,使用彩色线将所有三个波函数绘制到单个画布上,并提供适当的x和y轴限制,以使所有曲线都可见。 技术提示:这不是薛定谔ODE的初始值问题,而是边界值问题!这需要额外的工作,不同于以前的ODE练习的方法,因此是一个“未见过”的问题。 对于两个问题,采用简单的初始条件,即0= 0或0=-10:(0)=0并且(0)/= 1。使用此作为解决ODE的起点,并变化能量,直到解决方案收敛。任务是评估能量变化,直到满足第二个边界条件(例如在(a)练习中的L),因为由于初始条件的选择,已经满足了第一个边界条件。 这需要对解决方案可能存在的能量间隔进行初始猜测,并使用根查找的计算方法。在scipy中搜索根查找方法,并选择不需要知道导数的方法。在这里,根查找是适当的,因为要满足的边界条件是()= 0。
量子物理学背景下,两个练习的边界条件是在每个电势边界处()=0。这些条件仅在特定的离散能量值处实现,称为能量本征值,其中最小的被称为基态能量。
(a)考虑一个方形势阱,两个无限高的壁之间的距离等于玻尔半径,即对于所有x在区间[0,]中,()= 0。编写一个函数solve(energy,func),该函数采用参数能量和python函数func。此函数应解决上述情况下的薛定谔ODE,并仅返回边界处()的最终值。 编写一个使用函数solve(energy,func)的脚本,以eV为单位计算电子在该势阱中的基态能量(即将结果除以元电荷值)。对于初始条件,请参见以下技术提示。建议解决()的值1000。 您的计算结果应该是134 eV到135 eV之间的数字。其中一个测试将评估您的solve(energy,func)函数是否为扭曲势阱。 (b)考虑谐振势 ()=02/2,其中0和=10-11 m是常数。将变量的无限范围限制在[-10,10]区间内,0=50 eV。 已知谐振子具有等差能级。通过计算基态和前2个激发态来检查这一点,以您的计算精度为准。 (提示:基态的能量范围在100到200 eV之间。) 为了测试您的结果,编写一个函数result(),它必须返回以eV为单位的计算能量本征值之间的差异作为单个数字。请注意,测试所需的数字已隐藏,并将以±1 eV的精度测试您的结果。 提供绘图标题和适当的轴标签,使用彩色线将所有三个波函数绘制到单个画布上,并提供适当的x和y轴限制,以使所有曲线都可见。 技术提示:这不是薛定谔ODE的初始值问题,而是边界值问题!这需要额外的工作,不同于以前的ODE练习的方法,因此是一个“未见过”的问题。 对于两个问题,采用简单的初始条件,即0= 0或0=-10:(0)=0并且(0)/= 1。使用此作为解决ODE的起点,并变化能量,直到解决方案收敛。任务是评估能量变化,直到满足第二个边界条件(例如在(a)练习中的L),因为由于初始条件的选择,已经满足了第一个边界条件。 这需要对解决方案可能存在的能量间隔进行初始猜测,并使用根查找的计算方法。在scipy中搜索根查找方法,并选择不需要知道导数的方法。在这里,根查找是适当的,因为要满足的边界条件是()= 0。
量子物理学背景下,两个练习的边界条件是在每个电势边界处()=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电子伏到200电子伏之间的所有数值,图形的形状都是这样的。我不明白我做错了什么。我已经尽可能地测试了我的代码。
intervalb
而是针对intervalb/a
进行绘图,因为intervalb
已经变化了从-10*a
到10*a
。除以a
值可以得到10米。 - William Miller