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

Исполняемый файл Rapid Accelerator для модели создается в вызове SetupFcn с помощью функции buildRapidAccelerateTarget из Simulink.BlockDiagram пакет. buildRapidAcceleratorTarget функция возвращает набор параметров времени выполнения по умолчанию, который назначен глобальной переменной, RTP, в SetupFcn и используется на следующем шаге для изменения значений параметров. Откройте sldemo_parsim_paramsweep_suspn_raccel_setup в редакторе для проверки кода. Обратите внимание, что процесс сборки оптимизирован таким образом, что если файлы сборки уже присутствуют и совместимы с архитектурой модели и машины, то он возвращается раньше.
Сохраните значения сдвига в переменной, Mb_sweep, в базовом рабочем пространстве.
Mb_sweep = Mb*(0.5:5:45.5);
Определите количество выполняемых моделирований, равное количеству значений сдвига. Сохраните число в переменной, numSims.
numSims = length(Mb_sweep);
Использовать for цикл для:
Создание объектов Simulink.Input для модели. Создание одного объекта для каждого моделирования. Храните объекты как массив в переменной, in.
Задайте параметры модели для объекта «Ввод данных».
for i = numSims:-1:1 in(i) = Simulink.SimulationInput(mdl); in(i) = in(i).setModelParameter('SimulationMode', 'rapid', ... 'RapidAcceleratorUpToDateCheck', 'off'); in(i).PreSimFcn = @(x) sldemo_parsim_paramsweep_suspn_raccel_presim(x, Mb_sweep(i)); end
Объект Input используется для изменения параметров модели. Параметр RapidAccelerateUpToDateCheck имеет значение off, чтобы пропустить последние проверки, так как между моделированием и тем же файлом сборки в модели не вносятся структурные изменения. Обратите внимание, что при указании параметра модели в объекте CountingInput он не применяется к модели немедленно. Указанное значение будет применено во время моделирования и возвращено к его исходному значению, если это возможно, после завершения моделирования. Проверьте код в PreSimFcn, sldemo_parsim_paramsweep_suspn_raccel_presim. Для изменения параметра, соответствующего массе транспортного средства, используется modifyTunableParameters из пакета Simulink.BlockDiergy. Первым аргументом для PreSimFcn всегда является объект ExecutionInput, который передается в функцию Simulink ®. Функция PreSimFunction добавляет другой параметр модели к объекту CountingInput и возвращает его для использования при моделировании.
Используйте функцию parsim для параллельного выполнения моделирования. Массив объектов Input, in, созданный на последнем шаге, передается в parsim в качестве первого аргумента. Выходные данные parsim команда является массивом Simulink.SimulationOutput объекты, которые хранятся в переменной out. Для печати хода моделирования в командном окне MATLAB установите для параметра SunProgress значение on. Как упоминалось ранее, SetupFcn передается в качестве параметра команде parsim для построения цели быстрого ускорения на рабочих, если это необходимо.
out = parsim(in, 'ShowProgress', 'on', ... 'SetupFcn', @() sldemo_parsim_paramsweep_suspn_raccel_setup(mdl));
[13-Dec-2018 12:26:56] 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:28:03] Starting Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [13-Dec-2018 12:28:03] Configuring simulation cache folder on parallel workers... [13-Dec-2018 12:28:04] Running SetupFcn on parallel workers... [13-Dec-2018 12:29:02] Loading model on parallel workers... [13-Dec-2018 12:29:06] Running simulations... [13-Dec-2018 12:29:13] Completed 1 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 2 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 3 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 4 of 10 simulation runs [13-Dec-2018 12:29:15] Completed 5 of 10 simulation runs [13-Dec-2018 12:29:15] Completed 6 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 7 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 8 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 9 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 10 of 10 simulation runs [13-Dec-2018 12:29:17] Cleaning up parallel workers...
Каждый объект CountingOutput содержит зарегистрированный сигнал вместе с Metadata. При выполнении нескольких моделирований с использованием parsim, регистрируются ошибки, так что последующие моделирования могут продолжать выполняться. Любые ошибки появятся в ErrorMessage свойства объекта ExecutionOutput.
Постройте график вертикального перемещения транспортного средства из различных моделей, чтобы увидеть, как изменение массы транспортного средства влияет на динамику транспортного средства. Используйте get СПОСОБ ОБЪЕКТА ВЫВОДА ДЛЯ ПОЛУЧЕНИЯ ВРЕМЕННЫХ И СИГНАЛЬНЫХ ДАННЫХ, СОДЕРЖАЩИХСЯ В КАЖДОМ ЭЛЕМЕНТЕ СИМУТА.
legend_labels = cell(1,numSims); for i = 1:numSims simOut = out(i); ts = simOut.logsout.get('vertical_disp').Values; ts.plot; 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.