Этот пример показывает, как запустить несколько моделирований исследования Монте-Карло параллельно при помощи Параллельных вычислений Toolbox™. Параллельное выполнение усиливает несколько ядер вашей хост-машины, чтобы запустить много моделирований более быстро. Эти моделирования могли также быть запущены параллельно на компьютерных кластерах с помощью Распределенных вычислений MATLAB Server™. Этот пример будет работать, даже если Параллельные вычисления Toolbox™ или Распределенные вычисления MATLAB, 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));
[28-Feb-2018 12:22:22] Checking for availability of parallel pool... [28-Feb-2018 12:22:22] Loading Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [28-Feb-2018 12:22:23] Configuring simulation cache folder on parallel workers... [28-Feb-2018 12:22:23] Running SetupFcn on parallel workers... [28-Feb-2018 12:22:54] Loading model on parallel workers... [28-Feb-2018 12:22:55] Running simulations... [28-Feb-2018 12:23:00] Completed 1 of 10 simulation runs [28-Feb-2018 12:23:00] Completed 2 of 10 simulation runs [28-Feb-2018 12:23:00] Completed 3 of 10 simulation runs [28-Feb-2018 12:23:00] Completed 4 of 10 simulation runs [28-Feb-2018 12:23:00] Completed 5 of 10 simulation runs [28-Feb-2018 12:23:00] Completed 6 of 10 simulation runs [28-Feb-2018 12:23:02] Completed 7 of 10 simulation runs [28-Feb-2018 12:23:03] Completed 8 of 10 simulation runs [28-Feb-2018 12:23:03] Completed 9 of 10 simulation runs [28-Feb-2018 12:23:03] Completed 10 of 10 simulation runs [28-Feb-2018 12:23:03] 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.