用Numerov方法求解一维薛定谔方程(python)

2024-05-13 22:59:42 发布

您现在位置:Python中文网/ 问答频道 /正文

晚上好。在

我目前正在尝试用Numerov方法求解一维薛定谔方程(与时间无关)。这个方法的推导对我来说很清楚,但是我在实现上有一些问题。我试图在谷歌上寻找解决方案,有一些(like this onethis one),但我真的不明白他们在代码中做什么。。。在

问题是:

通过一些数学运算,你可以得到如下公式: enter image description here 其中enter image description here。首先,我想看看V(x)=1 if -a<x<a的电势。在

因为我没有能量值或Psi的第一个值(这是启动算法所需要的),我只是猜测了一些。。。在

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.constants import hbar

m= 1e-27
E= 0.5

def numerov_step(psi_1,psi_2,k1,k2,k3,h):
    #k1=k_(n-1), k2=k_n, k3=k_(n+1)
    #psi_1 = psi_(n-1) and psi_2=psi_n
    m = 2*(1-5/12. * h**2 * k2**2)*psi_2
    n = (1+1/12.*h**2*k1**2)*psi_1
    o = 1 + 1/12. *h**2 *k3**2
    return (m-n)/o

def numerov(N,x0,xE,a):
    x,dx = np.linspace(x0,xE,N+1,retstep=True)

    def V(x,a):
        if (np.abs(x)<a):
            return 1
        else:
            return 0

    k = np.zeros(N+1)
    for i in range(len(k)):
        k[i] = 2*m*(E-V(x[i],a))/hbar**2

    psi= np.zeros(N+1)
    psi[0]=0
    psi[1]=0.1    

    for j in np.arange(2,N):
        psi[j+1]= numerov_step(psi[j],psi[j+1],k[j-1],k[j],k[j+1],dx)

    return psi

x0 =-10
xE = 10
N =1000

psi=numerov(N,x0,xE,3)

x = np.linspace(x0,xE,N+1)

plt.figure()
plt.plot(x,psi)
plt.show()

因为这个图看起来根本不像波函数,一定有什么地方出了问题,但我要用trobule找出它是什么。。如果有人能帮忙就好了。在

谢谢西藤


Tags: 方法importreturndefnppltk2k1
1条回答
网友
1楼 · 发布于 2024-05-13 22:59:42

不幸的是,我不太记得量子物理,所以我不明白一些细节。但我还是在你的代码中看到了一些错误:

  1. 为什么在numerov_step你方k1k2和{}?

  2. 在你的主周期中

   for j in np.arange(2,N):
      psi[j+1]= numerov_step(psi[j],psi[j+1],k[j-1],k[j],k[j+1],dx)

你把索引搞砸了。看起来这条线应该是

^{pr2}$
  1. 这是我不太明白的部分。从你的first link看动画,这个方程似乎只有对V(x)和{}的某些组合有很好的解决方案,在其他情况下,它很快就会失控。看起来你的V(x)和{}与{}和{}的比例与参考文章有很大不同,这可能是解决方案失控的另一个原因。在

相关问题 更多 >