说实话我对程序能不能成功跑起来都保持怀疑
参数设置
% 波导参数
a = 1.0; % 波导宽度(x方向)
b = 1.0; % 波导高度(y方向)
N = 64; % x/y方向网格数
M = 128; % z方向总层数(波导内部N层 + PML N层)
dz = 2*a/N; % z方向每层厚度(d=2a)
omega = 1.0; % 角频率
E0 = 1.0; % 场强幅度
dx = a/N;
dy = b/N;
delta_z = dz;
% PML参数
sigma = 100.0; % 吸收系数
epsilon_real = 1.0;
mu_real = 1.0;
% 时间参数
dt = 0.01*dx; % 时间步长(满足CFL条件)
T_total = 2000*dt;
T_save = 100*dt; % 保存间隔
num_frames = floor(T_total / T_save);
% 初始化三维电场矩阵(实部和虚部分开存储)
E_x = zeros(N+1, N+1, M+1);
E_y = zeros(N+1, N+1, M+1);
H_x = zeros(N+1, N+1, M+1);
H_y = zeros(N+1, N+1, M+1);
% 初始条件:z=0平面(入口)设置E_y=E0*e^{iωt}
for x = 1:N
for y = 1:N
% 中心点(x=0,y=0对应网格索引x=(N+1)/2, y=(N+1)/2
if x == (N+1)/2 && y == (N+1)/2
E_y(x, y, 1) = E0 * exp(i*omega*dt);
else
E_y(x, y, 1) = 0;
end
end
end
% 理想导体边界条件:E_x(x=±a/2, y, z)=0,E_y(x, y=±b/2, z)=0
for z = 1:M
E_x(1, :, z) = 0;
E_x(N, :, z) = 0;
E_y(:, 1, z) = 0;
E_y(:, N, z) = 0;
end
完美匹配层设置
function [epsilon, mu] = get_pml(z_layer)
% PML层数从N+1到M(总M层)
if z_layer <= N
epsilon = epsilon_real;
mu = mu_real;
else
% 虚部损耗随进入深度线性增加
depth = (z_layer - N)*delta_z;
sigma_pml = sigma * depth;
epsilon = epsilon_real + 1i*sigma_pml;
mu = mu_real + 1i*sigma_pml;
end
end
时间迭代
for t = 2:T_total/dt
time_step = t*dt;
% 更新磁场H
for x = 1:N
for y = 1:N
for z = 1:M
[epsilon, mu] = get_pml(z);
% H_x更新(基于E_y的左右差分)
H_x(x, y, z) += i*omega*epsilon/(2*dx) * (E_y(x+1, y, z) - E_y(x-1, y, z));
% H_y更新(基于E_x的上下差分)
H_y(x, y, z) += i*omega*epsilon/(2*dy) * (E_y(x, y+1, z) - E_y(x, y-1, z));
end
end
end
% 强制输入平面边界条件:E_y(x=0,y=0,z=1) = E0*e^{iωt}
for x = 1:N
for y = 1:N
if x == (N+1)/2 && y == (N+1)/2
E_y(x, y, 1) = E0 * exp(i*omega*time_step);
end
end
end
% 更新电场E
for x = 1:N
for y = 1:N
for z = 1:M
[epsilon, mu] = get_pml(z);
% E_x更新(基于H_y的前后时间步)
E_x(x, y, z) -= i*omega*mu/(2*dx) * (H_y(x, y, z+1) - H_y(x, y, z-1));
% E_y更新(基于H_x的左右差分)
E_y(x, y, z) -= i*omega*mu/(2*dy) * (H_x(x+1, y, z) - H_x(x-1, y, z));
end
end
end
% 边界条件维护:E_x/x=±a/2和E_y/y=±b/2始终为0
for z = 1:M
E_x(1, :, z) = 0;
E_x(N, :, z) = 0;
E_y(:, 1, z) = 0;
E_y(:, N, z) = 0;
end
% 保存动画帧(xoz平面,y= (N+1)/2)
if mod(t, T_save/dt) == 0
frame_time = t*dt;
y_center = (N+1)/2;
E_z_slice = zeros(N+1, M+1);
for x = 1:N+1
for z = 1:M+1
E_z_slice(x, z) = real(E_y(x, y_center, z));
end
end
% 绘制并保存图像
figure;
imagesc(x_range, z_range, E_z_slice);
colorbar;
title(sprintf('Time: %.2f', frame_time));
saveas(gcf, sprintf('frame_%d.png', num_frames));
num_frames++;
end
end
动画生成
% 读取保存的图像并生成gif
frames = dir('frame_*.png');
image = [];
for frame = frames
img = imread(frame.name);
image = cat(3, image, img);
end
imwrite(image, 'wave_animation.gif', 'Loop', 0, 'Delay', 0.1);