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

Этот пример показывает, как запустить несколько моделирований исследования Монте-Карло параллельно при помощи Параллельных вычислений Toolbox™. Параллельное выполнение усиливает несколько ядер вашей хост-машины, чтобы запустить много моделирований более быстро. Эти моделирования могли также быть запущены параллельно на компьютерных кластерах с помощью Распределенных вычислений MATLAB Server™. Этот пример будет работать, даже если Параллельные вычисления Toolbox™ или Распределенные вычисления MATLAB, 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');
[28-Feb-2018 12:16:30] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
connected to 6 workers.
[28-Feb-2018 12:17:37] Loading Simulink on parallel workers...
[28-Feb-2018 12:17:38] Configuring simulation cache folder on parallel workers...
[28-Feb-2018 12:17:38] Loading model on parallel workers...
[28-Feb-2018 12:17:48] Running simulations...
[28-Feb-2018 12:18:01] Completed 1 of 10 simulation runs
[28-Feb-2018 12:18:01] Completed 2 of 10 simulation runs
[28-Feb-2018 12:18:01] Completed 3 of 10 simulation runs
[28-Feb-2018 12:18:01] Completed 4 of 10 simulation runs
[28-Feb-2018 12:18:01] Completed 5 of 10 simulation runs
[28-Feb-2018 12:18:01] Completed 6 of 10 simulation runs
[28-Feb-2018 12:18:05] Completed 7 of 10 simulation runs
[28-Feb-2018 12:18:05] Completed 8 of 10 simulation runs
[28-Feb-2018 12:18:05] Completed 9 of 10 simulation runs
[28-Feb-2018 12:18:05] Completed 10 of 10 simulation runs
[28-Feb-2018 12:18:05] 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.
Была ли эта тема полезной?