Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解决Shrodinger';谐波势阱中粒子的s方程_Python_Numpy - Fatal编程技术网

Python 解决Shrodinger';谐波势阱中粒子的s方程

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

您好(这是我第一次在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 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的所有值,以查看值是否如预期的那样。然后从那里调试。