我试图解出在区间[0,L]上无限势阱V=0的TISE。这个练习告诉我们波函数的值和它在0处的导数分别是0,1。这允许我们使用sci . integration .odeint函数来解决给定能量值的问题。 现在的任务是在进一步的边界条件下找到能量特征值,在L处的波函数为0,使用python上的根查找函数。我做了一些研究,只能找到所谓的“射击方法”,我不知道如何实施。另外,我遇到了求解BVP scipy函数,但是我似乎不能理解这个函数的第二个输入到底是什么(边界条件残差)
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]
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
def eqn(y, x, energy): #array of first order ODE's
y0 = y[1]
y1 = -2*m_el*energy*y[0]/hbar**2
return np.array([y0,y1])
def solve(energy, func): #use of odeint
p0 = 0
dp0 = 1
x = np.linspace(0,L_bohr,1000)
init = np.array([p0,dp0])
ysolve = odeint(func, init, x, args=(energy,))
return ysolve[-1,0]
这里的方法是将eqn作为func输入求解(能量,func)。L_bohr是这个问题中的L值。我们试图用一些scipy方法数值计算出能量特征值 问题来源StackOverflow 地址:/questions/59379143/how-to-solve-a-simple-boundary-value-problem-for-tise-on-python
对于scipy中的所有其他求解器,参数(x,y)的顺序,甚至在odeint中,都可以通过提供选项tfirst=True来使用这个顺序。因此改变
def eqn(x, y, energy): #array of first order ODE's
y0, y1 = y
y2 = -2*m_el*energy*y0/hbar**2
return [y1,y2]
对于BVP求解器,你必须把能量参数当成 额外的零导数的状态分量,因此增加了第三个槽 在边界条件下。Scipy的bvp_solve允许将其作为参数, 所以你得到
def bc(y0, yL, E):
return [ y0[0], y0[1]-1, yL[0] ]
接下来构造一个接近可疑基态的初始状态,并调用求解器
x0 = np.linspace(0,L_bohr,6);
y0 = [ x0*(1-x0/L_bohr), 1-2*x0/L_bohr ]
E0 = 134*e_el
sol = solve_bvp(eqn, bc, x0, y0, p=[E0])
print(sol.message, " E=", sol.p[0]/e_el," eV")
然后制作情节
x = np.linspace(0,L_bohr,1000)
plt.plot(x/L_bohr, sol.sol(x)[0]/L_bohr,'-+', ms=1)
plt.grid()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。