关于 matlab-optimize-pcb-design
这项 MATLAB 技能通过内置 optimize() 函数优化 RF PCB 设计,介绍目标函数、变量边界、S 参数约束和求解器选择,适用于元件参数调整。
主要功能
- 01优化目录元件尺寸
- 02设置变量边界和 S 参数约束
- 03使用 SADEA、TR-SADEA 等求解器
- 04定义自定义 S 参数目标
- 05调整 PCB 与天线设计
适用场景
- 01调整滤波器回波损耗与带宽
- 02在约束下缩小功分器板面积
- 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 文档
典型工作流
- 优化前: 使用设计技能(
matlab-design-pcb-filter、matlab-design-pcb-transmission-line等)创建初始组件;使用matlab-analyze-em获取基线 S 参数 - 本技能: 定义目标、边界和约束;运行
optimize() - 优化后: 使用
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) |
算法概览
| 算法 | 来源 | 最适用场景 | 典型耗时 |
|---|---|---|---|
sadea | Antenna Toolbox(SADEA) | 默认全局搜索,EM 评估次数较少 | 5--30 分钟 |
trsadea | Antenna Toolbox(TR-SADEA) | 信赖域变体,局部细化效果更好 | 5--30 分钟 |
patternsearch | Global Optimization Toolbox | 无导数优化、平滑或含噪声的 EM 目标、微调 | 2--15 分钟 |
surrogateopt | Global 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)
| 参数 | 类型 | 描述 |
|---|---|---|
obj | Object | Catalog 对象(初始设计) |
freq | Scalar or vector | 用于优化的单个频率或频率向量 |
objective | String | 内置或自定义目标函数名称 |
properties | Cell array | 要调整的属性名称 |
bounds | 2-element cell | {[lower1 lower2 ...]; [upper1 upper2 ...]} |
solver | String | 'patternsearch'、'surrogateopt'、'sadea' 或 'trsadea' |
constraints | Struct | S 参数约束(可选的 NV 对) |
opts | optimoptions | 使用 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() 无法表达时,才有理由直接使用求解器(这种情况极为少见)。
优化工作流
- 设计初始几何形状:
obj = design(Type, fc) - 选择要调整的属性:选择影响最大的 3-6 个尺寸
- 设置合理的边界:初始值的 ±50% 是不错的起始范围
- 定义约束:确保可行性(至少满足 S11 < -10 dB)
- 选择求解器:从
'sadea'开始;使用'patternsearch'进行优化细化 - 运行 optimize():
optObj = optimize(obj, freq, objective, props, bounds, solver) - 验证:检查优化后的设计在整个频带内是否符合规格
使用 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 | 减小 |
注意事项
-
切勿编写手动优化循环。 切勿直接调用
patternsearch、surrogateopt、fmincon或ga,并用手写的目标函数封装sparameters。内置的optimize()已经封装了这些求解器,并在内部处理属性赋值、边界检查和 S 参数评估。手动编写循环会重复实现这些逻辑,且容易出错,导致代码脆弱。 -
电磁求解开销:每次优化迭代都需要完整的电磁求解。使用插值扫描可加快收敛。
-
边界宽度:边界过宽会使搜索空间呈指数级增大。初始时将边界设为初始值的 ±30–50%,首轮优化后再缩小范围。
-
初始可行性:如果初始设计不满足约束,优化器可能难以进行优化。始终从
design()生成的初始点开始。 -
属性依赖关系:某些属性相互耦合(例如,ArmLength 和 PortLineLength 在空间上重叠)。选择相互独立的属性,以避免生成不可行的几何结构。
-
收敛检查:模式搜索可能停滞在局部极小值。使用不同的初始网格运行多次,或使用
surrogateopt进行全局探索。 -
需要工具箱许可证:
patternsearch和surrogateopt需要 Global Optimization Toolbox。sadea和trsadea需要 Antenna Toolbox。 -
频率可以是标量或向量:
optimize同时接受单个频率和频率向量。向量会在整个频带内评估目标,但会增加每次迭代的求解时间。 -
边界是元胞数组:传入的边界应为
{[lb1 lb2 ...]; [ub1 ub2 ...]},而不是数值矩阵。每个元胞元素都是行向量。 -
OptimizerOptions 格式取决于求解器:对于
patternsearch/surrogateopt,传入optimoptions('patternsearch', ...)。对于sadea/trsadea,传入结构体:struct('MaxIterations', 50, 'UseParallel', false)。 -
向量属性会扩展边界数量。 执行
design()后,某些属性会变成向量(例如,4 段滤波器的filterCoupledLine.CoupledLineLength是 4 元素向量)。边界必须匹配所有属性的标量总数。如果优化{'CoupledLineLength','CoupledLineSpacing'},且两者都是 4 元素向量,则边界需要 8 个下限值和 8 个上限值,而不是各 2 个。设置边界前,请检查numel(obj.PropertyName)。 -
插值扫描至少需要 2 个频率点。
sparameters(obj, scalarFreq, 'SweepOption', 'interp')会报错——插值求解器至少需要 2 个频率点。在optimize()外部验证基准 S 参数时,请使用频率向量:sparameters(obj, linspace(f1, f2, N), 'SweepOption', 'interp')。 -
变量到达边界可能意味着搜索范围需要扩大。 如果优化后的属性恰好收敛到下限或上限,真正的最优值可能位于搜索范围之外。沿该方向扩大边界后重新运行。
-
约束容差。 优化器可能会接受略微违反约束的解(约 0.3 dB)。如果需要严格满足约束,请适当收紧约束(例如,规格为 -10 dB 时使用
'<-10.5')。
相关技能
matlab-design-pcb-filter— 要优化的滤波器对象matlab-design-pcb-coupler— 要优化的耦合器/分路器对象matlab-analyze-em— 理解 S 参数结果
Copyright 2026 The MathWorks, Inc.