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

Этот пример показывает, как запустить несколько моделирований исследования Монте-Карло параллельно при помощи Параллельных вычислений Toolbox™. Параллельное выполнение усиливает несколько ядер вашей хост-машины, чтобы запустить много моделирований более быстро. Эти моделирования могли также быть запущены параллельно на компьютерных кластерах с помощью Распределенных вычислений MATLAB Server™. Этот пример будет работать, даже если Параллельные вычисления Toolbox™ или Распределенные вычисления MATLAB, 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));
[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');

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

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

if(~isModelOpen)
    close_system(mdl, 0);
end
delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.
Была ли эта тема полезной?