华中师范大学 hahakity

在网上看到一个使用 Matlab 教量子力学的文章,很有意思。这里用 python 语言实现一遍, 让同学们对量子力学,对偏微分方程的差分近似解法有一个更直观的理解。

学习目标:理解量子力学的波函数表示与矩阵表示的等价性

学会用向量表示函数,用矩阵表示算符(一阶微分,二阶微分)

学会数值求解任意势阱下定态薛定谔方程的能级与波函数

预备知识:微分的差分近似

量子力学基础(薛定谔方程)

波函数的向量表示

在用 python 画图时,我们一般先将区间离散化,计算出离散坐标上的函数值,然后画折线图。比如对于函数

, 使用如下代码画图,

# np.linspace 将区间 [-2, 2] 离散化为 100 个坐标点

x = np.linspace(-2, 2, 100)

# 计算 100 个坐标点上的函数值 f

f = np.sin(x) / x

plt.plot(x, f)

将波函数表示为离散坐标点上的实数或复数,写为列向量

变得非常容易理解。

回忆微分的有限差分近似,对于一阶微分,

对于二阶微分,

对区间 [a, b] 所有离散坐标上的 f(x) 微分和二阶微分可以矩阵化,

算符的矩阵表示

当 f(x) 用列向量

表示时,就可以用矩阵来表示微分算子。

因此波动力学与矩阵力学统一。

一阶微分

可以用微分算子矩阵 D 点乘

计算。

二阶微分

可以用微分算子矩阵 D 从左边连续作用两次到

上,也可以使用差分格式直接构造拉普拉斯矩阵,由

计算。

对于随便给定的函数

, 可以看到上述有限差分矩阵作用在离散的

上的结果与解析解非常一致。

解定态薛定谔方程

的任务转化为求哈密顿矩阵 H 的本征值 E 和本征向量

注意在量子力学里,动能项里的动量 p 换成了微分算符,进一步用 Laplacian 矩阵表示,势能 U(x) 在区间离散化后,填充在矩阵的对角元上。

如果是多粒子系统,比如考虑多个电子两两之间的库伦相互作用,则两粒子势能

会带来非对角元。

定态薛定谔方程的数值解

这里我用 python 把一维定态薛定谔方程的数值解封装成一个类,后面研究不同势能下的薛定谔方程比较方便。

class Schrodinger:

def __init__(self, potential_func,

mass = 1, hbar=1,

xmin=-5, xmax=5, ninterval=1000):

self.x = np.linspace(xmin, xmax, ninterval)

self.U = np.diag(potential_func(self.x), 0)

self.Lap = self.laplacian(ninterval)

self.H = - hbar**2 / (2*mass) * self.Lap + self.U

self.eigE, self.eigV = self.eig_solve()

def laplacian(self, N):

'''构造二阶微分算子:Laplacian'''

dx = self.x[1] - self.x[0]

return (-2 * np.diag(np.ones((N), np.float32), 0)

+ np.diag(np.ones((N-1), np.float32), 1)

+ np.diag(np.ones((N-1), np.float32), -1))/(dx**2)

def eig_solve(self):

'''解哈密顿矩阵的本征值,本征向量;并对本征向量排序'''

w, v = np.linalg.eig(self.H)

idx_sorted = np.argsort(w)

return w[idx_sorted], v[:, idx_sorted]

def wave_func(self, n=0):

return self.eigV[:, n]

def eigen_value(self, n=0):

return self.eigE[n]

def check_eigen(self, n=7):

'''check wheter H|psi> = E |psi> '''

with plt.style.context(['science', 'ieee']):

HPsi = np.dot(self.H, self.eigV[:, n])

EPsi = self.eigE[n] * self.eigV[:, n]

plt.plot(self.x, HPsi, label=r'$H|\psi_{%s} \rangle$'%n)

plt.plot(self.x, EPsi, '-.', label=r'$E |\psi_{%s} \rangle$'%n)

plt.legend(loc='upper center')

plt.xlabel(r'$x$')

plt.ylim(EPsi.min(), EPsi.max() * 1.6)

def plot_density(self, n=7):

with plt.style.context(['science', 'ieee']):

rho = self.eigV[:, n] * self.eigV[:, n]

plt.plot(self.x, rho)

plt.title(r'$E_{%s}=%.2f$'%(n, self.eigE[n]))

plt.ylabel(r'$\rho_{%s}(x)=\psi_{%s}^*(x)\psi_{%s}(x)$'%(n, n, n))

plt.xlabel(r'$x$')

def plot_potential(self):

with plt.style.context(['science', 'ieee']):

plt.plot(self.x, np.diag(self.U))

plt.ylabel(r'potential')

plt.xlabel(r'$x$')

谐振子势

# 定义谐振子势

def harmonic_potential(x, k=100):

return 0.5 * k * x**2

# 创建谐振子势下的薛定谔方程

