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

В этом примере показано, как можно запустить несколько симуляций Simulink®, соответствующих различным тестам в использовании блока Signal Editor объекты SimulationInput и parsim команда. parsim команда использует Parallel Computing Toolbox™, если это доступно, чтобы запустить параллельные симуляции, в противном случае симуляции запущены в сериале.

Обзор модели

Модель sldemo_suspn_3dof, показанная ниже, симулирует динамику аппарата на основе дороги - взаимодействие приостановки для различных дорожных профилей. Динамика аппарата получена в трех степенях свободы: вертикальное смещение, крен и тангаж. Дорожные данные о профиле для левых и правых шин импортированы в блок Signal Editor как различные тесты. Подсистема Взаимодействия Дорожной Приостановки вычисляет силы приостановки на транспортное средство в четырех местах шины на основе дорожных данных и текущего состояния транспортного средства. В подсистеме Динамики Тела эти силы и получившиеся моменты продольного и поперечного крена используются, чтобы определить движение транспортного средства в трех степенях свободы: вертикальное смещение, крен и тангаж.

Модель приостановки симулирована с помощью различных дорожных профилей, чтобы определить, удовлетворяет ли проект желаемым целям эффективности. Parallel Computing Toolbox используется, чтобы ускорить эти несколько симуляций, как проиллюстрировано ниже.

mdl               = 'sldemo_suspn_3dof';
isModelOpen       = bdIsLoaded(mdl);
open_system(mdl);

Настройте Данные, Необходимые для Нескольких Симуляций

Определите количество случаев в блоке Signal Editor с помощью параметра NumberOfScenarios блока Signal Editor. Количество случаев используется, чтобы определить количество итераций, чтобы запуститься на шаге 3.

sigEditBlk = [mdl '/Road Profiles'];
numCases   = str2double(get_param(sigEditBlk,'NumberOfScenarios'));

Создайте массив Simulink.SimulationInput объекты задать набор симуляций, чтобы запуститься. Каждый объект SimulationInput соответствует одной симуляции и будет храниться как массив в переменной, in. Параметр маски, ActiveScenario, задает значение развертки для сценария блока Signal Editor. Активный сценарий установлен для каждой симуляции.

for idx = numCases:-1:1
    in(idx) = Simulink.SimulationInput(mdl);
    in(idx) = setBlockParameter(in(idx), sigEditBlk, 'ActiveScenario', idx);
end

Обратите внимание на то, что определение параметра модели на объекте SimulationInput не применяет его к модели сразу. Заданное значение будет применено во время симуляции и вернулось назад к ее исходному значению, если это возможно, после того, как симуляция закончится.

Запустите параллельные симуляции Используя Parsim

Используйте parsim функция, чтобы выполнить параллельные симуляции. Массив объектов SimulationInput, in, созданный на последнем шаге передается в parsim функционируйте как первый аргумент. Выход от parsim команда является массивом Simulink.SimulationOutput объекты, который хранится в переменной out. Установите опцию 'ShowProgress' на 'on' распечатывать прогресс симуляций на окне команды MATLAB.

out = parsim(in, 'ShowProgress', 'on');
[28-Feb-2018 12:26:20] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
connected to 6 workers.
[28-Feb-2018 12:27:04] Loading Simulink on parallel workers...
[28-Feb-2018 12:27:04] Configuring simulation cache folder on parallel workers...
[28-Feb-2018 12:27:04] Loading model on parallel workers...
[28-Feb-2018 12:27:08] Running simulations...
[28-Feb-2018 12:27:18] Completed 1 of 20 simulation runs
[28-Feb-2018 12:27:18] Completed 2 of 20 simulation runs
[28-Feb-2018 12:27:18] Completed 3 of 20 simulation runs
[28-Feb-2018 12:27:18] Completed 4 of 20 simulation runs
[28-Feb-2018 12:27:18] Completed 5 of 20 simulation runs
[28-Feb-2018 12:27:18] Completed 6 of 20 simulation runs
[28-Feb-2018 12:27:22] Completed 7 of 20 simulation runs
[28-Feb-2018 12:27:22] Completed 8 of 20 simulation runs
[28-Feb-2018 12:27:22] Completed 9 of 20 simulation runs
[28-Feb-2018 12:27:22] Completed 10 of 20 simulation runs
[28-Feb-2018 12:27:22] Completed 11 of 20 simulation runs
[28-Feb-2018 12:27:23] Completed 12 of 20 simulation runs
[28-Feb-2018 12:27:26] Completed 13 of 20 simulation runs
[28-Feb-2018 12:27:26] Completed 14 of 20 simulation runs
[28-Feb-2018 12:27:26] Completed 15 of 20 simulation runs
[28-Feb-2018 12:27:26] Completed 16 of 20 simulation runs
[28-Feb-2018 12:27:26] Completed 17 of 20 simulation runs
[28-Feb-2018 12:27:26] Completed 18 of 20 simulation runs
[28-Feb-2018 12:27:29] Completed 19 of 20 simulation runs
[28-Feb-2018 12:27:29] Completed 20 of 20 simulation runs
[28-Feb-2018 12:27:29] Cleaning up parallel workers...

Каждый объект SimulationOutput содержит регистрируемый сигнал наряду с SimulationMetadata . При выполнении нескольких симуляций с помощью parsim, ошибки фиксируются так, чтобы последующие симуляции могли продолжить запускаться. Любые ошибки обнаружились бы в ErrorMessage свойство объекта SimulationOutput.

Постройте результаты

Постройте вертикальное смещение транспортного средства от различных симуляций, чтобы видеть, как транспортное средство выполнило к различным дорожным профилям. Сигнал зарегистрирован объект SimulationOutput в формате Набора данных. Используйте get метод, чтобы получить объект timeseries, содержащий время и данные сигнала от каждого элемента out.

legend_labels = cell(1,numCases);
for i = 1:numCases
        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.