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

📄 fdbpm_3d_paper.m

📁 有限差分法
💻 M
字号:
function FDBPM_3D_paper
clc
clear
%计算常量
r=0.5;
lamda=1.55e-6;
k0=2*pi/lamda;
dx=0.4;
dy=0.4;
dz=0.2;
thickness=8;
height=2;
width=12;
xwidth=60;
ywidth=60;
M=xwidth/dx;
N=ywidth/dy;
L=500;
er =ones(M, N); 
ed =-9.89*ones(M, N);
exy=zeros(M,N);
er( 1:M, N/2+thickness/2+1: N ) = 10.6;
ed( 1:M, N/2+thickness/2+1: N ) = -0.03;
er( M/2-width/2:M/2+width/2, N/2-thickness/2-1: N/2+thickness/2 ) = 11.7;
ed( M/2-width/2:M/2+width/2, N/2-thickness/2-1: N/2+thickness/2) = 0.07;
er (M/2-width/2:M/2+width/2, N/2-thickness/2-height: N/2-thickness/2 ) = 4.37;
ed (M/2-width/2:M/2+width/2, N/2-thickness/2-height: N/2-thickness/2 ) = -1.49;
exy( M/2-width/2:M/2+width/2, N/2-thickness/2-height: N/2-thickness/2 ) = 0;
%mesh( er(:,:) )
%mesh( ed(:,:) )
%axis([1 M 1 N -10 12])
%view(0,90)
Power1 = zeros(1,L);
Power2 = zeros(1,L);

d=dx/dy;         %dx/dy
for m=1:M
    for n=1:N
        P(m,n,1)=1*exp( -(m-M/2)^2/25)*exp( -(n-N/2)^2/25);
    end
end
      for n=2:N-1
        for m=2:M-1
            c=2i*dy^2/dz-2+(1-r)*er(m,n)*ed(m,n)*(dy^2);
        E1(m,n)=d*(P(m,n+1,1)+c*P(m,n,1)+P(m,n-1,1)); 
       end
     end

 Ey2=zeros(M,N);
%边界条件
for m=1:M
        if    P(m,2,1)~=0
              klxy1(m)=i*(log(P(m,1,1)/P(m,2,1)))/dy;
              klxy(m)=abs(real(klxy1(m)))-i*abs(imag(klxy1(m)));
        else  klxy(m)=0;
        end
        if    P(m,N-1,1)~=0
              krxy1(m)=i*(log(P(m,N,1)/P(m,N-1,1)))/dy;
              krxy(m)=abs(real(krxy1(m)))-i*abs(imag(krxy1(m)));
        else  krxy(m)=0;
        end
        klyy(m)=0;
        kryy(m)=0;
 end
    
    for n=1:N
        if    P(2,n,1)~=0
              klxx1(n)=i*(log(P(1,n,1)/P(2,n,1)))/dx;
              klxx(n)=abs(real(klxx1(n)))-i*abs(imag(klxx1(n)));
        else  klxx(n)=0;
        end
        if    P(M-1,n,1)~=0
              krxx1(n)=i*(log(P(M,n,1)/P(M-1,n,1)))/dx;
              krxx(n)=abs(real(krxx1(n)))-i*abs(imag(krxx1(n)));
        else  krxx(n)=0;
        end
        klyx(n)=0;
        kryx(n)=0;    
    end 
  
%求解矩阵,迭代计算
%z->z+dz/2
for  l=1:L
  l
%l->l+0.5,即z->z+dz/2
for n=2:N-1
     a=2i*dx^2/dz+2-r*er(2,n)*ed(2,n)*dx^2;
         b11=a-exp(-i*klxx(n)*dx);
         x1(2,n)=E1(2,n)/b11;      
        for   p=3:(M-2)
           a=2i*dx^2/dz+2-r*er(p,n)*ed(p,n)*dx^2;
            c11(p)=-1/b11;
            b11=a+c11(p); 
            x1(p,n)=(E1(p,n)+x1(p-1,n))/b11;
        end  
        a=2i*dx^2/dz+2-r*er(M-1,n)*ed(M-1,n)*dx^2;
         c11(M-1)=-1/b11;
         b11=a-exp(-i*krxx(n)*dx)+c11(M-1);
         x1(M-1,n)=(E1(M-1,n)+x1(M-2,n))/b11;
          Ex1(M-1,n)=x1(M-1,n);
        for v=(M-2):-1:2
            Ex1(v,n)=x1(v,n)-c11(v+1)*Ex1(v+1,n);
        end   
            Ex1(1,n)=Ex1(2,n)*exp(-i*klxx(n)*dx);
            Ex1(M,n)=Ex1(M-1,n)*exp(-i*krxx(n)*dx);      
   end        
