Crank-Nicolson 算法解一维含时薛定谔方程(Matlab)

                     

贡献者: addis

预备知识 1 薛定谔方程(单粒子一维)

  1本文使用原子单位制。薛定谔方程为

\begin{equation} -\frac12 \frac{\partial^{2}{\psi}}{\partial{x}^{2}} + V\psi = \mathrm{i} \frac{\partial \psi}{\partial t} ~. \end{equation}
传播子作用于波函数为
\begin{equation} \psi(x,t+\Delta t) = \exp\left(- \mathrm{i} H \Delta t\right) \psi(x,t)~. \end{equation}
用 Crank-Nicolson 或 Caley scheme2 得到的结果是
\begin{equation} \left(1+\frac{ \mathrm{i} }{2} \boldsymbol{\mathbf{H}} _{n+1}\Delta t \right) \boldsymbol{\mathbf{\psi}} _{n+1} = \left(1-\frac{ \mathrm{i} }{2} \boldsymbol{\mathbf{H}} _n\Delta t \right) \boldsymbol{\mathbf{\psi}} _n~. \end{equation}
其中 $ \boldsymbol{\mathbf{\psi}} _n$ 是时刻 $t_n$ 的波函数列矢量(已知),$ \boldsymbol{\mathbf{\psi}} _{n+1}$ 为时刻 $t_{n+1}$ 的波函数列矢量(未知),$ \boldsymbol{\mathbf{H}} _n$ 是 $t_n$ 时刻的哈密顿矩阵。

   但事实上,还可以继续减少计算量。若近似认为3 $ \boldsymbol{\mathbf{H}} _{n+1}\approx \boldsymbol{\mathbf{H}} _{n}$,将式 3 整理后得

\begin{equation} \left(\frac12 + \frac{ \mathrm{i} }{4} \boldsymbol{\mathbf{H}} _n\Delta t \right) \left( \boldsymbol{\mathbf{\psi}} _{n+1}+ \boldsymbol{\mathbf{\psi}} _n \right) = \boldsymbol{\mathbf{\psi}} _n~. \end{equation}
解这个方程,再减去 $ \boldsymbol{\mathbf{\psi}} _n$ 即可。

1. 等间距网格

   对于等间距坐标网格 $x_1,x_2,\dots$,可以用差分法(式 5 )计算二阶导数,表示为矩阵有

\begin{equation} \boldsymbol{\mathbf{D}} _2 = \frac{1}{\Delta x^2} \begin{pmatrix}-2 & 1 & 0 & 0 & \dots\\ 1 & -2 & 1 & 0 & \dots\\ 0 & 1 & -2 & 1 & \dots\\ 0 & 0 & 1 & -2 & \dots\\ \vdots & \vdots & \vdots & \vdots & \ddots\end{pmatrix} ~. \end{equation}
那么 $ \boldsymbol{\mathbf{H}} _n = - \boldsymbol{\mathbf{D}} _2/(2m) + \boldsymbol{\mathbf{V}} _n$,其中 $ \boldsymbol{\mathbf{V}} _n$ 是对角矩阵,第 $i$ 个对角元为 $V(x_i, t_n)$。现在,就可以代入式 3 式 4 求解了。

2. 虚时间法

预备知识 2 虚时间法求基态波函数

   虚时间法用于求解势阱中的基态,使用虚时间后,式 3 式 4 分别变为

\begin{equation} \left(1+\frac12 \boldsymbol{\mathbf{H}} \Delta t \right) \boldsymbol{\mathbf{\psi}} _{n+1} = \left(1-\frac12 \boldsymbol{\mathbf{H}} \Delta t \right) \boldsymbol{\mathbf{\psi}} _n~, \end{equation}
\begin{equation} \left(\frac12 + \frac14 \boldsymbol{\mathbf{H}} \Delta t \right) \left( \boldsymbol{\mathbf{\psi}} _{n+1}+ \boldsymbol{\mathbf{\psi}} _n \right) = \boldsymbol{\mathbf{\psi}} _n~. \end{equation}

3. 代码

预备知识 3 Matlab 的稀疏矩阵

   Matlab 代码如下,使用式 4 ,以及 Matlab 的稀疏矩阵。势能函数可以在 V_fun 中设置,我们以方势垒为例,所有参数和 “高斯波包的方势垒散射数值计算(Matlab)” 相同。不同的是,由于我们使用迪利克雷边界条件,波函数到达边界后会发生全反射。要避免反射,可以用开放边界条件(未完成)以及吸收势能(未完成)。

图
图 1:运行结果

代码 1:TDSE_cn1d.m
% Crank-Nicolson 法解一维薛定谔方程
% 等间距网格,稀疏矩阵

function TDSE_cn1d
% ==== 参数设置 ======
xmin = -80; xmax = 80; Nx = 1000; % x 网格
tmin = 0; tmax = 20; Nt = 400; % 时间网格
Nplot = 10; % 画图步数
ax = [xmin, xmax, -0.5, 0.5];
% 高斯波包
x0 = -17; t0 = 0; m = 1; % 高斯波包的初始时间
p0 = 4; % 初始动量
sig_x = 2; % 初始位置, 波包宽度
% 方势垒 [-L,L], 高 V0
L = 4; V0 = 4;
V = @(x,t) V_fun(x,t,L,V0); % 势能函数
% ===================
close all;
psi_gs = @(x) 1/(2*pi*sig_x^2)^0.25/sqrt(1 + 1i*t0/(2*m*sig_x^2))...
      *exp(-(x-x0-p0*t0/m).^2/(2*sig_x)^2/(1 + 1i*t0/(2*m*sig_x^2)))...
      .*exp(1i*p0*(x-p0*t0/(2*m)));
x = linspace(xmin, xmax, Nx); dx = (xmax-xmin)/(Nx-1);
t = linspace(tmin, tmax, Nt); dt = (tmax-tmin)/(Nt-1);
psi = psi_gs(x).';
% 准备稀疏矩阵 [对角线, 上对角线, 下对角线]
ind1 = [1:Nx, 1:Nx-1, 2:Nx]; % 行标
ind2 = [1:Nx, 2:Nx, 1:Nx-1]; % 列标
% 动能矩阵非零元
T = -1/(2*m)*[-2*ones(1,Nx), ones(1,2*Nx-2)]/dx^2;
A = (1i*dt/4)*T; % 对角元稍后更新
figure; plot(x, real(psi)); hold on;
plot(x, imag(psi));
for it = 1:Nt
    % 更新对角元
    A(1:Nx) = 0.5 + (1i*dt/4)*(T(1:Nx) + V(x, t(it)+dt/2));
    Asp = sparse(ind1, ind2, A, Nx, Nx);
    tmp = Asp \ psi;
    % err = norm(Asp*tmp - psi);
    psi = tmp - psi;
    if mod(it, Nplot) == 0
        clf;
        plot(x, real(psi)); hold on;
        plot(x, imag(psi));
        plot([xmin, -L, -L, L, L, xmax], [0, 0, 0.4, 0.4, 0, 0], 'k');
        axis(ax);
        pause(0.2);
    end
end
end

% 势能函数:方势垒
function ret = V_fun(x,~,L,V0)
ret = zeros(size(x));
ret(x > -L & x < L) = V0;
end


1. ^ 参考 [65]
2. ^ 二者是一回事,见 [65] 19.2 节。
3. ^ 或者更公平地,把式 4 中 $ \boldsymbol{\mathbf{H}} _n$ 改为 $ \boldsymbol{\mathbf{H}} _{n+1/2}$,即 $(t_n+t_{n+1})/2$ 时的哈密顿矩阵。


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利