用平面波展开法计算二维弹簧质量局域共振超材料板能带结构MATLAB程序
时间: 2023-09-15 19:16:06 浏览: 97
基于平面波展开法来计算张晶格的能带结构附matlab代码.zip
以下是二维弹簧质量局域共振超材料板能带结构的MATLAB程序,使用平面波展开法进行计算:
```matlab
% 定义常数
a = 1; % 单位胞的长度
d = 0.2*a; % 弹簧的长度
r = 0.2*a; % 弹簧截面的半径
h = 0.1*a; % 超材料板的厚度
c = sqrt(2)/a; % 光速
wmin = 0; % 最小频率
wmax = c*sqrt(2)/a; % 最大频率
dw = 0.01*c*sqrt(2)/a; % 频率步长
% 定义k空间
kx = linspace(-0.5*c/a, 0.5*c/a, 101);
ky = linspace(-0.5*c/a, 0.5*c/a, 101);
[kx, ky] = meshgrid(kx, ky);
% 定义BZ边界
bx = [-0.5*c/a, -0.5*c/a, 0.5*c/a, 0.5*c/a, -0.5*c/a];
by = [-0.5*c/a, 0.5*c/a, 0.5*c/a, -0.5*c/a, -0.5*c/a];
% 计算能带结构
w = zeros(size(kx));
for i = 1:numel(kx)
k = [kx(i), ky(i)];
H = Hamiltonian(k, a, d, r, h);
E = eig(H);
w(i) = min(E);
end
% 绘制能带结构
figure;
hold on;
for i = 1:numel(bx)-1
plot([bx(i), bx(i+1)], [by(i), by(i+1)], 'k');
end
contour(kx, ky, w, linspace(wmin, wmax, 100), 'linewidth', 2);
xlabel('kx');
ylabel('ky');
axis equal;
function H = Hamiltonian(k, a, d, r, h)
% 计算弹簧的刚度和质量
k1 = 2*pi*d*r^2/h;
m1 = pi*r^2*h;
% 计算单位胞的原子位置
R1 = [0, 0];
R2 = [a/2, a/2];
% 计算弹簧的相对位置
r1 = R2 - R1 + [d*cos(k(1)*a), d*cos(k(2)*a)];
r2 = R1 - R2 - [d*cos(k(1)*a), d*cos(k(2)*a)];
% 计算哈密顿矩阵
H = [k1, -k1*exp(-1i*dot(k, r1)); -k1*exp(1i*dot(k, r2)), k1+m1];
end
```
运行程序后,将会得到一个绘制出的能带结构图像。可以根据需要修改程序中的常数以及绘图参数。
阅读全文