Этот пример показывает, как запустить несколько симуляций исследования Монте-Карло параллельно с использованием Parallel Computing Toolbox™. Параллельное выполнение использует несколько ядер вашей хост-машины, чтобы запустить много симуляций быстрее. Эти симуляции также могут выполняться параллельно на компьютерные кластеры с использованием MATLAB Parallel Server™. Этот пример будет работать, даже если Parallel Computing Toolbox™ или MATLAB Parallel Server™ недоступны, но симуляции будут выполняться последовательно.
Модель sldemo_suspn_3dof моделирует динамику аппарата на основе взаимодействия между дорогой и подвеской для различных профилей дороги. Модель захватывает динамику аппарата в трех степенях свободы: вертикальном перемещении, крене и тангаже. Блок Редактор хранит данные измеренного профиля дороги для левой и правой шин как различные тестовые группы. Подсистема взаимодействия Дорога-Подвеска вычисляет силы подвески на транспортном средстве в четырех местах расположения шин на основе дорожных данных и текущего состояния транспортного средства. Подсистема Body Dynamics использует эти силы и результирующие моменты тангажа и крена, чтобы вычислить движение транспортного средства в каждой из трех степеней свободы.
В этом исследовании Монте-Карло масса транспортного средства варьируется для изучения его эффекта на динамику аппарата. Parallel Computing Toolbox используется для ускорения этих нескольких симуляций, как показано ниже.
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
Исполняемый файл Rapid Accelerator для модели строится в вызове SetupFcn с помощью функции buildRapidAcceleratorTarget из Simulink.BlockDiagram
пакет. The buildRapidAcceleratorTarget
функция возвращает набор параметров во время выполнения по умолчанию, который назначается глобальной переменной, RTP
, в SetupFcn и используется на следующем шаге, чтобы изменить значения параметров. Откройте sldemo_parsim_paramsweep_suspn_raccel_setup в редакторе, чтобы просмотреть код. Обратите внимание, что процесс сборки оптимизирован так, чтобы, если файлы сборки уже присутствуют и совместимы с моделью и архитектурой машины, он возвращался раньше.
Сохраните значения сдвига в переменной, Mb_sweep
, в базовом рабочем пространстве.
Mb_sweep = Mb*(0.5:5:45.5);
Определите количество выполняемых симуляций, что равно количеству значений сдвига. Сохраните число в переменной, numSims
.
numSims = length(Mb_sweep);
Использование for
цикл к:
Создайте Simulink объекты .SimulationInput для модели. Создайте один объект на симуляцию. Сохраните объекты как массив в переменной, in
.
Задайте параметры модели на объекте SimulationInput.
for i = numSims:-1:1 in(i) = Simulink.SimulationInput(mdl); in(i) = in(i).setModelParameter('SimulationMode', 'rapid', ... 'RapidAcceleratorUpToDateCheck', 'off'); in(i).PreSimFcn = @(x) sldemo_parsim_paramsweep_suspn_raccel_presim(x, Mb_sweep(i)); end
Объект SimulationInput используется для изменения параметров модели. Для SimulationMode задано использование быстрого ускорителя, а для параметра RapidAcceleratorUpToDateCheck задано значение 'off', чтобы пропустить актуальные проверки, поскольку в модели между симуляциями отсутствуют структурные изменения, и можно использовать одни и те же файлы сборки. Обратите внимание, что установка параметра модели на объекте SimulationInput не применяет его к модели сразу. Заданное значение будет применено во время симуляции и возвращено к его исходному значению, по возможности, после завершения симуляции. Смотрите код в PreSimFcn, sldemo_parsim_paramsweep_suspn_raccel_presim. Он использует modifyTunableParameters из пакета Simulink .BlockDiachm, чтобы изменить параметр, относящийся к массе автомобиля. Первый аргумент в PreSimFcn всегда является объектом SimulationInput и передается в функцию Simulink ®. PreSimFunction добавляет другой параметр модели к объекту SimulationInput и возвращает его для использования в симуляции.
Используйте функцию parsim, чтобы выполнить параллельные симуляции. Массив объектов SimulationInput, in
, созданный на последнем шаге, передается в parsim
функция как первый аргумент. The выхода from the parsim
команда является массивом Simulink.SimulationOutput
объекты, которые хранятся в переменной out
. Установите опцию 'ShowProgress' в ' on ', чтобы напечатать прогресс симуляций в командном окне MATLAB. Как упоминалось ранее, SetupFcn передается как параметр в команду parsim, чтобы создать цель быстрого ускорителя для работников, если это необходимо.
out = parsim(in, 'ShowProgress', 'on', ... 'SetupFcn', @() sldemo_parsim_paramsweep_suspn_raccel_setup(mdl));
[13-Dec-2018 12:26:56] 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:28:03] Starting Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [13-Dec-2018 12:28:03] Configuring simulation cache folder on parallel workers... [13-Dec-2018 12:28:04] Running SetupFcn on parallel workers... [13-Dec-2018 12:29:02] Loading model on parallel workers... [13-Dec-2018 12:29:06] Running simulations... [13-Dec-2018 12:29:13] Completed 1 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 2 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 3 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 4 of 10 simulation runs [13-Dec-2018 12:29:15] Completed 5 of 10 simulation runs [13-Dec-2018 12:29:15] Completed 6 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 7 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 8 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 9 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 10 of 10 simulation runs [13-Dec-2018 12:29:17] Cleaning up parallel workers...
Каждый объект SimulationOutput содержит записанный сигнал вместе с SimulationMetadata. При выполнении нескольких симуляций с помощью parsim
ошибки получаются так, что последующие симуляции могут продолжать выполняться. Любые ошибки могут появиться в ErrorMessage
свойство объекта SimulationOutput.
Постройте график вертикального хода транспортного средства из различных симуляций, чтобы увидеть, как изменяющаяся масса транспортного средства влияет на динамику аппарата. Используйте get
метод объекта SimulationOutput для получения данных о времени и сигнале, содержащихся в каждом элементе моделирования.
legend_labels = cell(1,numSims); for i = 1:numSims 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'));
Parallel pool using the 'local' profile is shutting down.