% 16元直线阵余割平方赋形方向图设计
clear; clc; close all;
%% 参数设置
N = 16; % 阵元数量
d_lambda = 0.5; % 阵元间距(波长)
theta_min = 10; % 覆盖角度范围起始(度)
theta_max = 70; % 覆盖角度范围结束(度)
theta_scan = 0; % 波束扫描角度(度)
SLL_dB = -30; % 目标副瓣电平(dB)
theta_res = 0.05; % 角度分辨率(度)
% 参数合法性检查
if N <= 0 || d_lambda <= 0 || theta_min >= theta_max || SLL_dB >= 0
error(‘输入参数不合法,请检查参数设置!’);
end
% 角度范围(弧度)
theta_deg = -90:theta_res:90;
theta = theta_deg * pi / 180;
theta_scan_rad = theta_scan * pi / 180;
%% 定义目标余割平方方向图
G_target = zeros(size(theta));
for i = 1:length(theta)
if theta_deg(i) >= theta_min && theta_deg(i) <= theta_max
if abs(sin(theta(i))) < 1e-6
G_target(i) = 1e12; % 避免无穷大
else
G_target(i) = 1 / (sin(theta(i))^2);
end
% 边缘平滑
if theta_deg(i) < theta_min + 3
alpha = (theta_deg(i) – theta_min) / 3;
G_target(i) = G_target(i) * alpha + G_target(i)*0.2*(1-alpha);
elseif theta_deg(i) > theta_max – 3
alpha = (theta_max – theta_deg(i)) / 3;
G_target(i) = G_target(i) * alpha + G_target(i)*0.2*(1-alpha);
end
elseif theta_deg(i) > theta_max
G_target(i) = 0.2 * exp(-0.2*(theta_deg(i)-theta_max));
else
if theta_deg(i) < 3
G_target(i) = 0.05 * exp(0.1*(theta_deg(i)+3));
else
G_target(i) = 0.2 * exp(-0.2*(theta_min-theta_deg(i)));
end
end
end
G_target = G_target / max(G_target);
G_target_dB = 20 * log10(G_target + eps);
%% 定义优化函数
obj_fun = @(x) array_optimization_function(x, N, d_lambda, theta, …
theta_scan_rad, G_target, theta_min, theta_max, SLL_dB, theta_res);
%% 初始值设置
amplitude_init = taylorwin(N, -SLL_dB);
amplitude_init = amplitude_init / max(amplitude_init);
amplitude_init = amplitude_init’; % 转为行向量
phase_init = 0.02 * (1:N) – 0.02*(N+1)/2;
x0 = [amplitude_init, phase_init];
% 关键修复:定义变量下界(lb)和上界(ub)
lb = [zeros(1, N), -ones(1, N)*pi]; % 幅度≥0,相位≥-π
ub = [ones(1, N), ones(1, N)*pi]; % 幅度≤1,相位≤π
%% 优化参数设置
options = optimoptions(‘fmincon’, …
‘Display’, ‘iter’, …
‘MaxFunctionEvaluations’, 3e6, …
‘MaxIterations’, 3e4, …
‘TolFun’, 1e-10, …
‘TolX’, 1e-10, …
‘Algorithm’, ‘sqp’, …
‘OptimalityTolerance’, 1e-10, …
‘ConstraintTolerance’, 1e-10);
%% 执行优化
try
[x_opt, fval, exitflag, output] = fmincon(obj_fun, x0, [], [], [], [], …
lb, ub, [], options);
if exitflag <= 0
warning(‘优化未正常收敛!退出标志: %d’, exitflag);
disp(‘优化输出信息:’);
disp(output);
end

