matlab-analyze-em について
matlab-analyze-em は、MATLAB で RF PCB 部品の電磁性能を分析するスキルです。エンジニア向けに、S パラメーター抽出、ソルバー選択、周波数スイープやメッシュの設定、電磁界・電流の可視化を案内します。
主な機能
- 01S パラメーターの抽出とプロット
- 02MoM・FEM ソルバーの比較
- 03補間周波数スイープの設定
- 04メッシュ制御とメモリー推定
- 05電磁界、電流、電荷の可視化
活用シーン
- 01RF PCB 部品の周波数応答の確認
- 02構造に対するソルバー結果の比較
- 03メッシュ精度と計算負荷の調整
- 04電磁界と電流分布の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-analyze-emインストール後、Claude Code で/matlab-analyze-emを入力して読み込まれたか確認します。
同梱ファイルmanifest.yaml
詳細
RF PCB コンポーネントの電磁界性能を解析する
使用する場面
- あらゆる RF PCB コンポーネント(カタログまたはカスタム
pcbComponent)から S パラメーターを抽出する場合 - MoM と FEM のソルバーを比較する場合、または構造に適したソルバーを選択する場合
- 補間スイープや
frequencySweepオブジェクトを使用して、複数周波数の解析を高速化する場合 - 精度と速度のトレードオフを考慮してメッシュ密度を調整する場合
- E/H フィールド、表面電流、または電荷分布を可視化する場合
- 高速な推定や最適化に、動作(解析)S パラメーターモデルを使用する場合
使用しない場面
- カスタム PCB 構造を構築または組み立てる場合 —
matlab-assemble-pcb-layoutを使用してください - 標準的な伝送線路やカタログオブジェクトを設計する場合 —
matlab-design-pcb-transmission-lineを使用してください - 誘電体または金属材料を定義する場合 —
matlab-manage-pcb-materialを使用してください - 複数のコンポーネントを回路にカスケード接続または接続する場合 —
matlab-integrate-pcb-circuitを使用してください - Gerber、ODB++、または Allegro から PCB レイアウトをインポートする場合 —
matlab-read-pcb-layoutを使用してください
一般的なワークフロー
- 事前:
matlab-manage-pcb-material— 基板/導体の設定を行い、設計スキルまたはmatlab-assemble-pcb-layoutを使用してコンポーネントを作成します - このスキル: S パラメーターを抽出し、フィールドと電流を可視化して、性能を検証します
- 事後:
matlab-optimize-pcb-design— 仕様を満たさない場合は寸法を調整します →matlab-integrate-pcb-circuit— より大きなネットワークにカスケード接続します →matlab-write-pcb-layout— Gerber をエクスポートします
クイックリファレンス
| タスク | コード |
|---|---|
| S パラメーター(MoM) | sp = sparameters(obj, freq, 'SweepOption', 'interp') |
| ポート Z0 を指定した S パラメーター | sp = sparameters(obj, freq, 50, 'SweepOption', 'interp') |
| 補間スイープ | sp = sparameters(obj, freq, 50, 'SweepOption', 'interp') |
| 勾配付き補間 | sp = sparameters(obj, freq, 50, 'SweepOption', 'interpWithGrad') |
| S パラメーターをプロット | rfplot(sp) または rfplot(sp, [2 1], 1) |
| 電流分布 | current(obj, fc) |
| 電荷分布 | charge(obj, fc) |
| 給電電流 | feedCurrent(obj, freq) |
| E/H フィールド | [e, h] = EHfields(obj, fc, points) |
| メッシュを設定 | mesh(obj, 'MaxEdgeLength', val) |
| メモリ使用量の推定 | memoryEstimate(obj, fc) |
| FEM ソルバーに切り替え | pcb.SolverType = 'FEM' |
| FEM 境界条件 | s = solver(pcb); s.BoundaryCondition = 'absorbing' |
| 周波数スイープオブジェクト | fsweep = frequencySweep; sp = sparameters(obj, freq, 'SweepOption', fsweep) |
| スイープから有理モデルを作成 | rmodel = getRationalModel(fsweep) |
| メソッドを確認 | methods(obj) |
S パラメーターの抽出
Sparameters 関数は、すべての RF PCB コンポーネントに対する主要な解析メソッドです。
基本的な使い方
obj = design(couplerBranchline, 5e9);
freq = linspace(1e9, 10e9, 101);
sp = sparameters(obj, freq, 'SweepOption', 'interp');
figure;
rfplot(sp);
ポートインピーダンスの指定
sp = sparameters(obj, freq, 50, 'SweepOption', 'interp'); % 50-ohm reference
sp = sparameters(obj, freq, 75, 'SweepOption', 'interp'); % 75-ohm reference
特定の S パラメーターのプロット
rfplot(sp, [2 1], 1); % Plot S21 only
rfplot(sp, [1 1], 1); % Plot S11 only
rfplot(sp, 2:4, 1); % Plot S21, S31, S41 vs port 1
数値データの抽出
sp = sparameters(obj, freq, 'SweepOption', 'interp');
S21_dB = 20*log10(abs(squeeze(sp.Parameters(2,1,:))));
S11_dB = 20*log10(abs(squeeze(sp.Parameters(1,1,:))));
ソルバーの選択
RF PCB Toolbox は、2 種類の電磁界ソルバーをサポートしています。
| ソルバー | プロパティ値 | 適した用途 |
|---|---|---|
| モーメント法(MoM) | 'MoM'(デフォルト) | 平面構造、開放放射体 |
| 有限要素法(FEM) | 'FEM' | シールドされたカタログ要素。SolverType を介して pcbComponent でも使用できます |
FEM への切り替え
FEM は pcbComponent で使用できます。
pcb = pcbComponent(couplerBranchline);
pcb.SolverType = 'FEM';
sp_fem = sparameters(pcb, freq);
FEM 境界条件の設定
SolverType を 'FEM' に設定した後、solver() を使用してソルバーオブジェクトを取得し、境界条件を設定します。
pcb = pcbComponent(catalogObj);
pcb.SolverType = 'FEM';
s = solver(pcb); % Returns em.solvers.fem.FEM object
s.BoundaryCondition = 'absorbing'; % or 'perfectly-matched-layer' (default)
| 境界条件 | 値 | 用途 |
|---|---|---|
| 完全整合層(PML) | 'perfectly-matched-layer'(デフォルト) | 開放放射構造、アンテナ |
| 吸収 | 'absorbing' | シールド筐体、導波管ポート |
注意点: solver(comp, 'SolverType', 'FEM') は「Too many input arguments」というエラーになります。SolverType は pcbComponent のプロパティであり、solver() の引数ではありません。BoundaryCondition は返された FEM ソルバーオブジェクトのプロパティであり、コンポーネントのプロパティではありません。
FEM の前提条件
FEM ソルバー(R2025a で導入)には、次の 2 つの依存関係が必要です。
- Integro-Differential Modeling Framework for MATLAB (IDMF) — Home > Add-Ons から「Integro-Differential Modeling Framework for MATLAB」を検索してインストールします。
matlab.addons.installedAddonsで確認します。 - Windows Subsystem for Linux (WSL) — Windows で必要です。管理者権限の PowerShell プロンプトから
wsl --installを実行してインストールします。wsl --statusで確認します。
WSL が利用可能な場合、pcbComponent を使用してカスタム構造を設計するときに FEM ソルバーを使用できます。シールド付きのカタログ要素では、FEM が自動的に使用されます。
ファイアウォールに関する注意: Windows Defender により、IDMF が使用する PostgreSQL サーバー(<matlabroot>\sys\postgresql\win64\PostgreSQL\bin\postgres.exe)がブロックされる場合があります。初回使用時に FEM の求解が停止する場合は、この原因の可能性をユーザーに伝え、IT/セキュリティポリシーに従ってどのように対応するかはユーザーに委ねてください。ファイアウォール設定を自律的に変更しないでください。
WSL のメモリ調整
WSL に割り当てられるのは、デフォルトではシステム RAM の 50% のみです。大規模な FEM 問題では、メモリ不足エラーが発生することがあります。FEM の求解中に OOM が発生した場合は、C:/Users/%UserProfile%/.wslconfig を編集して WSL のメモリを増やせることをユーザーに伝えてください。
[wsl2]
memory=48GB
swap=8GB
続いて wsl --shutdown と restart-service LxssManager を実行します(管理者権限の PowerShell)。値はシステム仕様に応じて調整してください。IT 部門の関与が必要になる場合があります。この変更はユーザー自身が手動で行うよう依頼し、完了後に再開してください。.wslconfig を自律的に作成または変更しないでください。
FEM 専用プロパティ
SolverType='FEM' の場合、pcbComponent で次の追加プロパティを使用できます。
| プロパティ | 目的 |
|---|---|
Connector | 同軸給電のモデル化のために RFConnector オブジェクトを接続します(デフォルト:50 ohm、InnerRadius=0.5mm、OuterRadius=1.5mm) |
IsShielded | 構造の周囲に金属シールドボックスを追加します(寸法はグランドプレーンと一致) |
FEM の制約
- モードインピーダンスの抽出不可:FEM ソルバーでは
getZEven/getZOddを使用できません。シールド付きの比較には S パラメーターのみを使用してください。 - PEC が必要:FEM には
Conductivity=Inf(PEC)が必要です。有限導電率の金属(Copper など)ではエラーになります。シールド付きとシールドなしを比較する場合は、両方に PEC を使用してください。 - コネクターの間隔:
RFConnectorの外半径(デフォルトは 1.5 mm)が隣接ポート間に収まる必要があります。ポート間隔が狭い場合は、Spacing/GroundPlaneWidthを大きくするか、コネクターのOuterRadiusを小さくしてください。
ソルバーの比較
obj = design(couplerBranchline, 5e9);
freq = linspace(1e9, 5e9, 21);
sp_mom = sparameters(obj, freq, 'SweepOption', 'interp');
pcb = pcbComponent(obj);
pcb.SolverType = 'FEM';
sp_fem = sparameters(pcb, freq); % FEM: interp not applicable
figure;
rfplot(sp_mom); hold on;
rfplot(sp_fem, '--');
legend('MoM', 'FEM');
補間スイープ
複数周波数の解析を高速化するには、周波数ごとに個別に求解する代わりに補間スイープを使用します。特に大規模な構造では、大幅に高速化できます。
基本的な補間
freq = linspace(4.5e9, 5.5e9, 101);
sp = sparameters(obj, freq, 50, 'SweepOption', 'interp');
勾配を使用した補間
勾配情報を使用して、より正確に補間します。
freq = [4.5e9, 5.5e9]; % Only need start/end — solver picks internal points
sp = sparameters(obj, freq, 50, 'SweepOption', 'interpWithGrad');
補間を使用する場合
| シナリオ | 推奨 |
|---|---|
| 狭帯域(< 2:1 BW) | 'interpWithGrad' — 最速かつ高精度 |
| 広帯域(> 2:1 BW) | 'interp' — 広い範囲で安定 |
| デバッグ/単一周波数 | スイープオプションなし(離散) |
| 共振構造 | 離散、または細かい 'interp' グリッド |
frequencySweep オブジェクト(R2025a)
補間ベースのスイープをさらに細かく制御するには、frequencySweep オブジェクトを使用します。誤差許容値、反復回数の上限、有理関数フィッティングを設定できます。デフォルトの 'SweepOption' 設定では不十分な場合に役立ちます。
fsweep = frequencySweep;
fsweep.SweepType = "interp"; % "interp" (default) | "interpWithGrad"
fsweep.ErrTol = -80; % dB, default -80
fsweep.NumFreqs = 100; % points to discretize frequency range, default 100
fsweep.NumIters = 25; % max fitting iterations, default 25
freq = linspace(1e9, 10e9, 200);
sp = sparameters(comp, freq, 'SweepOption', fsweep);
% Extract rational fitting model after the sweep
rmodel = getRationalModel(fsweep);
| プロパティ | デフォルト | 説明 |
|---|---|---|
SweepType | "interp" | 補間タイプです。"interpWithGrad" は勾配情報を使用します |
ErrTol | -80 dB | フィッティング反復間の最大誤差許容値 |
NumFreqs | 100 | 周波数範囲を離散化する点の数 |
NumIters | 25 | フィッティング反復の最大回数 |
メッシュ制御
メッシュ密度は、精度と計算時間に直接影響します。
最大エッジ長の設定
目安:MaxEdgeLength ≤ 最高周波数での λ/8。
fc = 10e9;
lambda = 3e8 / fc;
mesh(obj, 'MaxEdgeLength', lambda/8);
メッシュの表示
figure;
mesh(obj); % Visualize default mesh
figure;
mesh(obj, 'MaxEdgeLength', 1e-3); % Visualize refined mesh
メッシュ設定
自動メッシュと手動メッシュを切り替えます。
meshconfig(obj, 'manual');
mesh(obj, 'MaxEdgeLength', 0.5e-3, 'MinEdgeLength', 0.1e-3);
meshconfig(obj, 'auto'); % Revert to automatic meshing
ソルブ前のチェックポイント:メッシュとメモリを確認する
カタログコンポーネントは高密度の自動メッシュを生成するため、補間スイープを使用しても実行時間が大幅に増えることがあります。フルソルブを開始する前に、必ず確認してください。
fc = 10e9;
memoryEstimate(obj, fc, 'RetainMesh', true); % Estimate RAM; retain mesh for inspection
mesh(obj); % Visualize — check if overly dense
% If too dense or memory too high, coarsen
lambda = physconst('LightSpeed') / fc;
mesh(obj, 'MaxEdgeLength', lambda/6); % Relax from default
memoryEstimate(obj, fc, 'RetainMesh', true); % Re-check after coarsening
'RetainMesh', true オプションを指定すると、生成されたメッシュがオブジェクトに保持され、すぐに可視化できます。このオプションを指定しない場合、推定後にメッシュは破棄されます。
電磁界の可視化
EHfields — 電界と磁界
単一点での電磁界
ind = spiralInductor;
[e, h] = EHfields(ind, 4e9, [0; 0; 1]); % Point at (0,0,1) meters
平面グリッド上の近傍界
fc = 5e9;
Nx = 80; Ny = 60;
xVec = linspace(-0.02, 0.02, Nx);
yVec = linspace(-0.015, 0.015, Ny);
[Xg, Yg] = meshgrid(xVec, yVec);
Zg = 2e-3 * ones(size(Xg)); % Observation plane at z = 2 mm
points = [Xg(:)'; Yg(:)'; Zg(:)'];
[eNear, hNear] = EHfields(obj, fc, points);
eMag2D = reshape(vecnorm(eNear), Ny, Nx);
figure;
imagesc(xVec*1e3, yVec*1e3, 20*log10(eMag2D));
xlabel('x (mm)'); ylabel('y (mm)');
title(sprintf('|E| at z=2mm, f=%.1f GHz', fc/1e9));
colorbar; axis equal tight;
観測平面の選択
| 構造の種類 | 推奨する断面 | 理由 |
|---|---|---|
| 水平トレース(マイクロストリップ、スタブ) | z = h(信号層)の X-Y | トレース面で電磁界が最も強くなるため |
| 垂直構造(ビア) | y = 0 の X-Z | 垂直方向の電磁界の遷移を確認できるため |
| T字接合部/スタブ | スタブ側に寄せた X-Y | 開放端でのフリンジングを捉えるため |
遠方界(デフォルトの球面)
EHfields(obj, fc, ViewField="E"); % Plot only, no output
電流と電荷の分布
表面電流
figure;
current(obj, 5e9); % Linear scale
figure;
current(obj, 5e9, scale="log"); % Log scale for dynamic range
電荷分布
figure;
charge(obj, 5e9); % On metal surface
figure;
charge(obj, 5e9, 'dielectric'); % On dielectric surface
周波数に対する給電電流
freq = linspace(1e9, 10e9, 101);
feedCurrent(obj, freq); % Plots feed current magnitude
伝送線路の RLGC とインピーダンス
pcb2D の断面解析、RLGC の抽出、特性インピーダンス(getZ0)、および伝搬遅延については、matlab-design-pcb-transmission-line を参照してください。
ビヘイビア S パラメーター(高速解析モデル)
ビヘイビアモデルは、フルウェーブ電磁界解析の代わりに閉形式の解析近似を使用して S パラメーターを計算します。桁違いに高速なため、初期検討、回路レベルのシミュレーション、最適化の内部ループに役立ちます。
構文
S = sparameters(obj, freq, Behavioral=true); % Named argument
S = sparameters(obj, freq, 'Behavioral', true); % Name-value pair
対応オブジェクト
ビヘイビアモードは以下に対応しています。
| カテゴリー | オブジェクト |
|---|---|
| カタログコンポーネント | coplanarWaveguide、microstripLine、stripLine、spiralInductor、interdigitalCapacitor、およびほとんどのカタログオブジェクト |
| pcbComponent ラッパー | マイクロストリップのベンド、クロス、ティー、その他の不連続形状を含むすべての pcbComponent |
よくあるパターン
伝送線路の不連続部 — 形状を pcbComponent でラップし、ビヘイビアモデルとフルウェーブを比較します。
m = microstripLine(Length=0.04, Width=2.7e-3, Height=1.6e-3);
shape = bendMitered(Length=[m.Length/2, m.Length/2], ...
Width=[m.Width, m.Width], MiterDiagonal=sqrt(2)*m.Width);
pcb = pcbComponent(shape);
pcb.BoardThickness = m.Substrate.Thickness;
pcb.Layers{2} = m.Substrate;
freq = (1:40)*100e6;
S_fast = sparameters(pcb, freq, Behavioral=true); % ~instant
S_em = sparameters(pcb, freq, 'SweepOption', 'interp'); % Full MoM solve
カタログオブジェクトに直接適用:
cpw = design(coplanarWaveguide, 3e9, LineLength=0.5, Z0=75);
cpw.Conductor = metal("Gold");
S = sparameters(cpw, 3e9, Behavioral=true);
ビヘイビアモデルとフルウェーブの使い分け
| シナリオ | 推奨 |
|---|---|
| インピーダンス/損失の簡易推定 | ビヘイビアモデル |
| 最適化の内部ループ | ビヘイビアモデル |
pcbElement による回路レベルのカスケード接続 | ビヘイビアモデル(pcbElement で Behavioral=true を設定) |
| 最終設計の検証 | フルウェーブ(デフォルト) |
| 複雑な多層構造 | フルウェーブ |
| 近傍界/電流/電荷の可視化 | フルウェーブのみ |
精度の制限
ビヘイビアモデルは理想的なマイクロストリップ/ストリップラインの形状を前提としているため、次の場合はフルウェーブの結果と異なることがあります。
- 高周波(最初の高次モードより上)
- 非常に幅の広い、または狭いトレース(準 TEM 領域の範囲外)
- 複雑な多層基板
- 放射または表面波との結合が顕著な構造
注意点
-
まず周波数範囲を確認してください:解析する周波数範囲を推測しないでください。
sparametersを実行する前に、必ずユーザーに希望する周波数帯を確認してください。誤った推測は解析時間を無駄にし、構造の動作帯域を見逃す原因にもなります。 -
高密度の自動メッシュによるメモリ不足:カタログコンポーネントでは、メッシュが過度に高密度になることがよくあります。全帯域スイープを実行する前に、必ず
memoryEstimate(obj, fc, 'RetainMesh', true)を実行してから、mesh(obj)で可視化してください。メッシュが細かすぎる場合やメモリ使用量が多すぎる場合は、解析前にmesh(obj, 'MaxEdgeLength', lambda/6)で粗くしてください。補間スイープを使用する場合も同様です。メッシュによって周波数ごとの計算コストが決まります。 -
FEMはpcbComponent経由でのみ使用でき、WindowsではWSLが必要です:
SolverTypeプロパティはカタログオブジェクトとpcbComponentの両方にありますが、カタログオブジェクトで'FEM'に設定するとエラーになります(例:「couplerBranchlineではFEMソルバーはサポートされていません」)。最初にカタログオブジェクトを変換してください:pcb = pcbComponent(catalogObj); pcb.SolverType = 'FEM';。さらに、FEMにはWindows Subsystem for Linux(WSL)が必要です。WSLがインストールされていない場合、解析は失敗します。WSLを利用できない場合は、MoM(デフォルト)を使用してください。 -
給電エラー:
sparametersが給電関連のエラーで失敗する場合は、FeedLocationsの座標が金属トレース内にあること、またFeedDiameterがトレース幅に収まっていることを確認してください。給電位置は、トレースの端から少なくともFeedDiameter/2内側に設定してください。 -
補間スイープの周波数範囲:
'interpWithGrad'では、[fmin, fmax]のみを指定できます。内部のサンプル点はソルバーが選択します。'interp'では周波数ベクトル全体を指定してください。ソルバーは計算済みの点の間を補間します。 -
大規模な解析の間はFigureを閉じてください:多数のFigureや大きなグリッドを使うEHfieldsは、セッションのメモリを消費することがあります。対話形式で実行する場合は、解析セクションの間に
close allを使用してください。 -
動作モデルは場、電流、電荷をサポートしません。
current()、charge()、EHfields()は、Behavioralフラグの設定にかかわらず、常に全波ソルバーを使用します。フラグを反映するのはsparameters()のみです。 -
solver()は名前と値の引数を受け取りません:solver(comp, 'SolverType', 'FEM')のように渡さないでください。「入力引数が多すぎます」というエラーになります。最初にcomp.SolverType = 'FEM'を設定してから、s = solver(comp)を呼び出してFEMソルバーオブジェクトを取得してください。境界条件はコンポーネントではなく、そのソルバーオブジェクト(s.BoundaryCondition)で設定します。 -
EHfieldsの点はN×3ではなく3×Nにする必要があります:
EHfields(obj, fc, points)のpoints引数は、各列が[x; y; z]となる3行の行列である必要があります。N×3を渡さないでください。次のように作成します:points = [Xg(:)'; Yg(:)'; Zg(:)']
関連スキル
matlab-manage-pcb-material— 材料特性はソルバーの精度と損失モデルに影響しますmatlab-assemble-pcb-layout— 解析するカスタム構造の作成matlab-design-pcb-transmission-line— 伝送線路パラメーターの抽出、pcb2D、RLGC、クロストークmatlab-design-pcb-passive— インダクター/コンデンサーの動作Sパラメーター
Copyright 2026 The MathWorks, Inc.