Skill v1.0.2
currentAutomated scan100/100~1 modified
version: "1.0.2" name: simulating-simulink-models description: Configures Simulink simulations non-destructively using SimulationInput objects — parameter overrides without modifying the model, batch sweeps via parsim, custom input signals via Dataset, and simulation data retrieval via logsout. Use when running sim()/parsim() with setVariable, setBlockParameter, setExternalInput, or when performing parameter sweeps and multi-run analysis. Not needed for one-shot simulations without configuration. license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md metadata: author: MathWorks version: "1.2"
Simulating 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 modelin = 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 logsoutdisp(out.logsout.getElementNames);
Accessing logged data
Logged signals are available through out.logsout. Access them directly by name:
% Plot a logged signalplot(out.logsout.get('signalName').Values)% Get time and data separatelysig = 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:Nin(k) = Simulink.SimulationInput('MyModel');in(k) = in(k).setVariable('gain', gains(k));endout = 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:Nin(k) = Simulink.SimulationInput('MyModel');in(k) = in(k).setVariable('gain', gains(k));endout = 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.