schro_harmonic = Schrodinger(harmonic_potential)

从上面例子可以看到,封装的比较完整,对任意 1 维势调用很简单。先来可视化谐振子势能,

schro_harmonic.plot_potential()

schro_harmonic.check_eigen(n=1)

再用上面这条命令检查一下薛定谔方程的解是否准确,具体来说就是本征方程

是否满足。

还可以看看粒子在谐振子势阱中的分布概率密度,

# 这里随便选了一个能级 n = 9

schro_harmonic.plot_density(n=9)

如果亲自尝试一下,你会发现在上面这个谐振子势下,数值解的能级与解析解非常接近

对比解析解,

其中

,

解析解中,n=0 时,

。 n = 1, 2, 3... 时,

的 3 倍,5倍,7倍... 。

Woods Saxon 势能

在核物理领域,原子核中一大团核子所产生的势能接近于 Woods Saxon 函数形式。这里看看Woods Saxon 势阱中一个核子的能级分布。势阱函数形式为,

def woods_saxon_potential(x, R0=6.2, surface_thickness=0.5):

sigma = surface_thickness

return -1 / (1 + np.exp((np.abs(x) - R0)/sigma))

用这个势阱构造薛定谔方程,

ws_schro = Schrodinger(woods_saxon_potential)

先画一下势阱的样子,

ws_schro.plot_potential()

再画一下 Woods Saxon 势阱中核子的波函数和能级,

对于基态 n=0

ws_schro.plot_density(n=0)

第 n=9 激发态

与谐振子势阱的结果有相当大差别。

双势阱

def double_well(x, xmax=5, N=100):

w = xmax / N

a = 3 * w

return -100 * (np.heaviside(x + w - a, 0.5) - np.heaviside(x - w - a, 0.5)

+np.heaviside(x + w + a, 0.5) - np.heaviside(x - w + a, 0.5))

dw = lambda x: double_well(x, xmax=5, N=1000)

dw_shro = Schrodinger(double_well)

双势阱中前几个能级下粒子的概率密度分布,

dw_shro.plot_density(n=0)

dw_shro.plot_density(n=1)

dw_shro.plot_density(n=2)

dw_shro.plot_density(n=4)

双势阱中粒子概率密度分布的随时间演化

下面这个问题考虑一个粒子被捕获在上例所示的有限深方势阱中,初态为基态与第一激发态的叠加态,观察粒子的概率密度分布随时间的演化。初态为,

这里画图看一下基态

,第一激发态

和两者叠加态

的波函数,

psi0 = dw_shro.wave_func(n=0)

psi1 = dw_shro.wave_func(n=1)

psi = 1 / np.sqrt(2) * (psi0 + psi1)

with plt.style.context(['science', 'ieee']):

plt.plot(dw_shro.x, psi0, 'r--', label=r'$|\Psi_{E_0} \rangle$')

plt.plot(dw_shro.x, psi1, 'b:', label=r'$|\Psi_{E_1} \rangle$')

plt.plot(dw_shro.x, psi, 'k-', label=r'$|\Psi(t=0)\rangle = (|\Psi_{E_0}\rangle + |\Psi_{E_1}\rangle) / \sqrt{2}$')

plt.legend(loc='best')

plt.xlabel(r'$x$')

plt.ylim(-0.3, 0.3)

plt.xlim(-2, 2)

如下图所示,初始时刻基态与第一激发态在右边势阱处相消,导致叠加态的波函数在左边势阱处有峰值结构。后面演示此峰如何随时间在两个势阱间振荡。

叠加态波函数的时间演化直接用时间演化算符,

def psit(t, hbar=1):

'''基态与第一激发态的叠加态波函数,随时演化'''

psi0 = dw_shro.wave_func(n=0)

psi1 = dw_shro.wave_func(n=1)

E0 = dw_shro.eigen_value(0)

E1 = dw_shro.eigen_value(1)

return 1/np.sqrt(2) * (psi0 * np.exp(-1j * E0 * t/hbar)

+ psi1 * np.exp(-1j * E1 * t/hbar))

注意我们用 Dirac

列向量表示所有离散空间点上的波函数值。用

表示给定

点上的波函数值。波函数的平方表示概率密度,对于给定的离散时空点

函数项的值从 1 变到负 1 ,

点的概率密度从

变到

下面是概率密度在两个势阱间震荡间振荡的动画,知乎视频​www.zhihu.com

# 动画代码

%matplotlib notebook

from matplotlib.animation import FuncAnimation

class UpdateDist:

def __init__(self, ax, x):

self.success = 0

self.line, = ax.plot([], [], 'k-')

self.x = x

self.ax = ax

# Set up plot parameters

self.ax.set_xlim(-0.6, 0.6)

self.ax.set_ylim(-0.02, 0.1)

self.ax.grid(True)

def __call__(self, i):

