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

双缝干涉相关代码

2023-04-18 23:36 作者:湛蓝色的彼岸花  | 我要投稿

相当于在粒子位矢波函数上张量积了两个双态空间,方法还是 time splitting 方法。

很多地方没怎么精细处理,比较臃肿,不过能跑就行

L = 15; % Interval Length

N = 400; % 设置 N*N 格点

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

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

NT = 20000; % No. of time steps

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

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

%**************************

% 二维单位矩阵和 Pauli x 矩阵

I2 = speye(2,2);

sigmax = sparse(2,2);

sigmax(1,2) = 1; sigmax(2,1) = 1;

%**************************

% 位矢空间相关算符

e1 = ones(N,1);

Rx = kron(x',e1);

Ry = Rx';

InArea = heaviside(-2-Rx);

InArea = reshape(InArea,1,N*N); % 筛出 Rx<-2 范围内的振幅

%**************************

% 势能

V = 1000;

Ud = V*exp(-25*(Rx+2).^2)...

   .*heaviside(0.75*pi-Ry).*heaviside(Ry+0.75*pi)...

       .*cos(Ry*2).^2+...

       V*exp(-25*(Rx-0.5*L).^2)+V*exp(-25*(Rx+0.5*L).^2)+...

       V*exp(-25*(Ry-0.5*L).^2)+V*exp(-25*(Ry+0.5*L).^2);% 双缝与边界

% 演化算符相关

EUdx = kron(...

   reshape(exp(-1i*0.5*Ud*dT),1,N*N),...

   [1;1;1;1]);

   

%**************************

% probe

g = 90; % coupling

% coupling region

UpR = g*exp(-10*((Rx-0.03*L+2).^2+(Ry-0.25*pi).^2)); % right

UpL = g*exp(-10*((Rx-0.03*L+2).^2+(Ry+0.25*pi).^2)); % left

% 演化算符相关

SUpRx = sin(0.5*UpR*dT);

SUpRx = kron(reshape(SUpRx,1,N*N),[1;1;1;1]);

SUpRd = kron(I2,sigmax);

CUpRx = cos(0.5*UpR*dT);

CUpRx = kron(reshape(CUpRx,1,N*N),[1;1;1;1]);

SUpLx = sin(0.5*UpL*dT);

SUpLx = kron(reshape(SUpLx,1,N*N),[1;1;1;1]);

SUpLd = kron(sigmax,I2);

CUpLx = cos(0.5*UpL*dT);

CUpLx = kron(reshape(CUpLx,1,N*N),[1;1;1;1]);

%绘制探测区域的边界

circxR = cos(linspace(0,2*pi,50))/sqrt(10)+0.03*L-2;

circyR = sin(linspace(0,2*pi,50))/sqrt(10)+0.25*pi;

circzR = zeros(50);

circxL = cos(linspace(0,2*pi,50))/sqrt(10)+0.03*L-2;

circyL = sin(linspace(0,2*pi,50))/sqrt(10)-0.25*pi;

circzL = zeros(50);

%**************************

% 动量相关算符

e1 = ones(N,1);

K = [2*pi*(-N/2:-1)/L,2*pi*(0:N/2-1)/L]; % 动量范围

Kx = kron(K,e1);

Ky = Kx';

Ks = (Kx.^2+Ky.^2);

% 时间演化相关

UMmtk = exp(-0.5*1i*dT*(Ks));

%**************************

% 初态

a = 1;% 控制波包大小

ko = 30;% 动量中心

% 位置中心

xo = -4;

yo = 0;

psi0 = exp(-((Rx-xo).^2+(Ry-yo).^2)/(a^2)).*exp(1i*Rx*ko); % Gauss 波包

psi0 = psi0/sqrt(sum(sum(conj(psi0).*psi0))); % 归一化

psi2 = kron(reshape(psi0,1,N*N),[1;0;0;0]); % 化为方便处理的形式

%**************************

% 时间演化与绘图

%绘图相关设置

fig=figure;

fig.Position = [0 0 2000 1000];

ax = axes(fig);

h = 0.5e-3;

xlim manual

ylim manual

zlim manual

CO1=zeros(N,N,3);

CO1(:,:,1) = 0.2*ones(N,N);

CO1(:,:,3) = 0.75*ones(N,N);

CO2 = CO1;

CO2(:,:,3) = 1*ones(N,N);

for t = 1:NT

   % Strang 方法计算时间演化

   % 依次作用 right probe, left probe, potential 相关算符

   % (不过三者其实对易,具体顺序不重要)

   psi2 = CUpRx.*psi2-1i*SUpRx.*(SUpRd*psi2);

   psi2 = CUpLx.*psi2-1i*SUpLx.*(SUpLd*psi2);

   psi2 = EUdx.*psi2;

   % 计算动量波函数,十分臃肿,放弃思考

   % 并作用动量相关算子

   psik1 = fftshift(fft2(reshape(psi2(1,:),N,N)));

   psik1 = UMmtk.*psik1;

   psik2 = fftshift(fft2(reshape(psi2(2,:),N,N)));

   psik2 = UMmtk.*psik2;

   psik3 = fftshift(fft2(reshape(psi2(3,:),N,N)));

   psik3 = UMmtk.*psik3;

   psik4 = fftshift(fft2(reshape(psi2(4,:),N,N)));

   psik4 = UMmtk.*psik4;

   % 再逆变换回位矢波函数

   psi2(1,:) = reshape(ifft2(ifftshift(psik1)),1,N*N);

   psi2(2,:) = reshape(ifft2(ifftshift(psik2)),1,N*N);

   psi2(3,:) = reshape(ifft2(ifftshift(psik3)),1,N*N);

   psi2(4,:) = reshape(ifft2(ifftshift(psik4)),1,N*N);

% 再次依次作用 right probe, left probe, potential 相关算符

   psi2 = CUpRx.*psi2-1i*SUpRx.*(SUpRd*psi2);

   psi2 = CUpLx.*psi2-1i*SUpLx.*(SUpLd*psi2);

   psi2 = EUdx.*psi2;

   

   if rem(t,10) % 控制画图频率

       if t~=1

           continue

       end

   end

   

   rho = reshape(sum(abs(psi2).^2,1),N,N); % 总位矢分布密度

   % 曲面绘制与着色

   CO1(:,:,1) = 0.2*ones(N,N)+10*ones(N,N).*sqrt(rho/h)./((1+50*rho/h));

   CO1(:,:,2) = 15*ones(N,N).*rho/h;

   CO1(:,:,3) = 0.75*ones(N,N)+ones(N,N).*rho.^2/h^2;

   s01 = surf(ax,x,x,rho+0.01*h,CO1,'FaceAlpha',0.4);

   shading interp

   s01.EdgeColor = 'none';

   

   zlim(ax,[-0.015*h 3*h]);

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

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

   

   hold on

  %时间

   text(ax,-0.4*L,0.4*L,2.1*h,...

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

       'Interpreter','latex','FontSize',20);

   % 两个探针在 2*2=4 个状态上的分布

   None = sum(abs(psi2(1,:)).^2);

   Left = sum(abs(psi2(2,:)).^2);

   Right = sum(abs(psi2(3,:)).^2);

   Both = sum(abs(psi2(4,:)).^2);

   text(ax,-0.3*L,-0.5*L,2.3*h,...

       ['$None:\ ',num2str(None,'%.3f'),'$',newline,...

       '$Left:\ ',num2str(Left,'%.3f'),'$',newline, ...

       '$Right:\ ',num2str(Right,'%.3f'),'$',newline, ...

       '$Both:\ ',num2str(Both,'%.3f'),'$'],...

       'Interpreter','latex','FontSize',20);

   % 耦合强度

   text(ax,-0.4*L,0.4*L,1.8*h,...

       ['$g =',num2str(g,'%.0f'),'$'],...

       'Interpreter','latex','FontSize',20);

   % 直接计算反射率

   Rfl = sum(abs(InArea.*psi2(1,:)).^2)+...

   sum(abs(InArea.*psi2(2,:)).^2)+...

   sum(abs(InArea.*psi2(3,:)).^2)+...

   sum(abs(InArea.*psi2(4,:)).^2);

   

   text(ax,-0.3*L,-0.5*L,3*h,...

       ['Reflect:$\ ',num2str(Rfl,'%.3f'),'$'],...

       'Interpreter','latex','FontSize',20);

   % 用颜色显示势能

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

       10*h*Ud/V,'AlphaData',0.15);

   % 标注探测区域

   plot3(ax,circxR,circyR,circzR,'r');

   plot3(ax,circxL,circyL,circzL,'b');

   

   hold off

   % 绘图参数

   colormap(hsv)

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

   pbaspect([1 1 0.5]);

   campos([25 -10 5*h])

   camtarget([0 0 1.5*h])

   camva(23)

   

   drawnow

end


双缝干涉相关代码的评论 (共 条)

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