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

Этот пример показывает, как можно запустить несколько моделирований Simulink®, соответствующих различным тестам в использовании блока Signal Builder объекты SimulationInput и команда parsim. parsim команда использует Параллельные вычисления 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.
Была ли эта тема полезной?