В этом примере показано, как запуститься, несколько симуляций Монте-Карло учатся параллельно при помощи 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 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 получить время и данные сигнала, содержавшиеся в каждом элементе 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.