time = i * 0.01

psi = psit(t = time)

density = np.real(np.conjugate(psi) * psi)

self.line.set_data(self.x, density)

return self.line,

# 画缩放了的双势阱

potential = double_well(dw_shro.x) * 1.0E-4

fig, ax = plt.subplots()

ax.plot(dw_shro.x, potential, ':')

ax.set_xlabel(r'$x$')

ud = UpdateDist(ax, x=dw_shro.x)

anim = FuncAnimation(fig, ud, frames=1000, interval=100, blit=True)

#anim.save('../htmls/images/double_well_evolution.mp4')

plt.show()

总结:

使用微分的有限差分近似可以将波函数表示为向量,将微分算子化为矩阵,将定态薛定谔方程的求解化为哈密顿矩阵的本征值,本征向量求解问题。实现了 python 版本的一维薛定谔方程数值解的封装,方便对自定义的势阱计算能级与波函数。

参考文献:

注:画图用到了 matplotlib 库,要得到本文画图风格,需要安装 SciencePlots 库。

pip install SciencePlots

如果出错,开启 no-latex 选项。

with plt.style.context(["science", "ieee", "no-latex"]):

python求解薛定谔方程_用python学量子力学(1)相关推荐

  1. 如何用python求解方程组_用Python的Numpy求解线性方程组

    在本文中,您将看到如何使用Python的Numpy库解决线性方程组. 什么是线性方程组? 维基百科将线性方程组定义为:在数学中,线性方程组(或线性系统)是两个或多个涉及同一组变量的线性方程的集合. 解 ...

  2. python求解运输问题_【Python实现】运输问题的表上作业法:利用伏格尔 (Vogel) 法寻找初始基可行解...

    #运输问题求解:使用Vogel逼近法寻找初始基本可行解 import numpy as np import pandas as pd import copy #定义函数TP_vogel,用来实现Vog ...

  3. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  4. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  5. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  6. python如何求解微分方程_用Python数值求解偏微分方程

    1 引言 微分方程是描述一个系统的状态随时间和空间演化的最基本的数学工具之一,其在物理.经济.工程.社会等各方面都有及其重要的应用.然而,只有很少的微分方程可以解析求解,尤其对于偏微分方程,能解析求解 ...

  7. python 微积分 函数_用Python学微积分(2)---复合函数

    函数的复合(Composition) 定义:设函数y=f(u)和u=g(x)u=g(x),则函数y=f[g(x)]称为由y=f(u)和u=g(x)复合而成的复合函数,其中函数y=f(u)常常称为外函数 ...

  8. python代码物理_利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...

  9. python 方程组 整数解_用Python语言求解线性整数方程组

    我在寻找一种用Python求解线性方程组的方法. 特别是,我在寻找大于所有零的最小整数向量,并解出给定的方程. 例如,我有以下等式: 想解决 .在 在这种情况下,求解该方程的最小整数向量为 .在 但是 ...

最新文章

  1. 推荐几个超NB的技术公号!
  2. win10装linux分区格式化硬盘,windows10 下硬盘安装centos7.0 – MBR硬盘分区格式
  3. LeetCode Decode String(栈和递归)
  4. 最小生成树(Prim、Kruskal)算法,秒懂!
  5. 软件测试 给视频添加字幕功能,巧用百度OCR文字识别技术,实现视频字幕识别...
  6. 公办低分二本_河南最适合“二本”考生的30所公办大学,录取分低,考生不要错过...
  7. 学python买什么书-想学python看哪些书
  8. 【转】Python自动化测试 (一) Eclipse+Pydev 搭建开发环境
  9. 科研院所推进6S管理的难点及推进手段分析
  10. topcoder srm 440 div1
  11. Dijkstra算法C++实现
  12. 结构体定义 typedef struct LNode 用法说明
  13. 制作u盘winpe启动盘_u盘启动盘制作工具 纯净+好用,原来不止是 微pe
  14. tp6 多关联withJoin查询
  15. 笔记本计算机左侧插,笔记本电脑插上耳机还有外音的解决方法
  16. 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem F. Judging Time Prediction 优先队列...
  17. Juniper-SRX-基于域控认证的用户防火墙
  18. 微信公众号账号登录功能实现
  19. 在校生创手机维修租赁平台,服务5万学生月流水45万
  20. 编码规范重要性_沟通比您的编码技能更重要

热门文章

  1. iptables规则备份和恢复
  2. 软件测试-黑盒测试2
  3. VUE生成图片(自定义文字)
  4. 矩阵与向量的乘积的两种理解
  5. 小米面试官:说说Spring源码里面的Bean的生命周期!
  6. 查询Oracle死锁
  7. oracle子查询 select语句,select查询之三:子查询
  8. java实现每日给女友微信发送早安等微信信息
  9. go数据库-标准库-框架
  10. windows下,OpenGL播放NV12