Параллельные симуляции Используя 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 13:57:10] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Preserving jobs with IDs: 84 86 because they contain crash dump files.
You can use 'delete(myCluster.Jobs)' to remove all jobs created with profile local. To create 'myCluster' use 'myCluster = parcluster('local')'.
Connected to the parallel pool (number of workers: 6).
[13-Dec-2018 13:58:51] Starting Simulink on parallel workers...
[13-Dec-2018 13:58:51] Configuring simulation cache folder on parallel workers...
[13-Dec-2018 13:58:52] Loading model on parallel workers...
[13-Dec-2018 13:59:05] Running simulations...
[13-Dec-2018 13:59:19] Completed 1 of 10 simulation runs
[13-Dec-2018 13:59:19] Completed 2 of 10 simulation runs
[13-Dec-2018 13:59:19] Completed 3 of 10 simulation runs
[13-Dec-2018 13:59:19] Completed 4 of 10 simulation runs
[13-Dec-2018 13:59:19] Completed 5 of 10 simulation runs
[13-Dec-2018 13:59:19] Completed 6 of 10 simulation runs
[13-Dec-2018 13:59:22] Completed 7 of 10 simulation runs
[13-Dec-2018 13:59:22] Completed 8 of 10 simulation runs
[13-Dec-2018 13:59:23] Completed 9 of 10 simulation runs
[13-Dec-2018 13:59:23] Completed 10 of 10 simulation runs
[13-Dec-2018 13:59:23] 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.