mcpField
M
matlab-optimize-pcb-design

matlab-optimize-pcb-design

github.com/matlab其他1.2k75 次安装1 天前更新
代码仓库

关于 matlab-optimize-pcb-design

这项 MATLAB 技能通过内置 optimize() 函数优化 RF PCB 设计,介绍目标函数、变量边界、S 参数约束和求解器选择,适用于元件参数调整。

主要功能

  1. 01优化目录元件尺寸
  2. 02设置变量边界和 S 参数约束
  3. 03使用 SADEA、TR-SADEA 等求解器
  4. 04定义自定义 S 参数目标
  5. 05调整 PCB 与天线设计

适用场景

  1. 01调整滤波器回波损耗与带宽
  2. 02在约束下缩小功分器板面积
  3. 03初步设计后微调元件几何参数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-optimize-pcb-design

安装后在 Claude Code 中输入/matlab-optimize-pcb-design确认已加载。

附带文件manifest.yaml

详细介绍

优化 RF PCB 设计

重要:始终先使用 optimize()

RF PCB Toolbox 提供了内置的 optimize() 函数,可处理所有标准优化场景。 始终将其作为首选方法——除非有充分证据表明 optimize() 无法满足特定问题的需求,否则请勿直接调用 patternsearch、surrogateopt、fmincon 或 ga 编写手动优化循环。

适用场景

  • 调整滤波器、耦合器或功分器的尺寸,以优化回波损耗、带宽或面积
  • 使用边界和约束对目录对象运行 optimize()
  • 通过 optimize() 接口使用 SADEA/TR-SADEA、patternsearch 或 surrogateopt
  • 根据 S 参数响应定义自定义目标函数

不适用场景

  • 从头设计组件——请先使用 matlab-design-pcb-filter、matlab-design-pcb-coupler 等工具,然后再进行优化
  • 不涉及优化的 EM 分析——请使用 matlab-analyze-em
  • 没有目标函数的参数扫描——直接循环调用 sparameters 即可
  • 不涉及 PCB 的纯天线优化——请参阅 Antenna Toolbox 文档

典型工作流

  1. 优化前: 使用设计技能(matlab-design-pcb-filter、matlab-design-pcb-transmission-line 等)创建初始组件;使用 matlab-analyze-em 获取基线 S 参数
  2. 本技能: 定义目标、边界和约束;运行 optimize()
  3. 优化后: 使用 matlab-analyze-em 验证优化后的设计 → 使用 matlab-integrate-pcb-circuit 将其级联到系统中 → 使用 matlab-write-pcb-layout 导出 Gerber

快速参考

任务代码
设定频率进行设计obj = design(ObjectType, fc)
优化optObj = optimize(obj, freq, objective, props, bounds, solver)
使用约束optimize(..., 'Constraints', constraints)
使用选项optimize(..., 'OptimizerOptions', opts)

算法概览

算法来源最适用场景典型耗时
sadeaAntenna Toolbox(SADEA)默认全局搜索,EM 评估次数较少5--30 分钟
trsadeaAntenna Toolbox(TR-SADEA)信赖域变体,局部细化效果更好5--30 分钟
patternsearchGlobal Optimization Toolbox无导数优化、平滑或含噪声的 EM 目标、微调2--15 分钟
surrogateoptGlobal Optimization Toolbox计算成本高的黑盒函数、多变量、全局最优解10--60 分钟
  • 从 SADEA 开始——除了 Antenna Toolbox 外不需要其他工具箱,而且能很好地处理大多数 RF/PCB 优化问题。
  • 使用 patternsearch 进行微调——SADEA 找到合适区域后,可从 SADEA 的结果出发使用 patternsearch 进行细化。
  • 昂贵模型使用 surrogateopt——它会构建代理模型;当每次 EM 求解成本较高时,样本利用效率更高。

时间与实际注意事项

  • 每次评估的 MoM 仿真:简单组件耗时 2--30 秒,高阶滤波器则需数分钟
  • 行为模式:在优化扫描期间,使用 pcbElement(comp, Behavioral=true) 进行快速解析评估
  • 迭代预算:交互式运行时,将 MaxIterations 设为 20--50 以保持响应速度;批量运行时可设为 100--200
  • 并行计算:如果有 Parallel Computing Toolbox,将 UseParallel=true,配合 patternsearch 和 surrogateopt 可显著加速

design() — 初始尺寸设计

design 函数可针对目标频率确定任意目录组件的尺寸:

ws = design(wilkinsonSplitter, 3e9);
bl = design(couplerBranchline, 5e9);
fh = design(filterHairpin, 2.4e9);
ms = design(microstripLine, 3e9);

