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

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

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

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

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

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

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

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

Щелкните правой кнопкой по сигналу и выберите Properties.

В диалоговом окне Signal Properties, Логгировании и вкладке доступности имеет Логарифмические проверенные данные сигнала, указывая, что сигнал сконфигурирован для логгирования. После концов симуляции можно использовать заданное имя логгирования, 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 функционируйте как первый аргумент. Выход от 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 в формате Набора данных. Используйте 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.