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

模拟Bloch波包用的部分代码

2022-07-07 20:36 作者:湛蓝色的彼岸花  | 我要投稿

% 用于制备Bloch波包、观察Bloch波包运动的matlab代码

% 渣代码能力,轻喷

% 代码参考了 https://arxiv.org/pdf/0704.1622.pdf,有很多部分并非原创(英文注释基本上是原版代码里面复制过来的)

% 这个文献是在 https://www.zhihu.com/answer/278044905 里面翻到的




L = 80; % Interval Length

N = 4000; % No of points

x = linspace(-L/2,L/2,N)'; % Coordinate vector,粒子被限制在-L/2至L/2范围内,相当于一个无限深势阱

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


% Parameters for making intial wavefunction psi

%设置波包的中心动量

 ko1 = 5.2; 

 ko2 = 4.7;

 ko3 = 4;

 

a = 7; % 设置Gauss波包的初始宽度


% 设置波包的初始中心位置

xo1 = -20;

xo2 = -20;

xo3 = -20;


V=10; % 用于调整势垒高度

b = -0.1; % 设置外力大小和方向


 % 由于空间自由度被离散化,可以准确描述的动量范围有上界。动量太大的后果其实也是一种 Bloch 振荡

 if abs(ko1)>(0.5*pi*N/L)

     error('too large k');

 end

 if abs(ko2)>(0.5*pi*N/L)

    error('too large k');

 end

 if abs(ko3)>(0.5*pi*N/L)

     error('too large k');

end


U1 = V*heaviside(x).*abs(rem( floor(x) ,2)); % 半边自由,半边 K-P 周期势能,可以用制备Bloch波包;如果要全局都是K-P,把heaviside删掉

% U2=U1+b*x; %有外力


% Finite-difference representation of Laplacian and Hamiltonian

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

H1 = -(1/2)*Lap + spdiags(U1,0,N,N);

% H2 = -(1/2)*Lap + spdiags(U2,0,N,N);

% Parameters for computing psi(x,T) at different times 0 < T < TF

NT = 1600; % No. of time steps

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

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

hbar = 1;

% Time displacement operator E=exp(-iHdT/hbar)

E1 = expm(-1i*full(H1)*dT/hbar); % time desplacement operator

% E2 = expm(-1i*full(H2)*dT/hbar);


% 初始波函数

psi1 = exp(-(x-xo1).^2/(2*a.^2)).*exp(1i*ko1*x);

psi1 = psi1/sqrt(psi1'*psi1*dx);  % normalize the psi(x,0)

psi2 = exp(-(x-xo2).^2/(2*a.^2)).*exp(1i*ko2*x);

psi2 = psi2/sqrt(psi2'*psi2*dx); 

psi3 = exp(-(x-xo3).^2/(2*a.^2)).*exp(1i*ko3*x);

psi3 = psi3/sqrt(psi3'*psi3*dx); 

%对于已经制备好的Bloch波包psi0

% psi1 = psi0;

% psi1 = psi1/sqrt(psi1'*psi1*dx); 

% psi2=psi1;


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

% Simulate rho(x,T) and plot for each T

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

h=0.3;


fig=figure;

fig.Position = [0 0 2000 1000];

for t = 1:NT  % time index for loop

% calculate probability density rho(x,T),相同的H

psi1 = E1*psi1; % calculate new psi from old psi

rho1 = conj(psi1).*psi1; % rho(x,T)

psi2 = E1*psi2; % calculate new psi from old psi

rho2 = conj(psi2).*psi2; % rho(x,T)

% psi3 = E1*psi3; % calculate new psi from old psi

% rho13 = conj(psi3).*psi3; % rho(x,T)


% 如果要用不同的H

% psi2 = E2*psi2;

% rho2 = conj(psi2).*psi2; 

% psi3 = E*psi3;

% rho3 = conj(psi3).*psi3; 


% f1 = fft(psi1);

% f2 = fft(psi2);

% f3 = fft(psi3);


subplot(211);

plot(x,(h/2)*U1/(2*V));% 画势能

hold on

% plot(x,rho1,'b',x,rho2,'k',x,rho3,'m'); % plot rho(x,T) vs. x

% plot(x,rho1,'b',x,real(psi1).^2,'c--',x,rho2,'k',x,real(psi2).^2,'b--',x,rho3,'r',x,real(psi3).^2,'g--'); 

plot(x,rho1,'b',x,real(psi1).^2,'c--');

axis([-L/2 L/2 0 h]); % set x,y axis parameters for plotting

xlabel('x', 'FontSize', 24);

hold off


subplot(212);

plot(x,(h/2)*(U1)/(2*V)+0.1);

% plot(x,(h/2)*(U2)/(2*V)+0.1);

hold on

plot(x,rho2,'k',x,real(psi2).^2,'b--');

axis([-L/2 L/2 0 h]); % set x,y axis parameters for plotting

xlabel('x', 'FontSize', 24);

hold off


pause(0.001);

end


模拟Bloch波包用的部分代码的评论 (共 条)

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