这会生成后续优化的起点。所有几何参数都会根据目标频率自动计算。

optimize() 语法

optObj = optimize(obj, freq, objective, properties, bounds, solver, ...
    'Constraints', constraints, 'OptimizerOptions', opts)
参数类型描述
objObjectCatalog 对象(初始设计)
freqScalar or vector用于优化的单个频率或频率向量
objectiveString内置或自定义目标函数名称
propertiesCell array要调整的属性名称
bounds2-element cell{[lower1 lower2 ...]; [upper1 upper2 ...]}
solverString'patternsearch'、'surrogateopt'、'sadea' 或 'trsadea'
constraintsStructS 参数约束(可选的 NV 对)
optsoptimoptions使用 optimoptions() 创建的优化器选项对象

内置目标函数

目标函数字符串最小化/最大化
"minimizeArea"最小化电路板面积
"maximizeBandwidth"最大化 -10 dB 回波损耗带宽
"maximizeReturnLoss"最大化最差情况下的回波损耗
"minimizeBandwidth"缩窄通带

示例:在约束条件下最小化面积

obj = design(wilkinsonSplitter, 3e9);

props = {'SplitLineLength', 'SplitLineWidth', 'Resistance', ...
         'PortLineLength', 'GroundPlaneWidth'};
bounds = {[10e-3 1e-3  50 2e-3  10e-3];    % Lower bounds
          [50e-3 8e-3 100 20e-3 50e-3]};    % Upper bounds (cell array!)

constraints.S11 = '<-10';
constraints.S21 = '>-4';
constraints.S22 = '<-10';
constraints.S12 = '>-4';

optObj = optimize(obj, 3e9, "minimizeArea", props, bounds, ...
    "patternsearch", 'Constraints', constraints);

show(optObj);
sp = sparameters(optObj, linspace(1e9, 5e9, 51), 'SweepOption', 'interp');
rfplot(sp);

% Verify area from shapes
s = shapes(optObj);           % Returns struct of shapes by layer
boardArea = area(s.GroundPlane);
fprintf('Optimized board area: %.2f mm²\n', boardArea * 1e6);
优化后查询面积

对于 Catalog 对象,使用 shapes() 提取各层的形状,然后调用 area():

s = shapes(optObj);              % Catalog object → struct with named shapes
boardArea = area(s.GroundPlane); % Area of the board outline shape

对于 pcbComponent,形状位于 Layers 属性中:

pcb = pcbComponent(optObj);
boardArea = area(pcb.BoardShape);

示例:最大化 Hairpin 滤波器的回波损耗

f = design(filterHairpin, 3e9);

props = {'CoupledLineLength', 'CoupledLineWidth', 'CoupledLineSpacing'};
bounds = {[5e-3 0.5e-3 0.1e-3];
          [40e-3 5e-3 2e-3]};

optF = optimize(f, 3e9, "maximizeReturnLoss", props, bounds, "patternsearch");
show(optF);

S 参数约束

约束使用字符串格式 '<threshold' 或 '>threshold'(单位为 dB):

constraints.S11 = '<-15';    % S11 below -15 dB
constraints.S21 = '>-1';     % S21 above -1 dB (low insertion loss)
constraints.S31 = '<-20';    % Isolation below -20 dB

可以对任意 S 参数索引设置约束。优化器会在整个频率向量范围内评估约束。

自定义目标函数

对于内置集合之外的目标函数,请提供函数句柄:

% Objective function signature: cost = objFcn(obj, freq)
function cost = myObjective(obj, freq)
    sp = sparameters(obj, freq, 'SweepOption', 'interp');
    S21 = squeeze(sp.Parameters(2,1,:));
    S11 = squeeze(sp.Parameters(1,1,:));
    % Minimize worst-case insertion loss while maintaining match
    cost = -min(20*log10(abs(S21)));  % Negative because we maximize |S21|
end

optObj = optimize(obj, fc, @myObjective, props, bounds, "patternsearch");

基于代理模型的优化

对于计算开销较大的 EM 求解,代理优化会构建模型,且样本利用效率更高:

opts = optimoptions('surrogateopt', 'MaxFunctionEvaluations', 50);
optObj = optimize(obj, 3e9, "maximizeReturnLoss", props, bounds, ...
    "surrogateopt", 'OptimizerOptions', opts);

求解器选项

OptimizerOptions NV 对接受为所选求解器创建的 optimoptions 对象:

opts = optimoptions('patternsearch', 'MaxFunctionEvaluations', 100, 'Display', 'off');
optObj = optimize(obj, fc, objective, props, bounds, 'patternsearch', ...
    'OptimizerOptions', opts);