%计算Ex1边界 
for m=2:M-1
    Ex1(m,1)=Ex1(m,2)*exp(-i*klxy(m)*dy);
    Ex1(m,N)=Ex1(m,N-1)*exp(-i*krxy(m)*dy);
end
    Ex1(1,1)=Ex1(2,1)*exp(-i*klxx(1)*dx);
    Ex1(1,N)=Ex1(2,N)*exp(-i*klxx(N)*dx);
    Ex1(M,1)=Ex1(M,2)*exp(-i*klxy(M)*dy);
    Ex1(M,N)=Ex1(M,N-1)*exp(-i*krxy(M)*dy);

%计算头半步Ey1
      for n=2:N-1
        for m=2:M-1
            c=2i*dy^2/dz-2+(1-r)*er(m,n)*ed(m,n)*(dy^2);
            b1=er(m,n)*exy(m,n)*(dx^2);
        F1(m,n)=d*(Ey2(m,n+1)+c*Ey2(m,n)+Ey2(m,n-1))-b1*Ex1(m,n);
       end
     end
for n=2:N-1
        a=2i*dx^2/dz+2-r*er(2,n)*ed(2,n)*dx^2;
         b12=a-exp(-i*klyx(n)*dx);
         y1(2,n)=F1(2,n)/b12;      
        for   p=3:(M-2)
            a=2i*dx^2/dz+2-r*er(p,n)*ed(p,n)*dx^2;
            c12(p)=-1/b12;
            b12=a+c12(p); 
            y1(p,n)=(F1(p,n)+y1(p-1,n))/b12;
        end  
        a=2i*dx^2/dz+2-r*er(M-1,n)*ed(M-1,n)*dx^2;
         c12(M-1)=-1/b12;
         b12=a-exp(-i*kryx(n)*dx)+c12(M-1);
         y1(M-1,n)=(F1(M-1,n)+y1(M-2,n))/b12;
          Ey1(M-1,n)=y1(M-1,n);
        for v=(M-2):-1:2
            Ey1(v,n)=y1(v,n)-c12(v+1)*Ey1(v+1,n);
        end   
            Ey1(1,n)=Ey1(2,n)*exp(-i*klyx(n)*dx);
            Ey1(M,n)=Ey1(M-1,n)*exp(-i*kryx(n)*dx);      
   end 
%计算Ey1边界 
for m=2:M-1
    Ey1(m,1)=Ey1(m,2)*exp(-i*klyy(m)*dy);
    Ey1(m,N)=Ey1(m,N-1)*exp(-i*kryy(m)*dy);
end
    Ey1(1,1)=Ey1(2,1)*exp(-i*klyx(1)*dx);
    Ey1(1,N)=Ey1(2,N)*exp(-i*klyx(N)*dx);
    Ey1(M,1)=Ey1(M,2)*exp(-i*klyy(M)*dy);
    Ey1(M,N)=Ey1(M,N-1)*exp(-i*kryy(M)*dy);
%计算H(:,:)     
for n=2:N-1
    for m=2:M-1
         c=2i*(dy^2)/dz-2+(1-r)*er(m,n)*ed(m,n)*(dy^2);
         b2=er(m,n)*exy(m,n)*(dy^2);
        H(m,n)=(Ey1(m+1,n)+c*Ey1(m,n)+Ey1(m-1,n))/d-b2*Ex1(m,n);
    end
end   

%x,y的边界   
%x的边界
    for m=1:M
        if    Ex1(m,2)~=0
              klxy1(m)=i*(log(Ex1(m,1)/Ex1(m,2)))/dy; 
              klxy(m)=abs(real(klxy1(m)))-i*abs(imag(klxy1(m)));
        else  klxy(m)=0;
        end
        if    Ex1(m,N-1)~=0
              krxy1(m)=i*(log(Ex1(m,N)/Ex1(m,N-1)))/dy;
              krxy(m)=abs(real(krxy1(m)))-i*abs(imag(krxy1(m)));
        else  krxy(m)=0;
        end
    end
  for n=1:N
        if    Ex1(2,n)~=0
              klxx1(n)=i*(log(Ex1(1,n)/Ex1(2,n)))/dx;
              klxx(n)=abs(real(klxx1(n)))-i*abs(imag(klxx1(n)));
        else  klxx(n)=0;
        end
        if    Ex1(M-1,n)~=0
              krxx1(n)=i*(log(Ex1(M,n)/Ex1(M-1,n)))/dx;
              krxx(n)=abs(real(krxx1(n)))-i*abs(imag(krxx1(n)));
        else  krxx(n)=0;
        end
    end
