98 lines
3.1 KiB
Matlab
98 lines
3.1 KiB
Matlab
clc; clear; close all;
|
|
|
|
% ================= 1. 物理参数定义 =================
|
|
r = 0.1; % 圆柱半径
|
|
eps_r = 5.0; % 相对介电常数
|
|
m = sqrt(eps_r); % 相对折射率 m = ~1.414
|
|
k0 = 50; % 背景真空中波数 (k=6)
|
|
k1 = k0 * m; % 圆柱内部波数
|
|
x_size = k0 * r; % 尺寸参数 x = k0*a
|
|
|
|
% ================= 2. 计算域网格设置 =================
|
|
x_range = 1;
|
|
y_range = 1;
|
|
Nx = 500;
|
|
Ny = 500;
|
|
x_vec = linspace(0, x_range, Nx);
|
|
y_vec = linspace(0, y_range, Ny);
|
|
[X, Y] = meshgrid(x_vec, y_vec);
|
|
|
|
xc = 0.5; yc = 0.5;
|
|
[Phi, R] = cart2pol(X - xc, Y - yc); % 转换为极坐标
|
|
|
|
% ================= 3. 场初始化 =================
|
|
E_scat = zeros(size(X)); % 散射场
|
|
E_int = zeros(size(X)); % 内部场
|
|
|
|
% Wiscombe 截断准则(决定级数展开需要算到第几阶)
|
|
N_trunc = round(x_size + 4.05 * x_size^(1/3) + 2);
|
|
|
|
% ================= 4. 2D Mie 级数展开计算 =================
|
|
% 2D 圆柱级数从 -N 到 +N
|
|
for n = -N_trunc : N_trunc
|
|
|
|
% 边界处的贝塞尔函数值
|
|
J_nx = besselj(n, x_size);
|
|
J_nmx = besselj(n, k1 * r);
|
|
H_nx = besselh(n, 1, x_size);
|
|
|
|
% 边界处的导数值 (利用递推公式 Z_n' = 0.5 * (Z_{n-1} - Z_{n+1}))
|
|
J_nx_p = 0.5 * (besselj(n-1, x_size) - besselj(n+1, x_size));
|
|
J_nmx_p = 0.5 * (besselj(n-1, k1*r) - besselj(n+1, k1*r));
|
|
H_nx_p = 0.5 * (besselh(n-1, 1, x_size) - besselh(n+1, 1, x_size));
|
|
|
|
% 计算 TM 偏振下的散射系数 a_n (对应 E_z)
|
|
num_a = m .* J_nx .* J_nmx_p - J_nx_p .* J_nmx;
|
|
den_a = J_nmx .* H_nx_p - m .* J_nmx_p .* H_nx;
|
|
a_n = num_a ./ den_a;
|
|
|
|
% 计算内部透射系数 c_n
|
|
num_c = J_nx .* H_nx_p - J_nx_p .* H_nx; % 这其实是 Wronskian
|
|
c_n = num_c ./ den_a;
|
|
|
|
% 空间相位因子: i^n * exp(i*n*phi)
|
|
phase = (1i)^n * exp(1i * n * Phi);
|
|
|
|
% 累加外部散射场 (仅在 R >= r 区域有效)
|
|
out_idx = R >= r;
|
|
E_scat(out_idx) = E_scat(out_idx) + a_n .* besselh(n, 1, k0 * R(out_idx)) .* phase(out_idx);
|
|
|
|
% 累加内部总场 (仅在 R < r 区域有效)
|
|
in_idx = R < r;
|
|
E_int(in_idx) = E_int(in_idx) + c_n .* besselj(n, k1 * R(in_idx)) .* phase(in_idx);
|
|
end
|
|
|
|
% ================= 5. 组装全场并绘图 =================
|
|
% 入射平面波: u_inc = exp(i*k0*x)
|
|
phase_shift = exp(1i * k0 * xc);
|
|
E_scat = E_scat .* phase_shift;
|
|
E_int = E_int .* phase_shift;
|
|
|
|
E_inc = exp(1i * k0 * X);
|
|
|
|
% 总场 = 外部(入射 + 散射) + 内部场
|
|
% 组装总场
|
|
E_total = zeros(size(X));
|
|
E_total(R >= r) = E_inc(R >= r) + E_scat(R >= r);
|
|
E_total(R < r) = E_int(R < r);
|
|
%
|
|
% % 提取最大场强做对比
|
|
% max_E_val = max(abs(E_total(:)));
|
|
% fprintf('2D 理论解析解中心区域最大场强 (max |E_total|): %.4f\n', max_E_val);
|
|
|
|
% 绘图
|
|
figure('Color','w');
|
|
pcolor(X, Y, abs(E_total-E_inc));
|
|
max_E_real = max(max(abs(E_total-E_inc)));
|
|
shading interp;
|
|
axis equal tight;
|
|
colorbar;
|
|
colormap jet;
|
|
title(sprintf('2D Cylinder Mie Scattering |E_{scatter}| (Max = %.4f)', max_E_real));
|
|
|
|
% 绘制圆柱边界
|
|
hold on;
|
|
theta_circle = linspace(0, 2*pi, 100);
|
|
plot(xc + r * cos(theta_circle), yc + r * sin(theta_circle), 'k--', 'LineWidth', 1.5);
|
|
hold off;
|