[关闭]
@amaoaaaa 2018-01-01T02:06:23.000000Z 字数 4592 阅读 100

Quantunm Mechanics —— How to Solving Methods of Schrodinger Equation?

St: 吴文雅
NO.201530102016


摘要

薛定谔方程是量子力学的基本方程之一,不同形式的薛定谔方程,具有精确的解析解的屈指可数,因此计算数值解的方法尤为重要。本文尝试了包括“shooting method、matching method、variational Monte Carlo”三种不同的求解方法,并对各种方法进行了具体的计算和评价。

关键词

定态薛定谔方程、含时薛定谔方程、shooting method、matching method、variational Monte Carlo

第一部分:定态薛定谔方程

1. ONE DIMENSION: SHOOTING AND MATCHING METHODS

1.1 Shooting method:

计算原理

1) 对于定态薛定谔方程,如果将E视为已知参量,则方程为二阶ODE,使用Jacobi方法进行迭代计算可以得到方程数值解
2)当势场有确定宇称时,方程的解也会有确定的宇称,这为我们提供了边界条件:(a)当方程解为奇宇称时,;(b)当方程解为偶宇称时,
3) 波函数乘以任意常数仍为薛定谔方程的解,因此可以认为偶宇称的波函数

计算公式

分隔一维空间,间隔为 ,令,得到计算式:

此外,偶宇称的解满足:;奇宇称的解满足:

计算结果

偶宇称:
奇宇称:

1.2 matching method:

计算原理

针对Lennard-Jones势场,分头一维直线从左往右迭代和从右往左迭代的结果,然后对参数(能级E)进行调整使两边的迭代结果在交叉点处满足斜率相等,则这个math的结果自然地符薛定谔方程

计算公式

迭代公式与shooting方法相同,迭代的初始条件设置为:

计算结果

在计算时发现在Lennard-Jones势场对matching method开始迭代的位置要求十分严格,主要是由L-J势场在趋于0位置的发散特性导致的,因此在计算结果中,"matching"的结果并不是很好。
调整能量之前:
调整能量之后:

2.VARIATIONAL MONTE CARLO (VMC)

说明

一维薛定谔方程数值结果可以用绝大多数可以用以上两种方法求解;或者当势场具有很好的对称性时,也可以将方程化为一维问题求解(例如氢原子问题)。但对于绝大多数的二维三维薛定谔方程,shooting & matching methods 无法设置一维以上的边界条件进而失效。解决此种问题的一般方法是将定态薛定谔方程写成矩阵本征的方程形式进行求解。利用变分Monte Carlo的方法可以计算出多维薛定谔方程。

计算原理

1)确定一个“试探解”,计算其相应的能量;
2)随机选取一个位置,令该位置相应的,此时得到了一个新的,计算其相应的以及
3)取一个0到1之间的随机数,比较的大小,如果,则保留相应的作为下一个step的,如果,则舍弃掉相应的

计算公式

1)建立一个矩阵,间隔为,令,设定初始的试探解


2)

计算结果

为了计算方便我们首先用VMC方法计算了一维谐振势的波函数,通过计算得到了以下几个结论:
针对一维简谐振子,我最初的想法是能让任意的初始解最终都能解到相应的一维谐振子解,起码是基态,即所有的计算中能量最低的那一个(因为变分原理本身对于量子化的激发态求解就有局域性的问题。)
我们知道一维谐振子的基态波函数为高斯分布的形式,在求解时发现,蒙特卡洛的方法存在着太多问题。
1)计算结果对初始的试探解很敏感,所以是试探解形式的选择尤为重要,这就要求我们对特定的势场其相应的解有大体的了解。一方面初始解不能太多一般,理论上最终总会算出一个最优解,但实际如果用最平庸的初始解(台形),循环上万次甚至十万次都无法计算出;同时又初始解不能太过于接近真实解;在一些资料上看到初始解直接就用的高斯,仅仅是改变,一开始解的算下来结果的确很好,但我觉得这在物理上是不全面的,在物理上的含义代表“经典禁区”,这只不过是在寻找合适的以用来匹配相应的k,并且我的确是没算出一个和参考资料上接近的曲线。

参考资料上的曲线

2)虽然蒙特卡洛方法需要大量迭代计算,但在较为简单的蒙卡算法下(判据仅仅是判断所得到的新的能量是否比以前更小),大量的迭代都是无效的!单纯的增加循环次数并不能得到解,由于随机性,经常是循环了十万次却根本没有新的波函数出现,因为算下来全都是R值比先前更大一些,得到的波函数也没什么意义;
这张图虽然已经计算过但可以看出这一次计算效率为0

一张失败的蒙卡结果

3)我考虑了一下改进(实际上是两种改进方案,一个是改进判据,另一个是每次随机抽取多个点进行改变而非只选取一个点,但第一种是加一个方差的判据,这种代码比较难从源代码上修改,而且估计加上方差的判据可能计算的效率会更低,所以只做了第二种改进)。实际的效果并不是很好。 (PS:后来和做Ising 模型的同学讨论了一下,本来想在判据那里借用ising 的e指数,也就是波尔兹曼因子作为判据,但后来发现这两者其实一样的。)

第二部分:含时薛定谔方程

  1. DIRECT SOLUTIONS

计算原理&计算公式

一维含时薛定谔方程: 如果与时间无关,可以单独先解时间相关的部分,初步得到解的形式为:

经过时间段,波函数变为

e指数近似可以写为

带回波函数得到
并带入的具体形式,得到
,其中为实部,为虚部,带回上式可以得到实部和虚部的公式为:
将初始条件设置为高斯波包

计算结果

时间循环1个单位

时间循环10个单位

时间循环30个单位

时间循环100个单位

参考资料

附录

代码

shooting method
matching method
VMC
time-dependent
以下是我写的VMC的代码的一些改进代码。。。还是想请老师看看问题,虽然还是很low,但我觉得还是比较符合梯度下降法(或者蒙特卡洛吧,蒙卡条件太苛刻了,所以改成了最速下降,但结果还是不怎么样),再给真心有蛮多问题还需要解决。。。

这里重新设置了一下试探解

  1. psi=np.zeros( (1,31) )
  2. for j in range (31):
  3. if j<13:
  4. psi[0][j]=0
  5. elif 13<=j<15:
  6. psi[0][j]=0.5*j-6.5
  7. elif 15<=j<17:
  8. psi[0][j]=-0.5*j+8.5
  9. elif j>17:
  10. psi[0][j]=0

改变每次随机选取的点的个数为多个

  1. def update(psi):
  2. psi_u=np.zeros( (1,31) )
  3. i in range(1,30)
  4. m=random.sample(i,15)
  5. n=random.choice([-1.,1.])
  6. #delta_psi=random.random()*0.01
  7. delta_psi=0.01
  8. #k=float(n)
  9. for j in range (31):
  10. if j in mm:
  11. psi_u[0][j]=psi[0][j]-n*delta_psi
  12. else:
  13. psi_u[0][j]=psi[0][j]
  14. return psi_u
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注