zoukankan      html  css  js  c++  java
  • matlab仿真二维光子晶体最简程序

    本程序为初学者使用,只考虑MT方向

    下面的程序为matlab代码

    只考虑MT方向

    %This is a simple demo for Photonic Crystals simulation 
    

    %This is a simple demo for Photonic Crystals simulation
    %This demo is for TE wave only, so only h wave is considered.
    %for TM direction only,10 points is considered.
    %---------------------------------------M
    %| / |
    %| / |
    %| / |
    %| --------------------|X
    %| T |
    %| |
    %| |
    %---------------------------------------
    %equation :sum_{G',k}(K+G)(K+G')f(G-G')hz(k+G')=(omega/c)^2*hz(k+G)
    %G' can considerd as the index of column, and G as index of rows
    %[(K+G1)(K+G1)f(G1-G1) (K+G1)(K+G2)f(G1-G2) ][hz(G1)]=(omega/c)^2[hz(G1)]
    %[(K+G2)(K+G1)f(G2-G1) (K+G2)(K+G2)f(G2-G2) ][hz(G2)] [hz(G2)]
    %or: THETA_TE*Hz=(omega/c)^2*Hz
    %by Gao Haikuo
    %date:20170411

    clear; clc; epssys=1.0e-6; %设定一个最小量,避免系统截断误差或除0错误


    %this is the lattice vector and the reciprocal lattice vector
    a=1; a1=a*[1 0]; a2=a*[0 1];
    b1=2*pi/a*[1 0];b2=2*pi/a*[0 1];

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %定义晶格的参数
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    epsa = 1; %介质柱的介电常数
    epsb = 13; %背景的介电常数
    Pf = 0.7; %Pf = Ac/Au 填充率,可根据需要自行设定
    Au =a^2; %二维格子原胞面积
    Rc = (Pf *Au/pi)^(1/2); %介质柱截面半径
    Ac = pi*(Rc)^2; %介质柱横截面积


    %construct the G list
    NrSquare = 10;
    NG =(2*NrSquare+1)^2; % NG is the number of the G value
    G = zeros(NG,2);
    i = 1;
    for l = -NrSquare:NrSquare
    for m = -NrSquare:NrSquare
    G(i,:)=l*b1+m*b2;
    i = i+1;
    end
    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %生成k空间中的f(Gi-Gj)的值,i,j 从1到NG。
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    f=zeros(NG,NG);
    for i=1:NG
    for j=1:NG
    Gij=norm(G(i,:)-G(j,:));
    if (Gij < epssys)
    f(i,j)=(1/epsa)*Pf+(1/epsb)*(1-Pf);
    else
    f(i,j)=(1/epsa-1/epsb)*Pf*2*besselj(1,Gij*Rc)/(Gij*Rc);
    end;
    end;
    end;
    T=(2*pi/a)*[epssys 0];
    M=(2*pi/a)*[1/2 1/2]; %????????
    X=(2*pi/a)*[1/2 0];

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %对于简约布里渊区边界上的每个k,求解其特征频率
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    THETA_TE=zeros(NG,NG); %待解的TE波矩阵
    Nkpoints=10; %每个方向上取的点数,
    stepsize=0:1/(Nkpoints-1):1; %每个方向上的步长

    TX_TE_eig = zeros(Nkpoints,NG); %沿MT方向的TE波的待解的特征频率矩阵
    XM_TE_eig = zeros(Nkpoints,NG); %沿MT方向的TE波的待解的特征频率矩阵
    MT_TE_eig = zeros(Nkpoints,NG); %沿MT方向的TE波的待解的特征频率矩阵

    for n=1:Nkpoints %scan the 10 points along the TM direction
    fprintf([' k-point:',int2str(n),'of',int2str(Nkpoints),'. ']);
    MT_step = stepsize(n)*(T-M)+M; % get the k
    %先求非对角线上的元素
    for i=1:(NG-1) % G
    for j=(i+1):NG % G'
    kGi = MT_step+G(i,:); %k+G
    kGj = MT_step+G(j,:); %K+G'
    THETA_TE(i,j)=f(i,j)*dot(kGi,kGj); %(K+G)(K+G')f(G-G')
    THETA_TE(j,i)=conj(THETA_TE(i,j));
    end
    end
    %再求对角线上的元素
    for i=1:NG
    kGi = MT_step+G(i,:);
    THETA_TE(i,i)=f(i,i)*norm(kGi)*norm(kGi);
    end
    MT_TE_eig(n,:)=sort(sqrt(eig(THETA_TE))).';
    end

    %draw
    kaxis = 0;
    TXaxis = kaxis:norm(T-X)/(Nkpoints-1):(kaxis+norm(T-X));
    kaxis = kaxis + norm(T-X);
    XMaxis = kaxis:norm(X-M)/(Nkpoints-1):(kaxis+norm(X-M));
    kaxis = kaxis + norm(X-M);
    MTaxis = kaxis:norm(M-T)/(Nkpoints-1):(kaxis+norm(M-T));
    kaxis = kaxis + norm(M-T);


    Ntraject = 3;
    figure (1)
    hold on;
    Nk=Nkpoints;
    for k=1:NG
    for i=1:Nkpoints
    EigFreq_TE(i+0*Nk) = TX_TE_eig(i,k)/(2*pi/a);
    EigFreq_TE(i+1*Nk) = XM_TE_eig(i,k)/(2*pi/a);
    EigFreq_TE(i+2*Nk) = MT_TE_eig(i,k)/(2*pi/a);
    end
    plot(TXaxis(1:Nk),EigFreq_TE(1+0*Nk:1*Nk),'r',...
    XMaxis(1:Nk),EigFreq_TE(1+1*Nk:2*Nk),'r',...
    MTaxis(1:Nk),EigFreq_TE(1+2*Nk:3*Nk),'r');
    end

    grid on;
    xlabel('K-Space');
    yLabel('Frequency(omegaa/2piC)');
    axis([0 MTaxis(Nkpoints) 0 1]);
    set(gca,'XTick',[TXaxis(1), TXaxis(Nkpoints),...
    XMaxis(Nkpoints),MTaxis(Nkpoints)]);
    xtixlabel = strvcat('T','X','M','T');
    set(gca,'XTickLabel',xtixlabel);

  • 相关阅读:
    【leetcode】1020. Partition Array Into Three Parts With Equal Sum
    【leetcode】572. Subtree of Another Tree
    【leetcode】123. Best Time to Buy and Sell Stock III
    【leetcode】309. Best Time to Buy and Sell Stock with Cooldown
    【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
    【leetcode】467. Unique Substrings in Wraparound String
    【leetcode】823. Binary Trees With Factors
    【leetcode】143. Reorder List
    【leetcode】1014. Capacity To Ship Packages Within D Days
    【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
  • 原文地址:https://www.cnblogs.com/Iknowyou/p/6696659.html
Copyright © 2011-2022 走看看