Параллельные симуляции Используя Parsim: развертка параметра в быстром режиме Accelerator

В этом примере показано, как запуститься, несколько симуляций Монте-Карло учатся параллельно при помощи 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);

Setup, чтобы создать быструю цель акселератора

Быстрый исполняемый файл Акселератора для модели является сборкой в вызове SetupFcn с помощью функции buildRapidAcceleratorTarget от Simulink.BlockDiagram пакет. buildRapidAcceleratorTarget функция возвращает набор параметра периода выполнения по умолчанию, который присвоен глобальной переменной, RTP, в SetupFcn и используется на следующем шаге, чтобы изменить значения параметров. Откройте sldemo_parsim_paramsweep_suspn_raccel_setup в редакторе, чтобы смотреть код. Обратите внимание на то, что процесс сборки оптимизирован так, чтобы, если файлы типа "build" уже присутствуют и совместимы с моделью и архитектурой машины затем, это возвратилось рано.

Настройте Несколько Симуляций Используя Объекты SimulationInput

Сохраните значения развертки в переменной, Mb_sweep, в базовом рабочем пространстве.

Mb_sweep = Mb*(0.5:5:45.5);

Определите количество симуляций, чтобы запуститься, который равен количеству значений развертки. Сохраните номер в переменной, numSims.

numSims = length(Mb_sweep);

Используйте for цикл к:

  1. Создайте Simulink. SimulationInput возражает для модели. Создайте один объект на симуляцию. Храните объекты как массив в переменной, in.

  2. Задайте параметры модели на объекте 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

Используйте функцию 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');

Закройте работников MATLAB

Наконец, закройте параллельный пул и модель, если они не были ранее открыты.

if(~isModelOpen)
    close_system(mdl, 0);
end
delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.