
Matlab一维光子晶体能带求解:PWE FDTD及传输矩阵法
一维光子晶体能带计算这事儿听起来高大上,实际用Matlab搞起来其实挺接地气的。今天咱们直接
开撸三种常用方法——平面波展开法(PWE)、传输矩阵和FDTD,手把手教你用代码把能带结构抠出来。
**平面波展开法:傅里叶暴力美学**
PWE的核心就是把介电常数和电磁场用平面波展开,最后整出个本征方程。举个栗子,假设咱们有个
周期性排列的介质(比如ε1=4和ε2=9交替),晶格常数a=1。先算介电常数ε的傅里叶系数:
```matlab
N = 21; % 平面波数量,必须奇数
G = (-(N-1)/2:(N-1)/2)*(2*pi/a);
epsilon = zeros(N,N);
for m = 1:N
for n = 1:N
g = G(m) - G(n);
if g == 0
epsilon(m,n) = 0.5*(1/4 + 1/9); % 平均介电常数倒数
else
epsilon(m,n) = (1/4 - 1/9)*1i/(g*a)*(exp(-1i*g*a/2)-1);
end
end
end
```
这段代码在构造介电常数的傅里叶分量矩阵。注意这里用了介电常数倒数的展开,所以最后出来的
矩阵其实是关于1/ε的。接下来构造哈密顿矩阵求本征频率:
```matlab
k = linspace(0, pi/a, 50); % 第一布里渊区
bands = zeros(length(k), N);
for i = 1:length(k)
H = (diag(k(i)+G).^2) * inv(epsilon); % 哈密顿矩阵
bands(i,:) = sqrt(eig(H)); % 频率=sqrt(本征值)