Этот пример показывает, как запустить несколько симуляций исследования Монте-Карло параллельно при помощи Parallel Computing Toolbox™. Параллельное выполнение усиливает несколько ядер вашей хост-машины, чтобы запустить много симуляций более быстро. Эти симуляции могли также быть запущены параллельно на компьютерных кластерах с помощью MATLAB Parallel Server™. Этот пример будет работать, даже если Parallel Computing Toolbox™ или MATLAB Parallel Server™ не будут доступны, но симуляции запустятся в сериале.
Модель sldemo_suspn_3dof моделирует динамику аппарата на основе взаимодействия между дорогой и приостановкой для различных дорожных профилей. Модель получает динамику аппарата в трех степенях свободы: вертикальное смещение, список и подача. Блок Signal Editor хранит измеренные дорожные данные о профиле для левых и правых шин как различные тестовые группы. Подсистема Взаимодействия Дорожной Приостановки вычисляет силы приостановки на автомобиль в четырех местах шины на основе дорожных данных и текущего состояния автомобиля. Подсистема Динамики Тела использует эти силы и получившиеся моменты продольного и поперечного крена, чтобы вычислить движение автомобиля в каждой из этих трех степеней свободы.
В этом исследовании Монте-Карло масса автомобиля отличается, чтобы изучить ее эффект на динамику аппарата. Parallel Computing Toolbox используется, чтобы ускорить эти несколько симуляций, как проиллюстрировано ниже.
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);
Быстрый исполняемый файл Акселератора для модели является сборкой в вызове SetupFcn с помощью функции buildRapidAcceleratorTarget от пакета Simulink.BlockDiagram
. Функция buildRapidAcceleratorTarget
возвращает набор параметра периода выполнения по умолчанию, который присвоен глобальной переменной, RTP
, в SetupFcn и используется на следующем шаге, чтобы изменить значения параметров. Откройте sldemo_parsim_paramsweep_suspn_raccel_setup в редакторе, чтобы осмотреть код. Обратите внимание на то, что процесс сборки оптимизирован так, чтобы, если файлы типа "build" уже присутствуют и совместимы с моделью и архитектурой машины затем, это возвратилось рано.
Сохраните значения развертки в переменной, 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', чтобы пропустить актуальные проверки, поскольку нет никаких структурных изменений, сделанных к модели между симуляциями, и те же файлы типа "build" могут использоваться. Обратите внимание на то, что определение параметра модели на объекте SimulationInput не применяет его к модели сразу. Заданное значение будет применено во время симуляции и вернулось назад к ее исходному значению, если это возможно, после того, как симуляция закончится. Осмотрите код в PreSimFcn, sldemo_parsim_paramsweep_suspn_raccel_presim. Это использует modifyTunableParameters от Simulink. Пакет BlockDiagram, чтобы изменить параметр, соответствующий массе автомобиля. Первый аргумент к PreSimFcn всегда является объектом SimulationInput и передается в функцию Simulink®. PreSimFunction добавляет другой параметр модели в объект SimulationInput и возвращает его, чтобы использоваться для симуляции.
Используйте функцию parsim, чтобы выполнить симуляции параллельно. Массив объектов SimulationInput, in
, созданного на последнем шаге, передается в функцию parsim
в качестве первого аргумента. Вывод от команды 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 13:45:57] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Preserving jobs with IDs: 84 86 because they contain crash dump files. You can use 'delete(myCluster.Jobs)' to remove all jobs created with profile local. To create 'myCluster' use 'myCluster = parcluster('local')'. Connected to the parallel pool (number of workers: 6). [13-Dec-2018 13:48:20] Starting Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [13-Dec-2018 13:48:21] Configuring simulation cache folder on parallel workers... [13-Dec-2018 13:48:22] Running SetupFcn on parallel workers... [13-Dec-2018 13:49:34] Loading model on parallel workers... [13-Dec-2018 13:49:45] Running simulations... [13-Dec-2018 13:49:58] Completed 1 of 10 simulation runs [13-Dec-2018 13:49:59] Completed 2 of 10 simulation runs [13-Dec-2018 13:49:59] Completed 3 of 10 simulation runs [13-Dec-2018 13:49:59] Completed 4 of 10 simulation runs [13-Dec-2018 13:49:59] Completed 5 of 10 simulation runs [13-Dec-2018 13:49:59] Completed 6 of 10 simulation runs [13-Dec-2018 13:50:06] Completed 7 of 10 simulation runs [13-Dec-2018 13:50:06] Completed 8 of 10 simulation runs [13-Dec-2018 13:50:06] Completed 9 of 10 simulation runs [13-Dec-2018 13:50:06] Completed 10 of 10 simulation runs [13-Dec-2018 13:50:06] Cleaning up parallel workers...
Каждый объект SimulationOutput содержит регистрируемый сигнал наряду с SimulationMetadata. При выполнении нескольких симуляций с помощью parsim
фиксируются ошибки так, чтобы последующие симуляции могли продолжить запускаться. Любые ошибки обнаружились бы в свойстве ErrorMessage
объекта SimulationOutput.
Постройте вертикальное смещение автомобиля от различных симуляций, чтобы видеть, как, отличаясь масса автомобиля влияла на динамику аппарата. Используйте метод get
объекта SimulationOutput получить время и данные сигнала, содержавшиеся в каждом элементе simout.
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.