平面波展开法计算二维局域共振声子晶体超材料带隙matlab程序
时间: 2023-08-01 20:13:04 浏览: 236
二维局域共振声子晶体超材料的带隙可以使用平面波展开法进行计算。下面是一份MATLAB程序,可以计算出二维局域共振声子晶体超材料的带隙:
```matlab
% 二维局域共振声子晶体超材料的带隙计算
% 平面波展开法
clear all;
clc;
% 超材料参数设置
a=1; % 基本单元尺寸
b=1.5*a; % 间隔尺寸
r=0.32*a; % 孔洞半径
h=0.4*a; % 超材料厚度
n=1; % 声折射率
% 波矢量范围设置
kx=linspace(-pi/a,pi/a,100); % x方向波矢量范围
ky=linspace(-pi/a,pi/a,100); % y方向波矢量范围
% 构造倒格子
[KX,KY]=meshgrid(kx,ky); % 构造网格点
G1=[1 -1]; % 基向量1
G2=[1 1]; % 基向量2
G=G1'*KX(:)'+G2'*KY(:)'; % 计算倒格子波矢量
% 计算频率
omega=sort(sqrt(n*sum(G.^2,1))/a*2*pi/h); % 计算频率
% 绘制频率-波矢量图像
figure;
plot(omega/(2*pi),'.');
xlabel('k');
ylabel('f');
title('带隙结构');
```
需要注意的是,这份程序只是一个简单的演示,具体的参数设置和计算方法需要根据具体的问题进行调整。
相关问题
平面波展开法计算二维弹簧质量声子晶体超材料板带隙matlab程序
平面波展开法(Plane Wave Expansion Method,PWEM)可以用于计算二维弹簧质量声子晶体超材料板的带隙。Matlab程序如下:
```matlab
%% 声子晶体超材料板平面波展开法计算程序
%% 参数设置
a = 1; % 基本元胞尺寸
h = a/2; % 板厚
r = 0.2*a; % 弹簧半径
kmax = 10; % 最大平面波波矢数
n = 20; % 基本元胞个数
eps1 = 1; % 材料1介电常数
eps2 = 4; % 材料2介电常数
%% 构造二维弹簧质量声子晶体超材料板
% 构造二维弹簧质量声子晶体超材料板的基本元胞
[x,y] = meshgrid(0:a/(n-1):a,0:a/(n-1):a); % 坐标网格
x = x'; y = y';
lattice1 = ones(size(x)); % 材料1
lattice2 = ones(size(x)); % 材料2
for i = 1:n
for j = 1:n
if mod(i+j,2) == 0
lattice1(i,j) = 0; % 材料1
else
lattice2(i,j) = 0; % 材料2
end
end
end
% 构造弹簧
spring = (x-a/2).^2 + (y-a/2).^2 < r^2;
% 构造弹簧质量声子晶体超材料板
structure = lattice1.*(~spring)*eps1 + lattice2.*(spring)*eps2;
%% 计算平面波展开系数
[Kx,Ky] = meshgrid(-kmax:kmax,-kmax:kmax);
Kx = Kx(:); Ky = Ky(:);
K = [Kx Ky]*2*pi/a;
num_k = length(K)
% 计算平面波展开系数
C = zeros(num_k,num_k);
for i = 1:num_k
for j = 1:num_k
C(i,j) = sum(sum(exp(1i*sum([K(i,:);-K(j,:)]*...
[x(:)';y(:)'])')));
end
end
%% 计算频率-波矢关系曲线
w0 = 2*pi*1e10; % 基频角频率
w = linspace(0.1*w0,2*w0,100); % 计算频率范围
num_w = length(w);
kx = zeros(num_k,num_w);
ky = zeros(num_k,num_w);
for i = 1:num_w
H = zeros(size(x));
for j = 1:num_k
H = H + C(:,j)*exp(1i*K(j,:)*[x(:)';y(:)'])';
end
[Ex,Ey] = gradient(H);
kx(:,i) = w(i)/3e8*Ex(:);
ky(:,i) = w(i)/3e8*Ey(:);
end
%% 绘制频率-波矢关系曲线
figure;
plot(kx,ky,'.','MarkerSize',10);
xlabel('k_x (1/m)');
ylabel('k_y (1/m)');
title('Phononic Crystal Slab');
%% 计算波导模式
% 以k=(0,0)为中心切出一个正方形,作为波导
kx_wg = (abs(kx)<0.2*max(abs(kx(:)))) & (abs(ky)<0.2*max(abs(ky(:))));
kx_wg_center = round(num_k/2);
kx_wg(:,:,kx_wg_center) = 1;
% 计算波导模式
H = zeros(size(x));
for i = 1:num_k
for j = 1:num_w
if kx_wg(i,j,kx_wg_center)
H = H + C(:,i)*exp(1i*K(i,:)*[x(:)';y(:)'])*...
exp(-1i*w(j)*h);
end
end
end
%% 绘制波导模式
figure;
imagesc(abs(H));
axis equal off;
title('Waveguide Mode');
```
程序中使用了二维弹簧质量声子晶体超材料板的基本元胞构造了结构,然后计算了平面波展开系数,进而计算了频率-波矢关系曲线。最后,以k=(0,0)为中心切出一个正方形,作为波导,并计算了波导模式。运行程序后,会分别绘制频率-波矢关系曲线和波导模式的图像。
二维局域共振声子晶体超材料带隙计算matlab程序
二维局域共振声子晶体超材料的带隙计算可以采用有限元或者传输矩阵方法,以下是MATLAB代码实现传输矩阵方法的带隙计算。
首先定义声波在晶体中的传播方向,假设声波沿着x方向传播,则波矢量可以表示为kx,ky=0。
接下来定义传输矩阵的参数,包括声速c,密度rho,晶格常数a,单元大小d,和板厚度h。
```matlab
c = 343; % m/s
rho = 1.225; % kg/m^3
a = 0.05; % m
d = 0.02; % m
h = 0.01; % m
```
然后定义晶体的布局,包括晶格的大小和形状,以及晶体中单元的数量。
```matlab
n = 10; % number of unit cells
N = n*2+1; % number of nodes
L = a*n*2; % length of crystal
```
接下来计算晶体中每个单元的声速和密度,以及每个单元的传输矩阵。
```matlab
for i = 1:n
% acoustic properties and transfer matrix for unit cell
c1 = c*(1+0.1*(i-n-1)); % speed of sound
rho1 = rho*(1+0.1*(i-n-1))^(-1); % density
k1 = 2*pi*c1/a; % wavevector
Z1 = rho1*c1; % acoustic impedance
M1 = [1, 1/Z1; Z1, 1]; % transfer matrix
T1 = expm(1i*k1*d*M1*h); % transfer matrix for unit cell
T(:,:,i) = T1;
end
```
接下来计算整个晶体的传输矩阵,以及计算带隙和色散关系。
```matlab
% transfer matrix for entire crystal
Ttotal = T(:,:,n);
for i = n-1:-1:1
Ttotal = T(:,:,i)*Ttotal;
end
for i = n+1:N-1
Ttotal = T(:,:,i-n)*Ttotal;
end
% band structure
kmax = 2*pi/L;
k = linspace(0, kmax, 500);
w = zeros(size(k));
for i = 1:length(k)
% frequency and wavevector
M = Ttotal(1:2,1:2);
w(i) = c*k(i)*sqrt(det(M));
end
plot(k*a,w/2/pi);
xlabel('ka');
ylabel('f (Hz)');
```
以上是MATLAB程序的基本框架,可以根据具体的问题进行修改和调整。
阅读全文