可用求解器:'patternsearch'、'surrogateopt'、'sadea'、'trsadea'。

对于 sadea/trsadea,请传入 struct,而不是 optimoptions 对象:

opts = struct('MaxIterations', 50, 'UseParallel', false);
optObj = optimize(obj, fc, objective, props, bounds, 'sadea', ...
    'OptimizerOptions', opts);

嵌套属性优化

使用点表示法优化嵌套属性:

% Optimize substrate thickness along with width
optObj = optimize(ml, 2.4e9, 'maximizeReturnLoss', ...
    {'Width', 'Substrate.Thickness'}, ...
    {0.001 0.5e-3; 0.01 3e-3}, 'sadea');

选择:optimize() 与手动循环

始终使用 optimize()。 它在内部封装了全部四种求解器(sadea、trsadea、patternsearch、surrogateopt)。直接调用这些求解器没有性能或功能优势。只有在目标函数既非 S 参数目标,也非 EM 目标,且 optimize() 无法表达时,才有理由直接使用求解器(这种情况极为少见)。

优化工作流

  1. 设计初始几何形状:obj = design(Type, fc)
  2. 选择要调整的属性:选择影响最大的 3-6 个尺寸
  3. 设置合理的边界:初始值的 ±50% 是不错的起始范围
  4. 定义约束:确保可行性(至少满足 S11 < -10 dB)
  5. 选择求解器:从 'sadea' 开始;使用 'patternsearch' 进行优化细化
  6. 运行 optimize():optObj = optimize(obj, freq, objective, props, bounds, solver)
  7. 验证:检查优化后的设计在整个频带内是否符合规格

使用 optimize() 优化天线对象

同一个 optimize() 函数也适用于天线对象,并支持天线专用目标函数:

目标函数描述
'maximizeGain'最大化目标频率下的天线增益
'frontToBackRatio'最大化前后瓣比
'maximizeSLL'最大化旁瓣抑制
ant = design(patchMicrostrip, 2.4e9);
optAnt = optimize(ant, 2.4e9, 'maximizeGain', ...
    {'Length', 'Width'}, {[0.02 0.02]; [0.06 0.06]}, 'sadea', ...
    'OptimizerOptions', struct('MaxIterations', 100));
pattern(optAnt, 2.4e9);

这些目标函数仅适用于天线对象。RF PCB Catalog 对象使用上方“内置目标函数”表中的目标函数。

备用方案:直接使用求解器(最后手段)

几乎不需要直接调用求解器——optimize() 已封装 patternsearch、surrogateopt、sadea 和 trsadea。仅当需要优化 optimize() 无法表达的非 EM 目标时,才绕过 optimize()(例如,通过 paretosearch 查找多目标 Pareto 前沿)。

% Extremely rare: multi-objective Pareto (not supported by optimize())
objFcn = @(x) [emObjective(obj, x, freq); thermalObjective(obj, x)];
[xopt, fval] = paretosearch(objFcn, nVars, [], [], [], [], lb, ub);

设计迭代模式

变量命名约定

在优化脚本和迭代设计循环中统一使用这些名称:

sub    % dielectric substrate
cond   % metal conductor
ml     % microstripLine
sl     % stripLine
cpw    % coplanarWaveguide
cm     % coupledMicrostripLine
filt   % any filter object
coup   % any coupler object
split  % any splitter object
comp   % pcbComponent
sp     % sparameters result
freq   % frequency vector
指标提取模式

分析后始终提取数值摘要——Amp 等工具无法解读 MATLAB 图形。

sp = sparameters(comp, freq, 'SweepOption', 'interp');
S = sp.Parameters;
s21_dB = 20*log10(abs(squeeze(S(2,1,:))));
s11_dB = 20*log10(abs(squeeze(S(1,1,:))));
freq_GHz = sp.Frequencies/1e9;

% Key metrics
insertionLoss = max(s21_dB);
returnLoss = min(s11_dB);
[~, idx] = max(s21_dB);
centerFreq = freq_GHz(idx);

% 3 dB bandwidth
aboveCutoff = find(s21_dB >= max(s21_dB) - 3);
bw3dB = NaN;
if ~isempty(aboveCutoff)
    bw3dB = (freq_GHz(aboveCutoff(end)) - freq_GHz(aboveCutoff(1))) * 1e3;
end

fprintf('Center: %.3f GHz | IL: %.2f dB | RL: %.2f dB | BW: %.0f MHz\n', ...
    centerFreq, insertionLoss, returnLoss, bw3dB);
前后对比工作流
% 1. Save baseline metrics before adjusting
oldIL = insertionLoss;
oldBW = bw3dB;

