Этот пример показывает, как запустить несколько симуляций исследования Монте-Карло параллельно при помощи 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
для:
Создайте объекты Simulink.SimulationInput
для модели. Создайте один объект на симуляцию. Храните объекты как массив в переменной, in
.
Задайте значение развертки для каждой симуляции. Идентифицируйте целевой параметр маски его базовым именем, 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
, чтобы выполнить симуляции параллельно. Массив объектов 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');
Наконец, закройте параллельный пул и модель, если они не были ранее открыты.
if(~isModelOpen) close_system(mdl, 0); end delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.