Этот пример показывает, как запустить несколько симуляций исследования Монте-Карло параллельно с использованием Parallel Computing Toolbox™. Параллельное выполнение использует несколько ядер вашей хост-машины, чтобы запустить много симуляций быстрее. Эти симуляции также могут выполняться параллельно на компьютерные кластеры с использованием MATLAB Parallel Server™. Этот пример будет работать, даже если Parallel Computing Toolbox™ или MATLAB Parallel Server™ недоступны, но симуляции будут выполняться последовательно.
Модель sldemo_suspn_3dof моделирует динамику аппарата на основе взаимодействия между дорогой и подвеской для различных профилей дороги. Модель захватывает динамику аппарата в трех степенях свободы: вертикальном перемещении, крене и тангаже. Блок Редактор хранит данные измеренного профиля дороги для левой и правой шин как различные тестовые группы. Подсистема взаимодействия Дорога-Подвеска вычисляет силы подвески на транспортном средстве в четырех местах расположения шин на основе дорожных данных и текущего состояния транспортного средства. Подсистема Body Dynamics использует эти силы и результирующие моменты тангажа и крена, чтобы вычислить движение транспортного средства в каждой из трех степеней свободы.
В этом исследовании Монте-Карло вы смотрите влияние коэффициентов передней подвески на динамику аппарата. Вы запускаете несколько симуляций, каждая с другим значением коэффициента.
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
В модели дважды кликните блок Road-Suspension Interaction. Откроется диалоговое окно маски. Параметр маски Front susp. демпфирование устанавливает значение коэффициента демпфирования, 150
.
Для блока Body Dynamics найдите сигнал, который выходит из Vertical disp
порт вывода. Этот сигнал представляет вертикальное перемещение транспортного средства с течением времени, на которое влияет коэффициент демпфирования подвески.
Щелкните правой кнопкой мыши сигнал и выберите Свойства.
В диалоговом окне Свойства на вкладке Logging and accessibility установлен параметр Log signal data on, указывающий, что сигнал сконфигурирован для логгирования. После концов симуляции можно использовать указанное имя логгирования, vertical_disp
, чтобы идентифицировать сигнал и получить выходные данные симуляции от объекта SimulationOutput.
Вычислите значения сдвига для коэффициента в виде процентов от проектного значения в диапазоне от 5% до 95% с шагами 10%. Сохраните значения в переменной, Cf_sweep
, в базовом рабочем пространстве.
Cf_sweep = Cf*(0.05:0.1:0.95);
Определите количество выполняемых симуляций, что равно количеству значений сдвига. Сохраните число в переменной, numSims
.
numSims = length(Cf_sweep);
Использование for
цикл к:
Создание Simulink.SimulationInput
объекты для модели. Создайте один объект на симуляцию. Сохраните объекты как массив в переменной, in
.
Задайте значение сдвига для каждой симуляции. Идентифицируйте целевой параметр маски по его базовому имени, Cf
.
for i = numSims:-1:1 in(i) = Simulink.SimulationInput(mdl); in(i) = setBlockParameter(in(i), [mdl '/Road-Suspension Interaction'], 'Cf', num2str(Cf_sweep(i))); end
Обратите внимание, что установка параметров блоков на объект SimulationInput не применяет его к модели сразу. Заданное значение будет применено во время симуляции и возвращено к его исходному значению, по возможности, после завершения симуляции.
Используйте parsim
функция для выполнения параллельных симуляций. Массив объектов SimulationInput, in
, созданный на последнем шаге, передается в parsim
функция как первый аргумент. The выхода from the parsim
команда является массивом Simulink.SimulationOutput
объекты, которые хранятся в переменной out
. Установите опцию 'ShowProgress' в ' on ', чтобы напечатать прогресс симуляций в командном окне MATLAB.
out = parsim(in, 'ShowProgress', 'on');
[13-Dec-2018 12:01:49] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). [13-Dec-2018 12:04:34] Starting Simulink on parallel workers... [13-Dec-2018 12:04:35] Configuring simulation cache folder on parallel workers... [13-Dec-2018 12:04:36] Loading model on parallel workers... [13-Dec-2018 12:05:00] Running simulations... [13-Dec-2018 12:06:24] Completed 1 of 10 simulation runs [13-Dec-2018 12:06:24] Completed 2 of 10 simulation runs [13-Dec-2018 12:06:24] Completed 3 of 10 simulation runs [13-Dec-2018 12:06:38] Completed 4 of 10 simulation runs [13-Dec-2018 12:06:39] Completed 5 of 10 simulation runs [13-Dec-2018 12:06:40] Completed 6 of 10 simulation runs [13-Dec-2018 12:07:18] Completed 7 of 10 simulation runs [13-Dec-2018 12:07:19] Completed 8 of 10 simulation runs [13-Dec-2018 12:07:19] Completed 9 of 10 simulation runs [13-Dec-2018 12:07:30] Completed 10 of 10 simulation runs [13-Dec-2018 12:07:30] Cleaning up parallel workers...
Каждый объект SimulationOutput содержит записанный сигнал вместе с SimulationMetadata. При выполнении нескольких симуляций с помощью parsim
ошибки получаются так, что последующие симуляции могут продолжать выполняться. Любые ошибки могут появиться в ErrorMessage
свойство объекта SimulationOutput.
Постройте график вертикального хода транспортного средства из различных симуляций, чтобы увидеть, как изменение коэффициента демпфирования влияет на динамику аппарата. Сигнал регистрируется в объекте SimulationOutput в формате Dataset. Используйте get
метод получения объекта timeseries, содержащего данные времени и сигнала от каждого элемента out
.
legend_labels = cell(1,numSims); for i = numSims:-1:1 simOut = out(i); ts = simOut.logsout.get('vertical_disp').Values; % 'ts' is a MATLAB 'timeseries' object that stores the time and % data values for the logged 'vertical_disp' signal. % Use the 'plot' method of the object to plot the data against the % time. plot(ts); 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'));
Parallel pool using the 'local' profile is shutting down.