%y的边界     
   for m=1:M
        if    Ey1(m,2)~=0
              klyy1(m)=i*(log(Ey1(m,1)/Ey1(m,2)))/dy;
              klyy(m)=abs(real(klyy1(m)))-i*abs(imag(klyy1(m)));
        else  klyy(m)=0;
        end
        if    Ey1(m,N-1)~=0
              kryy1(m)=i*(log(Ey1(m,N)/Ey1(m,N-1)))/dy;
              kryy(m)=abs(real(kryy1(m)))-i*abs(imag(kryy1(m)));
        else  kryy(m)=0;
        end
    end
    
  for n=1:N
        if    Ey1(2,n)~=0
              klyx1(n)=i*(log(Ey1(1,n)/Ey1(2,n)))/dx;
              klyx(n)=abs(real(klyx1(n)))-i*abs(imag(klyx1(n)));
        else  klyx(n)=0;
        end
        if    Ey1(M-1,n)~=0
              kryx1(n)=i*(log(Ey1(M,n)/Ey1(M-1,n)))/dx;
              kryx(n)=abs(real(kryx1(n)))-i*abs(imag(kryx1(n)));
        else  kryx(n)=0;
        end
    end
%再计算后半步长
%l+0.5->l+1
%计算Ey2
for m=2:M-1
        a=2i*dx^2/dz+2-r*er(m,2)*ed(m,2)*dx^2;
         b22=a-exp(-i*klyy(m)*dy);
         y2(m,2)=H(m,2)/b22; 
        for   p=3:(N-2)
            a=2i*dx^2/dz+2-r*er(m,p)*ed(m,p)*dx^2;
            c22(p)=-1/b22;
            b22=a+c22(p); 
            y2(m,p)=(H(m,p)+y2(m,p-1))/b22;
        end  
        a=2i*dx^2/dz+2-r*er(m,N-1)*ed(m,N-1)*dx^2;
         c22(N-1)=-1/b22;
         b22=a-exp(-i*kryy(m)*dy)+c22(N-1);
         y2(m,N-1)= (H(m,N-1)+y2(m,N-2))/b22;
          Ey2(m,N-1)=y2(m,N-1);
        for v=(N-2):-1:2
            Ey2(m,v)=y2(m,v)-c22(v+1)*Ey2(m,v+1);
        end   
            Ey2(m,1)=Ey2(m,2)*exp(-i*klyy(m)*dy);
            Ey2(m,N)=Ey2(m,N-1)*exp(-i*kryy(m)*dy);      
   end 
%计算Ey2边界
for n=2:N-1
    Ey2(1,n)=Ey2(2,n)*exp(-i*klyx(n)*dx);
    Ey2(M,n)=Ey2(M-1,n)*exp(-i*kryx(n)*dx);       
end  
    Ey2(1,1)=Ey2(2,1)*exp(-i*klyx(1)*dx);
    Ey2(1,N)=Ey2(2,N)*exp(-i*klyx(N)*dx);
    Ey2(M,1)=Ey2(M,2)*exp(-i*klyy(M)*dy);
    Ey2(M,N)=Ey2(M,N-1)*exp(-i*kryy(M)*dy);

%计算Ex2
    for n=2:N-1
    for m=2:M-1
         c=2i*(dy^2)/dz-2+(1-r)*er(m,n)*ed(m,n)*(dy^2);
         b2=er(m,n)*exy(m,n)*(dy^2);
        G(m,n)=(Ex1(m+1,n)+c*Ex1(m,n)+Ex1(m-1,n))/d+b2*Ey2(m,n);
    end
end 
for m=2:M-1
     a=2i*dx^2/dz+2-r*er(m,2)*ed(m,2)*dx^2;
         b21=a-exp(-i*klxy(m)*dy);
         x2(m,2)=G(m,2)/b21;      
        for   p=3:(N-2)
           a=2i*dx^2/dz+2-r*er(m,p)*ed(m,p)*dx^2;
            c21(p)=-1/b21;
            b21=a+c21(p); 
            x2(m,p)=(G(m,p)+x2(m,p-1))/b21;
        end  
        a=2i*dx^2/dz+2-r*er(m,N-1)*ed(m,N-1)*dx^2;
         c21(N-1)=-1/b21;
         b21=a-exp(-i*krxy(m)*dy)+c21(N-1);
         x2(m,N-1)=(G(m,N-1)+x2(m,N-2))/b21;
          Ex2(m,N-1)=x2(m,N-1);
        for v=(M-2):-1:2
            Ex2(m,v)=x2(m,v)-c21(v+1)*Ex2(m,v+1);
        end   
            Ex2(m,1)=Ex2(m,2)*exp(-i*klxy(m)*dy);
            Ex2(m,N)=Ex2(m,N-1)*exp(-i*krxy(m)*dy);      
   end   
