Dielectric substrates, metal conductors, multi-layer stackups, and loss models (FR4, Rogers, Teflon) for RF PCB simulation. TRIGGER: user asks to set up a substrate, define dielectric properties, create a stackup, select a PCB material (FR4, Rogers, Teflon, etc.), or configure metal conductors. Invoke BEFORE writing dielectric() or metal() code — the API for named vs custom materials differs significantly. SKIP: PCB layout assembly (use matlab-assemble-pcb-layout), transmission line design (use matlab-design-pcb-txline), EM analysis (use matlab-analyze-em), importing a PCB file (use matlab-read-pcb-layout).
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-manage-pcb-material
matlab-assemble-pcb-layoutmatlab-analyze-emmatlab-design-pcb-txline (it references this skill for material details)matlab-read-pcb-layoutmatlab-design-pcb-filter, matlab-design-pcb-txline, matlab-assemble-pcb-layout, matlab-model-via) — pass materials to the component| Task | Code |
|------|------|
| Catalog dielectric | sub = dielectric("FR4") |
| Custom dielectric | sub = dielectric(Name="MyMat", EpsilonR=4.4, LossTangent=0.02, Thickness=1.6e-3) |
| Multi-layer dielectric | sub = dielectric("FR4","Teflon"); sub.Thickness = [0.8e-3 0.4e-3] |
| Catalog metal | cond = metal("Copper") |
| Custom metal | cond = metal(Name="MyMetal", Conductivity=5.8e7, Thickness=35e-6) |
| Browse dielectrics | DielectricCatalog |
| Browse metals | MetalCatalog |
| Frequency-dependent | sub = dielectric(..., Frequency=1e9) |
| Get properties at freq | [epsr, tand, f] = getMaterialProperties(sub, freqVector) |
The dielectric object defines substrate properties. Create from the built-in catalog or specify custom parameters.
sub = dielectric("FR4");
sub = dielectric("Teflon");
sub = dielectric("RO4730JXR");
sub = dielectric("TMM10");
To see every name in the catalog:
dc = DielectricCatalog;
disp(dc.Materials)
Available catalog names (R2026a): Air, FR4, Teflon, Foam, Polystyrene, Plexiglas, Fused quartz, E glass, RO4725JXR, RO4730JXR, TMM3, TMM4, TMM6, TMM10, TMM10i, Taconic RF-35. Add custom materials with add(dc, ...) if your material is not listed.
sub = dielectric(Name="Rogers4350B", EpsilonR=3.66, LossTangent=0.0037, Thickness=0.508e-3);
| Property | Description | Units |
|----------|-------------|-------|
| Name | Material identifier | string |
| EpsilonR | Relative permittivity | dimensionless |
| LossTangent | Dielectric loss tangent (tan δ) | dimensionless |
| Thickness | Layer thickness | meters |
| Frequency | Reference frequency for loss tangent | Hz |
| FrequencyModel | 'Constant', 'DjordjevicSarkar', 'MeanDjordjevicSarkar', or 'TableDriven' | — |
dc = DielectricCatalog;
open(dc) % Opens interactive catalog viewer
disp(dc.Materials) % List all materials as a table
s = find(dc, "FR4"); % Returns struct with Name, Relative_Permittivity, Loss_Tangent, Frequency, Comments
The metal object defines conductor properties.
cond = metal("Copper"); % Conductivity=5.96e7, Thickness=35.56e-6 (1 oz)
cond = metal("Aluminium"); % Conductivity=3.77e7, Thickness=762e-6
cond = metal("Gold"); % Conductivity=4.11e7, Thickness=0.2e-6
Available catalog metals (R2026a): PEC, Copper, Aluminium, Gold, Silver, Zinc, Tungsten, Lead, Iron, Steel, Brass.
cond = metal(Name="ThickCopper", Conductivity=5.8e7, Thickness=70e-6);
mc = MetalCatalog;
open(mc) % Opens interactive catalog viewer
disp(mc.Materials) % List all metals as a table
s = find(mc, "Aluminium"); % Returns struct with Name, Conductivity, Thickness, Units, Comments
mline = microstripLine;
mline.Conductor = metal("Copper");
Many RF PCB components support multi-layer dielectric stacks. Pass multiple material names or use vector properties.
sub = dielectric("FR4", "Teflon");
sub.Thickness = [0.0016 0.0008];
sub = dielectric(Name={"FR4","Foam","FR4"}, ...
EpsilonR=[4.4 1.05 4.4], ...
LossTangent=[0.02 0.001 0.02], ...
Thickness=[0.4e-3 0.8e-3 0.4e-3]);
Important: Use a cell array {...} for Name, not a string array [...]. String array concatenation (["FR4","Foam"]) produces a single string "FR4Foam", not a multi-element array.
balun = balunMarchand;
balun.Height = 0.0016;
balun.Substrate = sub;
show(balun);
Multi-layer substrates are supported by all catalog components that have a Substrate or Height property (transmission lines, filters, couplers, splitters, etc.).
When building custom structures with pcbComponent, dielectrics appear as layers in the Layers cell array:
pcb = pcbComponent;
substrate = dielectric("RO4730JXR");
substrate.Thickness = 1.52e-3;
ground = traceRectangular(Length=20e-3, Width=10e-3);
pcb.BoardThickness = substrate.Thickness;
pcb.Layers = {signalTrace, substrate, ground};
For multi-dielectric pcbComponent stacks (5-layer):
sub1 = dielectric(Name="FR4", EpsilonR=4.4, LossTangent=0.02, Thickness=0.8e-3);
sub2 = dielectric(Name="FR4", EpsilonR=4.4, LossTangent=0.02, Thickness=0.8e-3);
pcb.BoardThickness = sub1.Thickness + sub2.Thickness;
pcb.Layers = {topTrace, sub1, groundPlane, sub2, bottomTrace};
For accurate wideband modeling, specify a reference frequency for the loss tangent:
sub = dielectric(Name="FR4", EpsilonR=4.4, LossTangent=0.02, ...
Thickness=1.6e-3, Frequency=1e9);
When Frequency is specified, the FrequencyModel property automatically becomes 'DjordjevicSarkar'. This causal model extrapolates permittivity and loss tangent across the analysis bandwidth, ensuring physically consistent results. Without Frequency, the model uses 'Constant' (frequency-independent).
Available dispersion models:
"Constant" -- (default) frequency-independent permittivity and loss tangent"DjordjevicSarkar" -- wideband causal model, best for PCB substrates"MeanDjordjevicSarkar" -- averaged version of DjordjevicSarkar"TableDriven" -- user-supplied frequency-dependent data from vendor datasheets| Frequency Range | Recommended Model | Use Case |
|-----------------|-------------------|----------|
| DC -- 1 GHz | Constant (default) | Low-frequency, quick estimates |
| 1 -- 40 GHz | DjordjevicSarkar | Most RF PCB designs, FR4/Rogers |
| Broadband with vendor data | TableDriven | Import manufacturer permittivity vs. frequency curves |
| Wideband model fitting | MeanDjordjevicSarkar | Averaged causal model for broadband sweeps |
Use getMaterialProperties() to calculate permittivity and loss tangent at specific frequencies, accounting for the active dispersion model:
sub = dielectric("FR4");
sub.FrequencyModel = "DjordjevicSarkar";
sub.Frequency = 1e9;
% Get properties across a frequency sweep
freq = linspace(1e8, 10e9, 100);
[epsr, tand, f] = getMaterialProperties(sub, freq);
% Plot frequency-dependent permittivity
plot(f/1e9, epsr);
xlabel("Frequency (GHz)"); ylabel("\epsilon_r");
title("FR4 Permittivity (DjordjevicSarkar)");
| Material | EpsilonR | LossTangent | Freq (Hz) | Notes |
|----------|----------|-------------|-----------|-------|
| FR4 | 4.8 | 0.026 | 1e8 | Standard PCB |
| Teflon | 2.1 | 0.0002 | 1e8 | Low-loss PTFE |
| Foam | 1.03 | 0.00015 | 5e7 | Air-like spacer |
| RO4725JXR | 2.55 | 0.0022 | 2.5e9 | Rogers, halogen-free |
| RO4730JXR | 3.0 | 0.0023 | 2.5e9 | Rogers, halogen-free |
| TMM10 | 9.8 | 0.0022 | 1e10 | Ceramic-filled PTFE |
| Taconic RF-35 | 3.5 | 0.0018 | 1.9e9 | Low-loss RF |
Materials not in catalog that must be created manually:
sub = dielectric(Name="RO4003C", EpsilonR=3.38, LossTangent=0.0027, Thickness=0.508e-3);
sub = dielectric(Name="RO4350B", EpsilonR=3.66, LossTangent=0.0037, Thickness=0.508e-3);
| Metal | Conductivity (S/m) | Catalog Thickness | Notes |
|-------|-------------------|-------------------|-------|
| PEC | Inf | 0 | Perfect conductor (default) |
| Copper | 5.96e7 | 35.56 μm (1.4 mil, 1 oz) | Most common |
| Aluminium | 3.77e7 | 762 μm (30 mil) | |
| Gold | 4.11e7 | 0.2 μm | Plating |
| Silver | 6.3e7 | 0.2 μm | Highest conductivity |
pcbComponent.BoardThickness must equal the sum of all dielectric thicknesses. Always assign BoardThickness before Layers — reversing the order triggers a warning and silently overwrites dielectric thicknesses.Conductor, components use perfect electric conductor (lossless). Always assign metal("Copper") for realistic loss modeling.DielectricCatalog. Common substrates like RO4003C, RO4350B, and RO3003 must be created manually from datasheet values. Calling dielectric("RO4003C") will error.Thickness, the number of elements must equal the number of names/EpsilonR values. Mismatched lengths throw an error.1.6e-3, not 1.6.design() creates a component with a default constant dielectric, you can switch to DjordjevicSarkar: obj.Substrate.FrequencyModel = 'DjordjevicSarkar'; obj.Substrate.Frequency = 1e9;. This is useful when the design step doesn't accept frequency-dependent substrates.dielectric("FR4") creates a 1-layer object with fixed catalog properties. For multi-layer pcbComponent stacks, create separate unnamed dielectric objects with explicit EpsilonR, LossTangent, and scalar Thickness for each layer. Do NOT use a named catalog entry when you need to control per-layer thickness in a Layers cell array.viaSingleEnded: When building a multi-layer substrate for viaSingleEnded, the number of dielectric layers must equal N-1 where N is the number of conductive layers in the stackup (e.g., Signal=[1 5], Ground=[3 7] → 4 metal layers → 3 dielectric layers). When using the viaSingleEnded(N) constructor, soldermask layers are added automatically — see matlab-model-via Pitfall #17 for exact requirements. All dielectric property arrays (Name, EpsilonR, LossTangent, Thickness, Frequency) must match in size.matlab-assemble-pcb-layout — Using materials in custom pcbComponent structuresmatlab-analyze-em — How material properties affect solver accuracymatlab-design-pcb-txline — Substrate selection for impedance control----
Copyright 2026 The MathWorks, Inc.
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally.
Frontend development guidelines for React/TypeScript applications. Modern patterns including Suspense, lazy loading, useSuspenseQuery, file organization with features directory, MUI v7 styling, TanStack Router, performance optimization, and TypeScript best practices. Use when creating components, pages, features, fetching data, styling, routing, or working with frontend code.
Next.js 16 Cache Components - PPR, use cache directive, cacheLife, cacheTag, updateTag
| Build Shopify apps, extensions, themes using GraphQL Admin API, Shopify CLI, Polaris UI, and Liquid. "shopify theme", "liquid template", "polaris", "shopify graphql", "shopify webhook", "shopify billing", "app subscription", "metafields", "shopify functions"
Build Gradio web UIs and demos in Python. Use when creating or editing Gradio apps, components, event listeners, layouts, or chatbots.
MANDATORY prerequisite — load this skill BEFORE every `generate_diagram` tool call. NEVER call `generate_diagram` directly without loading this skill first. Trigger whenever the user asks to create, generate, draw, render, sketch, or build a diagram — flowchart, architecture diagram, sequence diagram, ERD or entity-relationship diagram, state diagram or state machine, gantt chart, or timeline. Also trigger when the user mentions Mermaid syntax or wants a system architecture, decision tree, dependency graph, API call flow, auth handshake, schema, or pipeline visualized in FigJam. Routes to type-specific guidance, sets universal Mermaid constraints, and tells you when to use a different diagram type or skip the tool entirely (mindmaps, pie charts, class diagrams, etc.).
Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge.
Algorithmic philosophies are computational aesthetic movements that are then expressed through code. Output .md files (philosophy), .html files (interactive viewer), and .js files (generative algorithms).
Take matlab/matlab-manage-pcb-material from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.