mcpField
M
matlab-optimize-pcb-design

matlab-optimize-pcb-design

github.com/matlabその他1.2k75 回インストール1 日前に更新
リポジトリ

matlab-optimize-pcb-design について

組み込みのoptimize()関数を使ってRF PCB設計を最適化するMATLABスキルです。目的関数、変数の境界、Sパラメーター制約、ソルバー選択を扱い、部品の調整に利用できます。

主な機能

  1. 01カタログ部品の寸法最適化
  2. 02変数境界とSパラメーター制約の設定
  3. 03SADEA、TR-SADEAなどのソルバー利用
  4. 04独自のSパラメーター目的関数
  5. 05PCBとアンテナ設計の調整

活用シーン

  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)
引数型説明
objオブジェクトカタログオブジェクト(初期設計)
freqスカラーまたはベクトル最適化に使用する単一の周波数または周波数ベクトル
objective文字列組み込みまたはカスタムの目的関数名
propertiesセル配列変更するプロパティ名
bounds2要素のセル{[lower1 lower2 ...]; [upper1 upper2 ...]}
solver文字列'patternsearch'、'surrogateopt'、'sadea'、または 'trsadea'
constraints構造体S パラメーター制約(オプションの NV ペア)
optsoptimoptionsoptimoptions() で作成するオプティマイザーオプションオブジェクト

組み込み目的関数

目的関数の文字列最小化/最大化する対象
"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);
最適化後の面積を取得する

カタログオブジェクトの場合、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);

例:ヘアピンフィルターのリターンロスを最大化する

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 では、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() を使ってください。 これは 4 つのソルバー(sadea、trsadea、patternsearch、surrogateopt)を内部でラップしています。これらのソルバーを直接呼び出しても、性能面でも機能面でも利点はありません。ソルバーを直接使うのが妥当なのは、optimize() では表現できない、S パラメーターや EM に関係しない目的関数を扱う場合だけです(非常にまれです)。

最適化ワークフロー

  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 カタログオブジェクトでは、上記の「組み込み目的関数」表にある目的関数を使用します。

代替手段:ソルバーを直接使用する(最終手段)

ソルバーを直接呼び出す必要はほとんどありません。optimize() はすでに patternsearch、surrogateopt、sadea、trsadea をラップしています。optimize() を使わないのは、表現できない EM 以外の目的関数(例:paretosearch による多目的パレートフロント)を扱う場合に限ります。

% 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. 手動で最適化ループを書かないでください。 sparameters をラップする目的関数を自作して、patternsearch、surrogateopt、fmincon、ga を直接呼び出してはいけません。組み込みの 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.

コメント