catch ME
error(‘优化过程出错: %s’, ME.message);
end
%% 提取优化结果
amplitude_opt = x_opt(1:N);
phase_opt = x_opt(N+1:2*N);
if any(isnan(amplitude_opt)) || any(isnan(phase_opt))
error(‘优化结果包含NaN值,请检查目标函数’);
end
%% 计算方向图并分析
AF = array_factor(N, d_lambda, theta, theta_scan_rad, amplitude_opt, phase_opt);
AF_normalized = AF / max(AF);
AF_dB = 20 * log10(abs(AF_normalized) + eps);
main_lobe_mask = theta_deg >= theta_min – 8 & theta_deg <= theta_max + 8;
sidelobe_mask = ~main_lobe_mask;
left_sidelobe_mask = sidelobe_mask & (theta_deg < theta_min – 8);
right_sidelobe_mask = sidelobe_mask & (theta_deg > theta_max + 8);
max_left_sidelobe = max(AF_dB(left_sidelobe_mask));
max_right_sidelobe = max(AF_dB(right_sidelobe_mask));
max_sidelobe = max([max_left_sidelobe, max_right_sidelobe]);
%% 结果显示
fprintf(‘优化完成!n’);
fprintf(‘目标副瓣电平: %.2f dBn’, SLL_dB);
fprintf(‘实际左侧最大副瓣: %.2f dBn’, max_left_sidelobe);
fprintf(‘实际右侧最大副瓣: %.2f dBn’, max_right_sidelobe);
fprintf(‘实际最大副瓣: %.2f dBn’, max_sidelobe);
%% 绘制方向图
figure;
plot(theta_deg, AF_dB, ‘LineWidth’, 1.5);
hold on;
plot(theta_deg, G_target_dB, ‘r–‘, ‘LineWidth’, 1.2);
plot([theta_min, theta_min], [min(AF_dB), max(AF_dB)], ‘k–‘);
plot([theta_max, theta_max], [min(AF_dB), max(AF_dB)], ‘k–‘);
plot(theta_deg, ones(size(theta_deg)) * SLL_dB, ‘g–‘);
xlabel(‘角度 (度)’);
ylabel(‘归一化增益 (dB)’);
title(’16元直线阵余割平方方向图’);
grid on;
xlim([-90, 90]);
ylim([min(AF_dB)-5, 5]);
legend(‘优化方向图’, ‘目标方向图’, ‘覆盖起点’, ‘覆盖终点’, ‘目标副瓣’);
%% 子函数:计算阵列因子
function AF = array_factor(N, d_lambda, theta, theta_scan, amplitude, phase)
AF = zeros(size(theta));
k = 2 * pi;
d = d_lambda;
for n = 0:N-1
phase_diff = k * d * n * (sin(theta) – sin(theta_scan)) + phase(n+1);
AF = AF + amplitude(n+1) * exp(1i * phase_diff);
end
end
%% 子函数:优化目标函数
function fval = array_optimization_function(x, N, d_lambda, theta, theta_scan, …
G_target, theta_min, theta_max, SLL_dB, theta_res)
amplitude = x(1:N);
phase = x(N+1:2*N);
if any(amplitude < 0) || any(amplitude > 1)
fval = 1e10;
return;
end
AF = array_factor(N, d_lambda, theta, theta_scan, amplitude, phase);
AF_normalized = abs(AF) / max(abs(AF) + eps);
AF_dB = 20 * log10(AF_normalized + eps);
theta_deg = theta * 180 / pi;
main_lobe_mask = theta_deg >= theta_min & theta_deg <= theta_max;
error_weights = ones(size(AF_normalized));
error_weights(main_lobe_mask) = 5.0;
error_main_lobe = sum(((AF_normalized – G_target).^2) .* error_weights);
sidelobe_mask = ~main_lobe_mask;
sidelobe_values = AF_dB(sidelobe_mask);
sidelobe_penalty = sum(max(0, sidelobe_values – SLL_dB).^4) * 50;
amplitude_smooth_penalty = sum(diff(amplitude).^2) * 0.5;
phase_smooth_penalty = sum(diff(phase).^2) * 0.2;
edge_penalty = (amplitude(1)^2 + amplitude(end)^2) * 2;
fval = error_main_lobe + sidelobe_penalty + …
amplitude_smooth_penalty + phase_smooth_penalty + edge_penalty;
if isnan(fval) || isinf(fval)
fval = 1e10;
end
end