В этом примере показано, как можно запустить несколько симуляций Simulink®, соответствующих различным тестам в использовании блока Signal Editor объекты SimulationInput и parsim
команда. parsim команда использует Parallel Computing Toolbox™, если это доступно, чтобы запустить параллельные симуляции, в противном случае симуляции запущены в сериале.
Модель sldemo_suspn_3dof
показанный ниже симулирует динамику аппарата на основе дороги - взаимодействие приостановки для различных дорожных профилей. Динамика аппарата получена в трех степенях свободы: вертикальное смещение, крен и тангаж. Дорожные данные о профиле для левых и правых шин импортированы в блок Signal Editor как различные тесты. Подсистема Взаимодействия Дорожной Приостановки вычисляет силы приостановки на транспортное средство в четырех местах шины на основе дорожных данных и текущего состояния транспортного средства. В подсистеме Динамики Тела эти силы и получившиеся моменты продольного и поперечного крена используются, чтобы определить движение транспортного средства в трех степенях свободы: вертикальное смещение, крен и тангаж.
Модель приостановки симулирована с помощью различных дорожных профилей, чтобы определить, удовлетворяет ли проект желаемым целям эффективности. Parallel Computing Toolbox используется, чтобы ускорить эти несколько симуляций, как проиллюстрировано ниже.
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
Определите количество случаев в блоке Signal Editor с помощью параметра NumberOfScenarios блока Signal Editor. Количество случаев используется, чтобы определить количество итераций, чтобы запуститься на шаге 3.
sigEditBlk = [mdl '/Road Profiles']; numCases = str2double(get_param(sigEditBlk,'NumberOfScenarios'));
Создайте массив Simulink.SimulationInput
объекты задать набор симуляций, чтобы запуститься. Каждый объект SimulationInput соответствует одной симуляции и будет храниться как массив в переменной, in
. Параметр маски, ActiveScenario
, задает значение развертки для сценария блока Signal Editor. Активный сценарий установлен для каждой симуляции.
for idx = numCases:-1:1 in(idx) = Simulink.SimulationInput(mdl); in(idx) = setBlockParameter(in(idx), sigEditBlk, 'ActiveScenario', idx); end
Обратите внимание на то, что определение параметра модели на объекте SimulationInput не применяет его к модели сразу. Заданное значение будет применено во время симуляции и вернулось назад к ее исходному значению, если это возможно, после того, как симуляция закончится.
Используйте parsim
функция, чтобы выполнить параллельные симуляции. Массив объектов SimulationInput, in
, созданный на последнем шаге передается в parsim
функционируйте как первый аргумент. Выход от parsim
команда является массивом Simulink.SimulationOutput
объекты, который хранится в переменной out
. Установите опцию 'ShowProgress' на 'on' распечатывать прогресс симуляций на окне команды MATLAB.
out = parsim(in, 'ShowProgress', 'on');
[21-Feb-2021 01:43:41] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). [21-Feb-2021 01:44:30] Starting Simulink on parallel workers... [21-Feb-2021 01:45:05] Configuring simulation cache folder on parallel workers... [21-Feb-2021 01:45:07] Loading model on parallel workers... [21-Feb-2021 01:45:13] Running simulations... [21-Feb-2021 01:45:26] Completed 1 of 20 simulation runs [21-Feb-2021 01:45:26] Completed 2 of 20 simulation runs [21-Feb-2021 01:45:26] Completed 3 of 20 simulation runs [21-Feb-2021 01:45:26] Completed 4 of 20 simulation runs [21-Feb-2021 01:45:26] Completed 5 of 20 simulation runs [21-Feb-2021 01:45:26] Completed 6 of 20 simulation runs [21-Feb-2021 01:45:28] Completed 7 of 20 simulation runs [21-Feb-2021 01:45:29] Completed 8 of 20 simulation runs [21-Feb-2021 01:45:29] Completed 9 of 20 simulation runs [21-Feb-2021 01:45:29] Completed 10 of 20 simulation runs [21-Feb-2021 01:45:29] Completed 11 of 20 simulation runs [21-Feb-2021 01:45:29] Completed 12 of 20 simulation runs [21-Feb-2021 01:45:31] Completed 13 of 20 simulation runs [21-Feb-2021 01:45:31] Completed 14 of 20 simulation runs [21-Feb-2021 01:45:31] Completed 15 of 20 simulation runs [21-Feb-2021 01:45:31] Completed 16 of 20 simulation runs [21-Feb-2021 01:45:31] Completed 17 of 20 simulation runs [21-Feb-2021 01:45:31] Completed 18 of 20 simulation runs [21-Feb-2021 01:45:34] Completed 19 of 20 simulation runs [21-Feb-2021 01:45:34] Completed 20 of 20 simulation runs [21-Feb-2021 01:45:34] Cleaning up parallel workers...
Каждый объект SimulationOutput содержит регистрируемый сигнал наряду с SimulationMetadata
. При выполнении нескольких симуляций с помощью parsim
, ошибки фиксируются так, чтобы последующие симуляции могли продолжить запускаться. Любые ошибки обнаружились бы в ErrorMessage
свойство объекта SimulationOutput.
Постройте вертикальное смещение транспортного средства от различных симуляций, чтобы видеть, как транспортное средство выполнило к различным дорожным профилям. Сигнал зарегистрирован объект SimulationOutput в формате Набора данных. Используйте get
метод, чтобы получить объект timeseries, содержащий время и данные сигнала от каждого элемента out
.
legend_labels = cell(1,numCases); for i = 1:numCases simOut = out(i); ts = simOut.logsout.get('vertical_disp').Values; ts.plot; legend_labels{i} = ['Run ' num2str(i)]; hold all end title('Response of a 3-DoF Suspension Model') xlabel('Time (s)'); ylabel('Vehicle vertical displacement (m)'); legend(legend_labels,'Location','NorthEastOutside');
Наконец, закройте параллельный пул и модель, если они не были ранее открыты.
if(~isModelOpen) close_system(mdl, 0); end delete(gcp('nocreate'));
parsim
| Simulink.SimulationInput
| Simulink.Simulation.Variable