% 2. Adjust property (or run optimize)
filt.FilterOrder = 5;  % was 3

% 3. Re-analyze and extract new metrics
sp_new = sparameters(filt, freq, 'SweepOption', 'interp');
s21_new = 20*log10(abs(squeeze(sp_new.Parameters(2,1,:))));
newIL = max(s21_new);
aboveCutoff = find(s21_new >= max(s21_new) - 3);
newBW = (freq_GHz(aboveCutoff(end)) - freq_GHz(aboveCutoff(1))) * 1e3;

% 4. Compare
fprintf('Before: IL=%.2f dB, BW=%.0f MHz\n', oldIL, oldBW);
fprintf('After:  IL=%.2f dB, BW=%.0f MHz\n', newIL, newBW);
设计调整指南
问题要调整的属性调整方向
通带过宽FilterOrder / Spacing增大阶数 / 减小间距
通带过窄Spacing增大
插入损耗过高Conductor 厚度 / FilterOrder使用真实金属 / 降低阶数
中心频率偏移重新运行 design(filt, newFreq)--
Z0 过高Width增大
Z0 过低Width减小
耦合过紧Spacing增大
耦合过松Spacing减小

注意事项

  1. 切勿编写手动优化循环。 切勿直接调用 patternsearch、surrogateopt、fmincon 或 ga,并用手写的目标函数封装 sparameters。内置的 optimize() 已经封装了这些求解器,并在内部处理属性赋值、边界检查和 S 参数评估。手动编写循环会重复实现这些逻辑,且容易出错,导致代码脆弱。

  2. 电磁求解开销:每次优化迭代都需要完整的电磁求解。使用插值扫描可加快收敛。

  3. 边界宽度:边界过宽会使搜索空间呈指数级增大。初始时将边界设为初始值的 ±30–50%,首轮优化后再缩小范围。

  4. 初始可行性:如果初始设计不满足约束,优化器可能难以进行优化。始终从 design() 生成的初始点开始。

  5. 属性依赖关系:某些属性相互耦合(例如,ArmLength 和 PortLineLength 在空间上重叠)。选择相互独立的属性,以避免生成不可行的几何结构。

  6. 收敛检查:模式搜索可能停滞在局部极小值。使用不同的初始网格运行多次,或使用 surrogateopt 进行全局探索。

  7. 需要工具箱许可证:patternsearch 和 surrogateopt 需要 Global Optimization Toolbox。sadea 和 trsadea 需要 Antenna Toolbox。

  8. 频率可以是标量或向量:optimize 同时接受单个频率和频率向量。向量会在整个频带内评估目标,但会增加每次迭代的求解时间。

  9. 边界是元胞数组:传入的边界应为 {[lb1 lb2 ...]; [ub1 ub2 ...]},而不是数值矩阵。每个元胞元素都是行向量。

  10. OptimizerOptions 格式取决于求解器:对于 patternsearch / surrogateopt,传入 optimoptions('patternsearch', ...)。对于 sadea / trsadea,传入结构体:struct('MaxIterations', 50, 'UseParallel', false)。

  11. 向量属性会扩展边界数量。 执行 design() 后,某些属性会变成向量(例如,4 段滤波器的 filterCoupledLine.CoupledLineLength 是 4 元素向量)。边界必须匹配所有属性的标量总数。如果优化 {'CoupledLineLength','CoupledLineSpacing'},且两者都是 4 元素向量,则边界需要 8 个下限值和 8 个上限值,而不是各 2 个。设置边界前,请检查 numel(obj.PropertyName)。

  12. 插值扫描至少需要 2 个频率点。 sparameters(obj, scalarFreq, 'SweepOption', 'interp') 会报错——插值求解器至少需要 2 个频率点。在 optimize() 外部验证基准 S 参数时,请使用频率向量:sparameters(obj, linspace(f1, f2, N), 'SweepOption', 'interp')。

  13. 变量到达边界可能意味着搜索范围需要扩大。 如果优化后的属性恰好收敛到下限或上限,真正的最优值可能位于搜索范围之外。沿该方向扩大边界后重新运行。

  14. 约束容差。 优化器可能会接受略微违反约束的解(约 0.3 dB)。如果需要严格满足约束,请适当收紧约束(例如,规格为 -10 dB 时使用 '<-10.5')。

相关技能

  • matlab-design-pcb-filter — 要优化的滤波器对象
  • matlab-design-pcb-coupler — 要优化的耦合器/分路器对象
  • matlab-analyze-em — 理解 S 参数结果

Copyright 2026 The MathWorks, Inc.

评论

支持 Markdown