%计算Ex2边界
for n=2:N-1
    Ex2(1,n)=Ex2(2,n)*exp(-i*klxx(n)*dx);
    Ex2(M,n)=Ex2(M-1,n)*exp(-i*krxx(n)*dx);      
end  
    Ex2(1,1)=Ex2(2,1)*exp(-i*klxx(1)*dx);
    Ex2(1,N)=Ex2(2,N)*exp(-i*klxx(N)*dx);
    Ex2(M,1)=Ex2(M,2)*exp(-i*klxy(M)*dy);
    Ex2(M,N)=Ex2(M,N-1)*exp(-i*krxy(M)*dy);
  
%计算E1(:,:)     
for m=2:M-1
    for n=2:N-1
        c=2i*dy^2/dz-2+(1-r)*er(m,n)*ed(m,n)*(dy^2);
           b1=er(m,n)*exy(m,n)*(dx^2);
        E1(m,n)=(Ex2(m,n+1)+c*Ex2(m,n)+Ex2(m,n-1))*d+b1*Ey2(m,n);
    end
end

%x,y的边界   
%x的边界
    for m=1:M
        if    Ex2(m,2)~=0
              klxy2(m)=i*(log(Ex2(m,1)/Ex2(m,2)))/dy;
              klxy(m)=abs(real(klxy2(m)))-i*abs(imag(klxy2(m)));
        else  klxy(m)=0;
        end
        if    Ex2(m,N-1)~=0
              krxy2(m)=i*(log(Ex2(m,N)/Ex2(m,N-1)))/dy;
              krxy(m)=abs(real(krxy2(m)))-i*abs(imag(krxy2(m)));
        else  krxy(m)=0;
        end
    end
  for n=1:N
        if    Ex2(2,n)~=0
              klxx2(n)=i*(log(Ex2(1,n)/Ex2(2,n)))/dx;
              klxx(n)=abs(real(klxx2(n)))-i*abs(imag(klxx2(n)));
        else  klxx(n)=0;
        end
        if    Ex2(M-1,n)~=0
              krxx2(n)=i*(log(Ex2(M,n)/Ex2(M-1,n)))/dx;
              krxx(n)=abs(real(krxx2(n)))-i*abs(imag(krxx2(n)));
        else  krxx(n)=0;
        end
    end
%y的边界     
   for m=1:M
        if    Ey2(m,2)~=0
              klyy2(m)=i*(log(Ey2(m,1)/Ey2(m,2)))/dy;
              klyy(m)=abs(real(klyy2(m)))-i*abs(imag(klyy2(m)));
        else  klyy(m)=0;
        end
        if    Ey2(m,N-1)~=0
              kryy2(m)=i*(log(Ey2(m,N)/Ey2(m,N-1)))/dy;
              kryy(m)=abs(real(kryy2(m)))-i*abs(imag(kryy2(m)));
        else  kryy(m)=0;
        end
    end
    
  for n=1:N
        if    Ey2(2,n)~=0
              klyx2(n)=i*(log(Ey2(1,n)/Ey2(2,n)))/dx;
              klyx(n)=abs(real(klyx2(n)))-i*abs(imag(klyx2(n)));
        else  klyx(n)=0;
        end
        if    Ey2(M-1,n)~=0
              kryx2(n)=i*(log(Ey2(M,n)/Ey2(M-1,n)))/dx;
              kryx(n)=abs(real(kryx2(n)))-i*abs(imag(kryx2(n)));
        else  kryx(n)=0;
        end
    end
    
    for ii = 1:N
        for jj = 1:M
            Power1(l) = Power1(l) + abs(Ex2(ii, jj))^2;
        end
    end
    
    for ii = 1:N
        for jj = 1:M
            Power2(l) = Power2(l) + abs(Ey2(ii, jj))^2;
        end
    end
    subplot(2,1,1);
    mesh( abs(Ex2(:, :)) )
    axis([1 M 1 N 0 1])
    view(45,45)
    subplot(2,1,2);
    mesh( abs(Ey2(:, :)) )
    axis([1 M 1 N 0 1])
    view(45,45)
    pause(1e-200)
   
end  
%save paper_L=0.2_150X150;

figure
 xaxis=dz*6.6/k0:dz*6.6/k0:L*dz*6.6/k0;
plot(xaxis,Power1/max(Power1),'-b')
grid on
hold on

plot(xaxis,Power2/max(Power1),'--g')
Power = Power1/max(Power1) + Power2/max(Power1);
plot(xaxis,Power,'-r')
xlabel('传输距离','FontSize',12,'FontWeight','bold');
ylabel('归一化功率','FontSize',12,'FontWeight','bold');

  

    

⌨️ 快捷键说明

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