⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fem_onedimpbg.m

📁 采用有限元离散计算一维声子、光子能带
💻 M
字号:
function FEM_onedimpbg


%    比较两种离散方式对精度,计算量的影响。方法1,先代入bloch条件,后离散;方法2,先离散,后代入bloch条件
%u  特向量,bloch函数的周期部分,第一列表示波数,第二列表示能带,第三列表示特征向量
clear
clc

ro=[1;1];
E=[1;1];
d=1;
%参数
L=2*d;

N=20;

N_band=4;
%N+1个节点,总共2N+1个
h=d/N;

%实空间单胞数 2*q

q=10;

x=[0:h:L];
%波数

mm=20;

b=pi/L/mm;
kk=[-1*pi/L+b/2:b:1*pi/L-b/2];
kk=[kk(1)-b,kk,kk(2*mm)+b];


NN=size(kk);
omiga=[];


ik=E/h;
im=ro*h/6;


u=zeros(NN(2),2*N+1,2*N+1);
%先代入bloch后离散
for l=1:1:NN(2) 
    k=kk(l);
    K=zeros(2*N+1,2*N+1);
    M=zeros(2*N+1,2*N+1);
    
    for j=1:N
        K(j,j)=(2/3*(k*h)^2+2)*ik(1);
        %         K(j,j+1)=(1/6*(k*h)^2+i*k*h-1)*ik(1);
        
        K(j,j+1)=(1/6*(k*h)^2-i*k*h-1)*ik(1);
        
        K(j+1,j)=K(j,j+1)';
        M(j,j)=4*im(1);
        M(j,j+1)=im(1);
        M(j+1,j)=im(1);
    end
    K(1,1)=(1/3*(k*h)^2+1)*ik(1);
    M(1,1)=2*im(1);
    K(N+1,N+1)=(1/3*(k*h)^2+1)*(ik(1)+ik(2));
    K(N,N+1)=K(N+1,N)';
    %     K(N+1,N+2)=(1/6*(k*h)^2+i*k*h-1)*ik(2);
    
    K(N+1,N+2)=(1/6*(k*h)^2-i*k*h-1)*ik(2);
    
    K(N+2,N+1)=K(N+1,N+2)';
    M(N+1,N+1)=2*(im(1)+im(2));
    M(N+1,N+2)=im(2);
    M(N+2,N+1)=im(2);
    for j=N+2:2*N
        K(j,j)=(2/3*(k*h)^2+2)*ik(2);
        %         K(j,j+1)=(1/6*(k*h)^2+i*k*h-1)*ik(2);
        
        K(j,j+1)=(1/6*(k*h)^2-i*k*h-1)*ik(2);
        
        K(j+1,j)=K(j,j+1)';
        M(j,j)=4*im(2);
        M(j,j+1)=im(2);
        M(j+1,j)=im(2);
    end
    K(2*N+1,2*N+1)=(1/3*(k*h)^2+1)*ik(2);
    M(2*N+1,2*N+1)=2*im(2);
    
    KK=K;
    MM=M; 
    
    MM(:,1)=MM(:,1)+MM(:,2*N+1);
    MM(1,:)=MM(1,:)+MM(2*N+1,:);
    KK(:,1)=KK(:,1)+KK(:,2*N+1);
    KK(1,:)=KK(1,:)+KK(2*N+1,:);
    KK(:,2*N+1)=[];
    MM(:,2*N+1)=[];
    KK(2*N+1,:)=[];
    MM(2*N+1,:)=[]; 
    
    
    [eigvetor,eigval]=eig(KK,MM);
    [D1,II]=sort(real(diag(eigval)));
    eigvetor=eigvetor(:,II);
    
    %特征值
    omiga=[omiga,sqrt(D1)];
    
    %特向量
    
    
    %对边界条件的处理
    eigvetor=[eigvetor;eigvetor(2*N,:)];
    eigvetor=[eigvetor,eigvetor(:,1)];
    
    %归一化
    for m=1:2*N+1
        eigvetor(:,m)=eigvetor(:,m)/sqrt(eigvetor(:,m)'*eigvetor(:,m));
    end
    
    
    u(l,:,:)=eigvetor;    
end 
omiga=omiga';
y1=[];
for j=1:N_band
    
    y1=[y1,omiga(:,j)];
end 






%先离散
uu=u;
omiga=[];
%先离散,后代入bloch
k=0;
K=zeros(2*N+1,2*N+1);
M=zeros(2*N+1,2*N+1);

for j=1:N
    K(j,j)=(2/3*(k*h)+2)*ik(1);
    K(j,j+1)=(1/6*(k*h)^2+i*k*h-1)*ik(1);
    K(j+1,j)=K(j,j+1)';
    M(j,j)=4*im(1);
    M(j,j+1)=im(1);
    M(j+1,j)=im(1);
end
K(1,1)=(1/3*(k*h)+1)*ik(1);
M(1,1)=2*im(1);
K(N+1,N+1)=(1/3*(k*h)+1)*(ik(1)+ik(2));
K(N,N+1)=K(N+1,N)';
K(N+1,N+2)=(1/6*(k*h)^2+i*k*h-1)*ik(2);
K(N+2,N+1)=K(N+1,N+2)';
M(N+1,N+1)=2*(im(1)+im(2));
M(N+1,N+2)=im(2);
M(N+2,N+1)=im(2);
for j=N+2:2*N
    K(j,j)=(2/3*(k*h)+2)*ik(2);
    K(j,j+1)=(1/6*(k*h)^2+i*k*h-1)*ik(2);
    K(j+1,j)=K(j,j+1)';
    M(j,j)=4*im(2);
    M(j,j+1)=im(2);
    M(j+1,j)=im(2);
end
K(2*N+1,2*N+1)=(1/3*(k*h)+1)*ik(2);
M(2*N+1,2*N+1)=2*im(2);

for l=1:1:NN(2) 
    k=kk(l);
    
    KK=K;
    MM=M; 
    MM(:,1)=MM(:,1)+MM(:,2*N+1)*exp(-i*k*2*d)';
    MM(1,:)=MM(1,:)+MM(2*N+1,:)*exp(-i*k*2*d);
    KK(:,1)=KK(:,1)+KK(:,2*N+1)*exp(-i*k*2*d)';
    KK(1,:)=KK(1,:)+KK(2*N+1,:)*exp(-i*k*2*d);
    
    KK(:,2*N+1)=[];
    MM(:,2*N+1)=[];
    KK(2*N+1,:)=[];
    MM(2*N+1,:)=[]; 
    
    
    [eigvetor,eigval]=eig(KK,MM);
    [D1,II]=sort(real(diag(eigval)));
    eigvetor=eigvetor(:,II);
    omiga=[omiga,sqrt(D1)]; 
    
    eigvetor=[eigvetor;eigvetor(2*N,:)*exp(i*k*L)];
    eigvetor=[eigvetor,eigvetor(:,1)*exp(i*k*L)];
    for m=1:2*N+1
        eigvetor(:,m)=eigvetor(:,m)/sqrt(eigvetor(:,m)'*eigvetor(:,m));
    end
    
    uu(l,:,:)=eigvetor;      
end 
omiga=omiga';
y2=[];
for j=1:6
    
    y2=[y2,omiga(:,j)];
end 

% Uw=wannier(u,kk,b,x,L,N_band);
% Uw=uu;

figure
plot(kk,y1')
hold on
plot(kk,y2','r');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -