Параллельные симуляции Используя 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 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');

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

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

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