Python 解决Shrodinger';谐波势阱中粒子的s方程
您好(这是我第一次在stack overflow中发布),我正在尝试使用shooter方法计算谐波势中粒子的前3个能级 该代码改编自马克·纽曼的《计算物理》脚本,该脚本计算了盒子中粒子的基态 这里是链接 这是我的代码Python 解决Shrodinger';谐波势阱中粒子的s方程,python,numpy,Python,Numpy,您好(这是我第一次在stack overflow中发布),我正在尝试使用shooter方法计算谐波势中粒子的前3个能级 该代码改编自马克·纽曼的《计算物理》脚本,该脚本计算了盒子中粒子的基态 这里是链接 这是我的代码 import numpy as np from scipy.constants import m_e,hbar,elementary_charge #define constants vo = 50 a = 1e-11 #define limits of integrati
import numpy as np
from scipy.constants import m_e,hbar,elementary_charge
#define constants
vo = 50
a = 1e-11
#define limits of integration for adaptive runge-kutta method
xi = -10*a
xf = 10*a
N = 1000
dx = (xf-xi)/N
def V(x):#define harmonic potential well
return vo*((x**2)/(a**2))
def f(r,x,E): #schrodinger's equation
psi = r[0]
phi = r[1]
fpsi = psi
fphi = (2*m_e/(hbar**2))*(V(x)-E)*psi
return np.array([fpsi,fphi],float)
def solve(E): #calculates wave function for an energy E
psi = 0.0
phi = 1.0
r = np.array([psi,phi],float)
for x in np.arange(xi,xf,dx): #adaptive runge-kutta method
k1 = dx*f(r,x,E)
k2 = dx*f(r+0.5*k1,x+0.5*dx,E)
k3 = dx*f(r+0.5*k2,x+0.5*dx,E)
k4 = dx*f(r+k3,x+dx,E)
r += (k1+2*k2+2*k3+k4)/6
return r[0]
#finds the energy using secant method
E1 = 0.0
E2 = elementary_charge
psi2 = solve(E1)
target = elementary_charge/1000
while abs(E1-E2)>target:
psi1,psi2 = psi2,solve(E2)
E1,E2 = E2,E2-psi2*(E2-E1)/(psi2-psi1)
print (E2/elementary_charge)
当运行时,我得到这个错误
RuntimeWarning: invalid value encountered in double_scalars
E1,E2 = E2,E2-psi2*(E2-E1)/(psi2-psi1)
我认为这意味着psi2和psi1靠得太近了,但我不太确定如何解决这个问题!关于值之间的距离太近,您是对的。您的代码返回一个
nan
。这是因为除以零
我建议使用修正系数。分母中类似于
max(delta,(psi2-psi1))
的值,其中delta
仍然可以是一个非常小的值,但它将防止被零除
可能重复感谢!我不再得到错误,但现在我只得到了1.0,在尝试了一些之后,似乎我为E2输入的任何初始值都是输出,max(delta,(psi2-psi1))
停止E2值的更新?您现在使用的增量值是什么?我尝试使用非常小的数字,如1e-11,但经过调查,似乎无论我将E设置为什么,解算(E)函数都会输出相同的结果,我尝试使用1到10000之间的数字,结果相同,因此,在while循环中,psi1和psi2都将使用solve(E)函数的新结果进行更新,但结果是相同的,因此E2最终为无穷大,E1为nan,循环停止。我建议在for循环中打印出从k1到k4以及r的所有值,以查看值是否如预期的那样。然后从那里调试。