我需要帮助弄清楚为什么我的 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)

python - 模拟量子谐振子/SHM-LMLPHP

对于 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 处找到基态能量并生成波形图

    python - 模拟量子谐振子/SHM-LMLPHP

    继续搜索,首先是符号变化,然后是根,在 50*m*e_el50*(m+1)*e_el 的间隔中,找到下一个状态为

    python - 模拟量子谐振子/SHM-LMLPHP

    关于python - 模拟量子谐振子/SHM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59389223/

    10-10 05:24