В этом примере показано, как параллельно выполнять несколько имитаций исследования Монте-Карло с помощью Parallel Computing Toolbox™. Параллельное выполнение позволяет использовать несколько ядер хост-машины для более быстрого выполнения многих симуляций. Эти моделирования также могут выполняться параллельно на компьютерных кластерах с использованием Server™ MATLAB Parallel. Этот пример будет работать, даже если параллельная вычислительная Toolbox™ или параллельная Server™ MATLAB недоступны, но моделирование будет выполняться последовательно.
Модель sldemo_suspn_3dof моделирует динамику транспортного средства на основе взаимодействия между дорогой и подвеской для различных профилей дорог. Модель фиксирует динамику транспортного средства в трех степенях свободы: вертикальное перемещение, крен и тангаж. Блок редактора сигналов хранит измеренные данные профиля дороги для левой и правой шин в виде различных групп испытаний. Подсистема взаимодействия дорога-подвеска вычисляет силы подвески на транспортном средстве в четырех местах расположения шин на основе дорожных данных и текущего состояния транспортного средства. Подсистема Body Dynamics использует эти силы и результирующие моменты наклона и крена для вычисления движения транспортного средства в каждой из трех степеней свободы.
В этом исследовании Monte Carlo рассматривается влияние коэффициентов передней подвески на динамику транспортного средства. Выполняется несколько моделирований, каждое из которых имеет разное значение коэффициента.
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);

В модели дважды щелкните на блоке «Взаимодействие дороги и подвески». Откроется диалоговое окно маски. Параметр маски Front susp. демпфирование задает значение коэффициента демпфирования, 150.
Для блока Body Dynamics найдите сигнал, который выходит из Vertical disp аутпорт. Этот сигнал представляет собой вертикальное перемещение транспортного средства во времени, на которое влияет коэффициент демпфирования подвески.
Щелкните правой кнопкой мыши сигнал и выберите «Свойства».
В диалоговом окне Signal Properties на вкладке Logging and accessibility установлены флажки Log signal data, указывающие, что сигнал настроен для ведения журнала. После завершения моделирования можно использовать указанное имя журнала, vertical_disp, для идентификации сигнала и получения выходных данных моделирования из объекта «Выход моделирования».
Рассчитайте значения сдвига для коэффициента в процентах от расчетного значения в диапазоне от 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
Обратите внимание, что при указании параметра блока в объекте CountingInput он не применяется к модели немедленно. Указанное значение будет применено во время моделирования и возвращено к его исходному значению, если это возможно, после завершения моделирования.
Используйте parsim для параллельного выполнения моделирования. Массив объектов Input, in, созданный на последнем шаге, передается в parsim в качестве первого аргумента. Выходные данные parsim команда является массивом Simulink.SimulationOutput объекты, которые хранятся в переменной out. Для печати хода моделирования в командном окне MATLAB установите для параметра SunProgress значение on.
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...
Каждый объект CountingOutput содержит зарегистрированный сигнал вместе с Metadata. При выполнении нескольких моделирований с использованием parsim, регистрируются ошибки, так что последующие моделирования могут продолжать выполняться. Любые ошибки появятся в ErrorMessage свойства объекта ExecutionOutput.
Постройте график вертикального перемещения транспортного средства из различных моделей, чтобы увидеть, как изменение коэффициента демпфирования влияет на динамику транспортного средства. Сигнал регистрируется в объекте TravingOutput в формате 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');

Наконец, закройте параллельный пул и модель, если они не были открыты ранее.
if(~isModelOpen) close_system(mdl, 0); end delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.