欢迎光临散文网 会员登陆 & 注册

粒子在2维势能中的波函数演化模拟

2022-10-25 01:07 作者:湛蓝色的彼岸花  | 我要投稿

2维势能中的波包演化相关的matlab代码。

渣代码,轻喷。

哈密顿量和时间演化相关部分

L = 20; % Interval Length

N = 500; % 设置 N*N 格点. 有大动量时格点不能太稀疏

% x = linspace(-L/2,L/2-L/(N),N)'; % Coordinate vector, 周期性边界时

x = linspace(-L/2,L/2,N)'; % Coordinate vector,硬边界时

dx = x(2) - x(1); % Coordinate step

% operators in 1D:

e = ones(N,1); 

% Dif1 = spdiags([-e 0*e e -e e],[-1 0 1 N-1 -N+1],N,N)/(2*dx);% 有周期性边界

% Lap1 = spdiags([e -2*e e e e],[-1 0 1 N-1 -N+1],N,N)/dx^2;

Dif1 = spdiags([-e 0*e e],[-1 0 1],N,N)/(2*dx);% 硬边界

Lap1 = spdiags([e -2*e e],[-1 0 1],N,N)/dx^2; 

I1 = speye(N,N);

% operators in 2D:

Lap2 = kron(Lap1,I1)+kron(I1,Lap1); % 2D Laplacian

% PDx = kron(Dif1,I1); % partial diff of x

% PDy = kron(I1,Dif1);% partial diff of y

% xy = spdiags(x,0,N,N);

% X = kron(xy,I1); % x position operator

% Y = kron(I1,xy); % y position operator

% R2 = kron(xy.^2,I1)+kron(I1,xy.^2); % R^2=x^2+y^2


% 设置势能

% 可按需调整

V=100000; 

a = 0.3;

U = V*kron(...

    spdiags((x.^2).*exp(-(x).^2/a^2),0,N,N),... % f(x)

    spdiags((x.^2).*exp(-(x).^2/a^2),0,N,N)... %虽然记号是x,实际上应当被理解为 g(y)

); % 得到 V*f(x)*g(y)形式的势能。也可以多取几个这样的势能在相加

% figure

% surf(x,x,reshape(diag(U),N,N)); % 查看势能


% 边界附近的虚势能,使得运动到边界的波衰减

% 不一定必要

% 不一定对任意动量都适用,有时需要调整参数

G = 20;

l = 1.2;

Ui = -1i*G*(...

    kron(...

    spdiags(exp(-(x+0.5*L)/l)+exp(-(-x+0.5*L)/l),0,N,N),I1)+...

    kron(...

    I1,spdiags(exp(-(x+0.5*L)/l)+exp(-(-x+0.5*L)/l),0,N,N))...

    );

% figure

% surf(x,x,reshape(diag(imag(Ui)),N,N)); % 查看势能虚部


H = 0.5*(-Lap2)+U+Ui; % Hamiltonian


NT = 50000; % No. of time steps

TF = 50; T = linspace(0,TF,NT); % Time vector

dT = T(2)-T(1); % Time step

% E = expm(-1i*H*dT); % Evolution

I = speye(size(H));

A = -1i*H*dT;

E = I;

for m=1:10 % 可调整展开阶数

    E = E+(A^m/factorial(m));

end

% spy(E)

(沿x向传播的)高斯波包:

e1 = e;

xf = kron(x,e1);

yf = kron(e1,x);

xo = -4.2; yo = 0; % center position

k0 = 10; a1 = 2; % 可手动调整

psi0 = exp(-((xf-xo).^2+(yf-yo).^2)/(a1^2)).*exp(1i*xf*k0);

psi0 = psi0/sqrt(psi0'*psi0); %归一化

画图:

fig=figure;

fig.Position = [0 0 2000 1000];

ax = axes(fig);


h=0.2e-3; % 依据波函数模平方的大致范围而定

xlim manual

ylim manual

zlim manual

% 波函数模平方的颜色初始设置

CO=zeros(N,N,3);

CO(:,:,1) = 0.25*ones(N,N);

CO(:,:,3) = 0.8*ones(N,N);

Nb = 1000; % 给相位插值时使用(让相位看起来更平滑)

Z0 = -1.5*h*ones(Nb,Nb); % 显示相位的平面高度

for t = 1:NT  % time index for loop

% calculate probability density rho(x,T)

    psi0 = E*psi0; % calculate new psi from old psi


%  if rem(t,4) %跳过部分帧

%     continue

%  end

% 计算psi模平方

    rho = abs(psi0).^2;

    rho1 = reshape(rho,[N,N]);

%设置着色

    CO(:,:,2) = 15*ones(N,N).*(rho1)/(h);

    CO(:,:,3) = 0.8*ones(N,N)+5*ones(N,N).*atan(rho1)/h;

% 绘制波函数模平方的曲面,按照数组CO着色

    s0 = surf(ax,x,x,rho1+0.1*h,CO,'FaceAlpha',0.4); 

    shading interp

    s0.EdgeColor = 'none';


    text(ax,-7,7,1.2*h,...

        ['$T=',num2str(dT*t,'%.2f'),'$'],...

        'Interpreter','latex','FontSize',20); %时间

    text(ax,-7,7,1*h,...

        ['$|\langle\mathbf{k}_0\rangle|=',num2str(abs(k0),'%.3f'),'$'],...

        'Interpreter','latex','FontSize',20); % 初态的平均动量的大小

    % 固定坐标轴范围

    zlim(ax,[-1.5*h 1.5*h]);

    xlim(ax,[-0.5*L 0.5*L]);

    ylim(ax,[-0.5*L 0.5*L]);


    hold on

    % 在xy平面上用颜色显示势能的大致形貌

    % 细节参数可按需调整

    imagesc(ax,[-0.5*L,0.5*L],[-0.5*L,0.5*L],...

        reshape(diag(real(10*U/(V))),N,N),'AlphaData',0.7)

    %计算相位,以 0.001*h 为波函数模平方的阈值,低于阈值的部分不保留结果

    phase = reshape(...

        h*angle(psi0).*heaviside(abs(psi0).^2-0.001*h)...

        ,[N,N]);

    %给相位插值,不一定必要

    [Xq,Yq] = meshgrid(linspace(x(1),x(end),Nb));

    Phase = interp2(kron(x',e1),kron(e1',x),phase,Xq,Yq,'makima');

    % 在相应平面用颜色绘制相位

    Ph = surf(ax,Xq,Yq,Z0,Phase,'FaceAlpha',0.3);

    shading interp

    Ph.EdgeColor = 'none';

    

    hold off


    % 颜色设置

    colormap(hsv)

    caxis([-pi*h pi*h])

    % 3维绘图的参数设置

    pbaspect([1 1 0.5]);

    campos([-18 -35 2.55*h])

    camtarget([0 0 0*h])

    camva(20)

    

    drawnow


end


粒子在2维势能中的波函数演化模拟的评论 (共 条)

分享到微博请遵守国家法律