用Python入门量子力学
文章目录
- 求解薛定谔方程
- 谐振子模型
- 氢原子波函数
求解薛定谔方程
无限深方势阱是量子力学中非常经典的一个模型,其特点是,在势阱内势能为0,而势阱外,势能为无穷大。对应其薛定谔方程及边界条件为
[ − ℏ 2 2 m d 2 d x 2 + V ( x ) ] ψ ( x ) = E ψ ( x ) V ( x ) = { 0 , x ∈ [ 0 , L ] ∞ , others \begin{aligned} &\left[-\frac{\hbar^2}{2m} \frac{\mathrm{d}^2}{\mathrm{d}x^2} + V(x)\right]\psi(x) = E\psi(x)\\ &V(x)=\left\{\begin{aligned} 0,&\quad x\in[0, L]\\ \infty,& \quad \operatorname{others} \end{aligned}\right. \end{aligned} [−2mℏ2dx2d2+V(x)]ψ(x)=Eψ(x)V(x)={0,∞,x∈[0,L]others
其中 ψ ( x ) \psi(x) ψ(x)为波函数, E E E为能量本征值,若只考虑 V ( x ) = 0 V(x)=0 V(x)=0时的情况,则波函数的通解为
ψ ( x ) = C 1 e − 2 m x − E ℏ + C 2 e 2 m x − E ℏ \psi{\left(x \right)} = C_{1} e^{- \frac{\sqrt{2} \sqrt{m} x \sqrt{- E}}{\hbar}} + C_{2} e^{\frac{\sqrt{2} \sqrt{m} x \sqrt{- E}}{\hbar}} ψ(x)=C1e−ℏ2mx−E+C2eℏ2mx−E
代码如下
from sympy import symbols, Function, Eq, diff, dsolve
from sympy import print_latexx = symbols('x') # 空间坐标
L = symbols('L', positive=True) # 势阱宽度
E = symbols('E') # 能量
m = symbols('m', positive=True) # 质量
hbar = symbols('hbar', positive=True) # 普朗克常数
psi = Function('psi') # 波函数
V = symbols('V')V = 0 # 无限深势阱内势能为 0
s = Eq(-hbar**2 / (2 * m) * diff(psi(x), x, 2) + V * psi(x), E * psi(x))res = dsolve(s, psi(x))
print_latex(res)
下面考虑边界条件,令 ψ ( 0 ) = 0 , ψ ( L ) = 0 \psi(0)=0, \psi(L)=0 ψ(0)=0,ψ(L)=0,则薛定谔方程的波函数和本征能量分别为
ψ n ( x ) = C 1 sin ( π n x L ) , E n = π 2 ℏ 2 n 2 2 L 2 m \psi_n(x)=C_1 \sin{\left(\frac{\pi n x}{L} \right)}, \quad E_n=\frac{\pi^{2} \hbar^{2} n^{2}}{2 L^{2} m} ψn(x)=C1sin(Lπnx),En=2L2mπ2ℏ2n2
由于波函数 ψ n ( x ) \psi_n(x) ψn(x)受到本征值的影响,sympy在计算时,会默认选择一个最简单的数值,若不事先设置 E n E_n En,则最终得到的 ψ ( x ) \psi(x) ψ(x)将为0,故而其代码为
from sympy import pin = symbols('n', integer=True, positive=True)
hbar = symbols('hbar', positive=True)
E = n**2 * pi**2 * hbar**2 / (2 * m * L**2)schrodinger_eq = Eq(-hbar**2 / (2 * m) * psi(x).diff(x, 2), E * psi(x))res = dsolve(schrodinger_eq, psi(x), ics={psi(0): 0, psi(L): 0})
print_latex(res)
谐振子模型
一维谐振子用经典的眼光来看就是可以沿着一个方向振动的弹簧,其薛定谔方程为
− ℏ 2 2 m d 2 ψ ( x ) d x 2 + 1 2 m ω 2 x 2 ψ ( x ) = E ψ ( x ) -\frac{\hbar^2}{2m} \frac{\mathrm{d}^2 \psi(x)}{\mathrm{d}x^2} + \frac{1}{2}m\omega^2x^2\psi(x) = E\psi(x) −2mℏ2dx2d2ψ(x)+21mω2x2ψ(x)=Eψ(x)
其哈密顿算符可表示为
H ^ = − ℏ 2 2 m d 2 d x 2 + 1 2 m ω 2 x 2 \hat H=-\frac{\hbar^2}{2m}\frac{\text d^2}{\text dx^2}+\frac{1}{2}m\omega^2x^2 H^=−2mℏ2dx2d2+21mω2x2
其本征态的能级可表示为
E n = ( n + 1 2 ) ℏ ω E_n=(n+\frac{1}{2})\hbar\omega En=(n+21)ℏω
当 n = 0 n=0 n=0时,仍有 1 2 ℏ ω \frac{1}{2}\hbar\omega 21ℏω,体现了量子力学与经典力学的差别。
由于谐振子模型的通解中存在埃尔米特多项式,故而无法简单地通过dsolve推导出来,但sympy中提供了【qho_1d】模块,封装了谐振子的一些特性
from sympy import print_latex
from sympy.abc import m, x, omega
from sympy.physics.qho_1d import E_n, psi_n
print_latex(E_n(x, omega))
print_latex(psi_n(0, x, m, omega))
其中,【E_n】函数即为一维谐振子能量。【psi_n】则返回波函数 ψ n \psi_n ψn,其输入四个参数分别是 n n n,坐标 x x x,质量 m m m以及角频率 ω \omega ω,示例代码的输出结果为
m ω 4 e − m ω x 2 2 ℏ ℏ 4 π 4 \frac{\sqrt[4]{m \omega} e^{- \frac{m \omega x^{2}}{2 \hbar}}}{\sqrt[4]{\hbar} \sqrt[4]{\pi}} 4ℏ4π4mωe−2ℏmωx2
sympy中海提供了三维谐振子模块【sho】,其中【E_nl】函数可返回谐振子能量,【R_nl】函数可返回谐振子波函数,这两个函数的前两个参数均为 n , l n,l n,l表示主量子数和轨道量子数,示例如下
from sympy.physics.sho import R_nl, E_nl
from sympy.abc import r, nu, l
print_latex(E_nl(0, 0, 1))
print_latex(R_nl(0, 0, 1, r))
氢原子波函数
作为量子力学第一个成功的应用,氢原子的数学本质,是薛定谔方程在中心立场中的解,薛定谔方程和中心力场的势能 V ( r ) V(r) V(r)表示如下
− ℏ 2 2 μ ∇ 2 ψ + V ( r ) ψ = E ψ , V ( r ) = − e 2 r π ϵ 0 r -\frac{\hbar^2}{2\mu}\nabla^2\psi+V(r)\psi=E\psi,\quad V(r)=-\frac{e^2}{r\pi\epsilon_0r} −2μℏ2∇2ψ+V(r)ψ=Eψ,V(r)=−rπϵ0re2
使用球坐标,将Laplace算子展开
− ℏ 2 2 μ r 2 { ∂ ∂ r ( r 2 ∂ ∂ r ) + 1 sin 2 θ [ sin θ ∂ ∂ θ ( sin θ ∂ ∂ θ ) + ∂ 2 ∂ ϕ 2 ] } ψ − e 2 r π ϵ 0 r = E ψ -\frac{\hbar^2}{2\mu r^2}\{\frac{\partial}{\partial r}(r^2\frac{\partial}{\partial r})+\frac{1}{\sin^2\theta}[\sin\theta\frac{\partial}{\partial\theta}(\sin\theta\frac{\partial}{\partial\theta})+\frac{\partial^2}{\partial\phi^2}]\}\psi-\frac{e^2}{r\pi\epsilon_0r}=E\psi −2μr2ℏ2{∂r∂(r2∂r∂)+sin2θ1[sinθ∂θ∂(sinθ∂θ∂)+∂ϕ2∂2]}ψ−rπϵ0re2=Eψ
其解为径向函数和球谐函数的乘积
ψ ( r , θ , ϕ ) = R n l ( r ) Y l m ( θ , ϕ ) \psi(r,\theta,\phi)=R_{nl}(r)Y_{lm}(\theta,\phi) ψ(r,θ,ϕ)=Rnl(r)Ylm(θ,ϕ)
Y l m Y_{lm} Ylm是球谐函数,其定义为
Y n m ( θ , ϕ ) = 2 n + 1 4 π ( n − m ) ! ( n + m ) ! e i m θ P n m ( cos ϕ ) Y^m_n(\theta,\phi)=\sqrt{\frac{2n+1}{4\pi}\frac{(n-m)!}{(n+m)!}}e^{im\theta}P^m_n(\cos\phi) Ynm(θ,ϕ)=4π2n+1(n+m)!(n−m)!eimθPnm(cosϕ)
其中 P n m P^m_n Pnm是连带勒让德多项式,定义为
P n m = ( − 1 ) m ( 1 − x 2 ) m / 2 d m d x m P n ( x ) P n ( x ) = ∑ k = 0 ∞ ( − n ) k ( n + 1 ) k ( k ! ) 2 ( 1 + x 2 ) k n k = { 1 k = 0 n ( n + 1 ) ⋯ ( n + k − 1 ) k > 1 P^m_n=(-1)^m(1-x^2)^{m/2}\frac{\text d^m}{\text dx^m}P_n(x)\\ P_n(x)=\sum^\infty_{k=0}\frac{(-n)_k(n+1)_k}{(k!)^2}(\frac{1+x}{2})^k\\ n_k=\left\{\begin{aligned} &1\quad&k=0\\ &n(n+1)\cdots(n+k-1)&\quad k>1 \end{aligned}\right. Pnm=(−1)m(1−x2)m/2dxmdmPn(x)Pn(x)=k=0∑∞(k!)2(−n)k(n+1)k(21+x)knk={1n(n+1)⋯(n+k−1)k=0k>1
R n l R_{nl} Rnl可以继续展开为
R n l = ( 2 n a ) 3 ( n − l − 1 ) ! 2 n [ ( n + l ) ! ] 3 e − r n a ( 2 r n a ) l L n − l − 1 2 l + 1 ( 2 r n a ) R_{nl}=\sqrt{(\frac{2}{na})^3\frac{(n-l-1)!}{2n[(n+l)!]^3}}e^{-\frac{r}{na}}(\frac{2r}{na})^lL^{2l+1}_{n-l-1}(\frac{2r}{na}) Rnl=(na2)32n[(n+l)!]3(n−l−1)!e−nar(na2r)lLn−l−12l+1(na2r)
在上面两个公式中,主要出现了两个特殊函数,在scipy中均有实现。其中 Y l m Y_{lm} Ylm是球谐函数,对应【sph_harm】函数; L n − l − 1 2 l + 1 L^{2l+1}_{n-l-1} Ln−l−12l+1是拉盖尔多项式,对应【assoc_laguerre】函数。
刨除这两个令人费解的符号之后,波函数表达式中就只剩下一些数值变量了,其中 a a a是玻尔半径0.53 A ˚ \text{\r{A}} A˚,在写代码是带入0.53,表示整个模型以埃米为单位。
n , l , m n, l, m n,l,m则为不同本征函数的本征值,一般在物理学中被称为量子数
- n n n 主量子数,为正整数,表示电子能级或其所处壳层。
- l l l 角量子数,取值范围是 0 ∼ n − 1 0\sim n-1 0∼n−1的整数,决定电子云的形状
- m m m 磁量子数,取值范围是 − l ∼ l -l\sim l −l∼l,代表电子在特定亚壳层中的具体轨道。
【hydrogen】模块提供了与氢原子相关的函数
E_nl(n)
返回Hatree能量E_nl_dirac(n, l)
相对论修正后的Hatree能量。R_nl(n, l, r)
氢原子的径向波函数Psi_nlm(n, l, m, r, phi, theta)
氢原子波函数 ∣ n , l , m > |n,l,m\big> ∣n,l,m⟩
这三个函数都有一个默认参数Z=1
,表示原子个数;r, phi, theta
为空间坐标。
E_nl_dirac
另有两个变量,spin_up
为自旋,默认为True
,表示 ⟨ ↑ ∣ \bra{\uparrow} ⟨↑∣,False
即为 ∣ ↓ ⟩ \ket{\downarrow} ∣↓⟩。c
为原子单位制下的光速,默认为精细结构常数的倒数 137.036 137.036 137.036。原子物理中常用Hatree作为能量单位, 1 E h = 4.3597 × 1 0 − 18 J 1E_h=4.3597\times10^{-18}J 1Eh=4.3597×10−18J,约等于基态氢原子的电子势能。
通过下面的代码,可以打印出不同能级下电子的波函数
from sympy.physics.hydrogen import Psi_nlmr, phi, theta = symbols("r phi theta", positive=True)
Z=Symbol("Z", positive=True, integer=True, nonzero=True)print("|$nlm$|$\|\psi_{nlm}\\big>$|")
print("|:-|:-|")
for n in range(6):for l in range(n):for m in range(-l,l+1):md = latex(Psi_nlm(n,l,m,r,phi,theta,Z))print(f"|$\\psi_{{{n},{l},{m}}}$|${md}$", )
部分常见波函数的电子云如图所示。