exponenta event banner

Параллельное моделирование с использованием Parsim: тестовый сдвиг

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

Обзор модели

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

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

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

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

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

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

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

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

Обратите внимание, что при указании параметра модели в объекте CountingInput он не применяется к модели немедленно. Указанное значение будет применено во время моделирования и возвращено к его исходному значению, если это возможно, после завершения моделирования.

Выполнение моделирования параллельно с использованием Parsim

Используйте parsim для параллельного выполнения моделирования. Массив объектов Input, in, созданный на последнем шаге, передается в parsim в качестве первого аргумента. Выходные данные parsim команда является массивом Simulink.SimulationOutput объекты, которые хранятся в переменной out. Для печати хода моделирования в командном окне MATLAB установите для параметра SunProgress значение on.

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...

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

Результаты графика

Постройте график вертикального перемещения транспортного средства из различных моделей, чтобы увидеть, как транспортное средство работало с различными профилями дорог. Сигнал регистрируется в объекте TravingOutput в формате Dataset. Используйте 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.