About simulating-simulink-models
simulating-simulink-models is a skill for configuring and running Simulink simulations. It is intended for model users who need parameter overrides, custom inputs, or batch runs, and provides access to logged output signals.
Key features
- 01Override simulation parameters non-destructively
- 02Pass custom input signals
- 03Run batch or parallel simulations
- 04Use Fast Restart for iterative runs
- 05Read logged signal data
Use cases
- 01Compare model outputs across parameter values
- 02Provide custom signals to a model
- 03Run a batch parameter sweep
- 04Extract logged signals for analysis
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ matlab/ simulink-agentic-toolkit --skill simulating-simulink-modelsAfter installing, type/simulating-simulink-modelsin Claude Code to confirm it loaded.
Bundled filesmanifest.yaml
Details
From the project READMESimulating Simulink Models with the sim Command
Use this skill when you need to configure a simulation non-destructively — parameter overrides, custom inputs, batch execution, or structured output access. For persistent, reusable pass/fail behavioral testing (especially of individual subsystems), use testing-simulink-models instead. For trivial one-shot simulations without configuration, a direct sim() call suffices without this skill.
When to Use
- Overriding model or block parameters non-destructively (setVariable, setBlockParameter, setModelParameter) — without modifying the .slx file
- Passing custom input signals to root-level Inport blocks via setExternalInput with a Dataset
- Running parameter sweeps or batch simulations (SimulationInput arrays, parsim, Fast Restart)
- Accessing logged signal data (logsout) for analysis after simulation
When NOT to Use
- Trivial one-shot simulations without parameter overrides or custom inputs — a direct
sim('ModelName')call works without this skill - Writing declarative Gherkin-based tests → use
testing-simulink-models - Testing an individual subsystem or component → use
testing-simulink-models(requires Simulink Test; auto-creates a harness, compiles only the subsystem — much faster thansim()which always compiles the entire model) - Adding, connecting, or deleting blocks → use
building-simulink-models - Checking model structure for unconnected ports → use
model_checktool directly - Generating requirements from model behavior → use
generate-requirement-drafts
Minimal working pattern
Always simulate using Simulink.SimulationInput and Simulink.SimulationOutput:
in = Simulink.SimulationInput('MyModel');
in = in.setModelParameter('StopTime', '10');
out = sim(in);
Setting parameters
Use SimulationInput methods to configure the simulation:
% Model-level parameters (StopTime, SolverType, SimulationMode, etc.)
in = in.setModelParameter('StopTime', '10', 'SolverType', 'Fixed-step');
% Block parameters — resolve path from blk_X ID (never type block names manually)
blkPath = Simulink.ID.getFullName('MyModel:5');
in = in.setBlockParameter(blkPath, 'Gain', '5');
% MATLAB workspace variables used by the model
in = in.setVariable('Kp', 1.2);
Input signals
Pass input signals through Inport blocks using a Simulink.SimulationData.Dataset. Elements are matched to Inport blocks by index position — the first element maps to the Inport with port number 1, the second to port number 2, and so on.
dt = 0.01;
N = 1000;
t = dt*(0:N)';
u = sin(2*pi*t);
ts = timeseries(u, t);
ds = Simulink.SimulationData.Dataset;
ds{1} = ts;
in = in.setExternalInput(ds);
out = sim(in);
You can also use timetable as an input format:
secs = seconds(t);
tt = timetable(secs, u);
ds = Simulink.SimulationData.Dataset;
ds{1} = tt;
in = in.setExternalInput(ds);
Discovering logged data
First, discover what kinds of logged data the model produces using who, then inspect signal names within logsout:
in = Simulink.SimulationInput('MyModel');
out = sim(in);
% See what logging properties exist (logsout, yout, tout, etc.)
who(out)
% List individual signal names within logsout
disp(out.logsout.getElementNames);
Accessing logged data
Logged signals are available through out.logsout. Access them directly by name:
% Plot a logged signal
plot(out.logsout.get('signalName').Values)
% Get time and data separately
sig = out.logsout.get('signalName').Values;
plot(sig.Time, sig.Data)
Multiple simulations
When running many simulations, create an array of Simulink.SimulationInput objects:
in = repmat(Simulink.SimulationInput('MyModel'),N,1);
for k = 1:N
in(k) = Simulink.SimulationInput('MyModel');
in(k) = in(k).setVariable('gain', gains(k));
end
out = sim(in);
To enable fast restart for iterative sweeps (compiles the model only once):
out = sim(in, 'UseFastRestart', 'on');
Parallel simulation (parsim)
To run multiple simulations in parallel, use parsim instead of looping over sim:
for k = 1:N
in(k) = Simulink.SimulationInput('MyModel');
in(k) = in(k).setVariable('gain', gains(k));
end
out = parsim(in);
parsim also supports 'UseFastRestart','on' for faster batch runs.
Guardrails
- Never use
set_param,load_system, oropen_systemto drive simulation —SimulationInputreplaces all of these. - Never wrap
SimulationOutputaccess intry-catchorisfield—simeither returns a valid object or throws.SimulationOutputhas noisfieldmethod. - Never create unnecessary intermediate variables for logged data — access directly via
out.logsout.get('name').Values. - Always use
in/outas variable names forSimulationInput/SimulationOutput. - Always use
setExternalInputwith aDataset— don't pass comma-separated lists of variables.
Copyright 2026 The MathWorks, Inc.