Параллельные симуляции с использованием Parsim: протягивание параметра в режиме Normal Mode

Этот пример показывает, как запустить несколько симуляций исследования Монте-Карло параллельно с использованием Parallel Computing Toolbox™. Параллельное выполнение использует несколько ядер вашей хост-машины, чтобы запустить много симуляций быстрее. Эти симуляции также могут выполняться параллельно на компьютерные кластеры с использованием MATLAB Parallel Server™. Этот пример будет работать, даже если Parallel Computing Toolbox™ или MATLAB Parallel Server™ недоступны, но симуляции будут выполняться последовательно.

Исследуйте модель примера

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

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

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

В модели дважды кликните блок Road-Suspension Interaction. Откроется диалоговое окно маски. Параметр маски Front susp. демпфирование устанавливает значение коэффициента демпфирования, 150.

Для блока Body Dynamics найдите сигнал, который выходит из Vertical disp порт вывода. Этот сигнал представляет вертикальное перемещение транспортного средства с течением времени, на которое влияет коэффициент демпфирования подвески.

Щелкните правой кнопкой мыши сигнал и выберите Свойства.

В диалоговом окне Свойства на вкладке Logging and accessibility установлен параметр Log signal data on, указывающий, что сигнал сконфигурирован для логгирования. После концов симуляции можно использовать указанное имя логгирования, vertical_disp, чтобы идентифицировать сигнал и получить выходные данные симуляции от объекта SimulationOutput.

Подготовка входных параметров

Вычислите значения сдвига для коэффициента в виде процентов от проектного значения в диапазоне от 5% до 95% с шагами 10%. Сохраните значения в переменной, Cf_sweep, в базовом рабочем пространстве.

Cf_sweep = Cf*(0.05:0.1:0.95);

Определите количество выполняемых симуляций, что равно количеству значений сдвига. Сохраните число в переменной, numSims.

numSims = length(Cf_sweep);

Использование for цикл к:

  1. Создание Simulink.SimulationInput объекты для модели. Создайте один объект на симуляцию. Сохраните объекты как массив в переменной, in.

  2. Задайте значение сдвига для каждой симуляции. Идентифицируйте целевой параметр маски по его базовому имени, Cf.

for i = numSims:-1:1
    in(i) = Simulink.SimulationInput(mdl);
    in(i) = setBlockParameter(in(i), [mdl '/Road-Suspension Interaction'], 'Cf', num2str(Cf_sweep(i)));
end

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

Выполняйте параллельные симуляции с использованием Parsim

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

out = parsim(in, 'ShowProgress', 'on');
[13-Dec-2018 12:01:49] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
[13-Dec-2018 12:04:34] Starting Simulink on parallel workers...
[13-Dec-2018 12:04:35] Configuring simulation cache folder on parallel workers...
[13-Dec-2018 12:04:36] Loading model on parallel workers...
[13-Dec-2018 12:05:00] Running simulations...
[13-Dec-2018 12:06:24] Completed 1 of 10 simulation runs
[13-Dec-2018 12:06:24] Completed 2 of 10 simulation runs
[13-Dec-2018 12:06:24] Completed 3 of 10 simulation runs
[13-Dec-2018 12:06:38] Completed 4 of 10 simulation runs
[13-Dec-2018 12:06:39] Completed 5 of 10 simulation runs
[13-Dec-2018 12:06:40] Completed 6 of 10 simulation runs
[13-Dec-2018 12:07:18] Completed 7 of 10 simulation runs
[13-Dec-2018 12:07:19] Completed 8 of 10 simulation runs
[13-Dec-2018 12:07:19] Completed 9 of 10 simulation runs
[13-Dec-2018 12:07:30] Completed 10 of 10 simulation runs
[13-Dec-2018 12:07:30] Cleaning up parallel workers...

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

Графическое изображение результатов

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

legend_labels = cell(1,numSims);

for i = numSims:-1:1
        simOut = out(i);
        ts = simOut.logsout.get('vertical_disp').Values;
        % 'ts' is a MATLAB 'timeseries' object that stores the time and
        % data values for the logged 'vertical_disp' signal.
        % Use the 'plot' method of the object to plot the data against the
        % time.
        plot(ts);
        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.