Этот пример показывает использование Rapid Accelerator в приложениях, которые требуют выполнения параллельных симуляций для ряда входа и значений параметров.
Мы используем модель скорости холостого хода двигателя, которая имитирует скорость холостого хода двигателя. Вход этой модели является напряжение перепускного воздушного клапана, а выхода - скорость простоя.
Выполняем параллельные симуляции с помощью parsim
с двумя наборами напряжений клапана и путем независимого изменения двух из трех параметров усиления передаточных функций в области значений двух значений. В следующей таблице перечислены восемь симуляций, которые будут выполняться вместе со значениями параметров. Внешние входы, inpSets
, создаются на шаге 2 ниже и gain2
и gain3
являются переменными, соответствующими двум параметрам усиления.
Управляемый | ExternalInput | gain2 | gain3 |
---|---|---|---|
1 | inpSets (1) | 25 | 20 |
2 | inpSets (1) | 25 | 30 |
3 | inpSets (1) | 35 | 20 |
4 | inpSets (1) | 35 | 30 |
5 | inpSets (2) | 25 | 20 |
6 | inpSets (2) | 25 | 30 |
7 | inpSets (2) | 35 | 20 |
8 | inpSets (2) | 35 | 30 |
Легко настроить этот пример для собственного приложения, изменив файл скрипта, используемый для сборки этого примера. Щелкните ссылку в левом верхнем углу этой страницы, чтобы отредактировать файл скрипта. Щелкните ссылку в правом верхнем углу, чтобы запустить этот пример из MATLAB ®.
Сначала мы откроем модель, где режим симуляции был установлен на Rapid Accelerator. Входные данные по умолчанию и необходимые параметры предварительно загружаются в базовом рабочем пространстве.
Откройте модель:
mdl = 'sldemo_raccel_engine_idle_speed';
open_system(mdl);
Здесь мы возмущаем вектор входных значений по умолчанию, чтобы получить новый вектор входных значений.
inpSets(1) = timeseries(inpData, time); rndPertb = 0.5 + rand(length(time), 1); inpSets(2) = timeseries(inpData.*rndPertb, time); numInpSets = length(inpSets);
Мы хотим увидеть, как изменяется скорость простоя для различных значений параметров gain2
и gain3
. Создайте массив Simulink.SimulationInput
объекты, чтобы задать различные значения параметров и внешний вход для каждой симуляции. Массив объектов SimulationInput предварительно выделен для повышения эффективности. Также обратите внимание, что внешний вход может быть непосредственно задан на объект SimulationInput вместо использования параметра модели.
gain2_vals = 25:10:35; gain3_vals = 20:10:30; num_gain2_vals = length(gain2_vals); num_gain3_vals = length(gain3_vals); numSims = num_gain2_vals*num_gain3_vals*numInpSets; in(1:numSims) = Simulink.SimulationInput(mdl); idx = 1; for iG2 = 1:num_gain2_vals for iG3 = 1:num_gain3_vals for inpSetsIdx = 1:numInpSets in(idx) = in(idx).setModelParameter('SimulationMode', 'rapid', ... 'RapidAcceleratorUpToDateCheck', 'off', ... 'SaveTime', 'on', ... 'SaveOutput', 'on'); % Use setVariable to specify a new value for a variable during % simulations in(idx) = in(idx).setVariable('gain2', gain2_vals(iG2)); in(idx) = in(idx).setVariable('gain3', gain3_vals(iG3)); in(idx).ExternalInput = inpSets(inpSetsIdx); idx = idx + 1; end end end
Обратите внимание, что мы также используем setModelParameter
метод SimulationInput
объект, чтобы задать параметры модели, чтобы запустить симуляции в режиме Rapid Accelerator и включить логгирование. Цель Rapid Accelerator построена с помощью SetupFcn
. Цель Rapid Accelerator создается один раз и используется всеми последующими симуляциями, что экономит время, необходимое для компиляции модели. Вот код для SetupFcn
function sldemo_parallel_rapid_accel_sims_script_setup(mdl) % Temporarily change the current folder on the workers to an empty % folder so that any existing slprj folder on the client does not % interfere in the build process. currentFolder = pwd; tempDir = tempname; mkdir(tempDir); cd (tempDir); oc = onCleanup(@() cd (currentFolder)); Simulink.BlockDiagram.buildRapidAcceleratorTarget(mdl); end
Используйте parsim
функция для выполнения параллельных симуляций. Массив SimulationInput
объекты, in
, созданный на последнем шаге, передается в parsim
функция как первый аргумент. Сохраните выходные данные симуляции в переменной, out
, значение которого является массивом Simulink.SimulationOutput
объекты. Каждый SimulationOutput
объект содержит записанный сигнал вместе с SimulationMetadata
. При выполнении нескольких симуляций с помощью parsim
ошибки получаются так, что последующие симуляции могут продолжать выполняться. Любые ошибки могут появиться в ErrorMessage
свойство SimulationOutput
объект.
out = parsim(in, 'ShowProgress', 'on', ... 'SetupFcn', @() sldemo_parallel_rapid_accel_sims_script_setup(mdl));
[16-Oct-2018 15:54:39] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). [16-Oct-2018 15:55:37] Starting Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [16-Oct-2018 15:55:38] Configuring simulation cache folder on parallel workers... [16-Oct-2018 15:55:38] Running SetupFcn on parallel workers... [16-Oct-2018 15:56:28] Loading model on parallel workers... [16-Oct-2018 15:56:29] Running simulations... [16-Oct-2018 15:56:34] Completed 1 of 8 simulation runs [16-Oct-2018 15:56:34] Completed 2 of 8 simulation runs [16-Oct-2018 15:56:34] Completed 3 of 8 simulation runs [16-Oct-2018 15:56:34] Completed 4 of 8 simulation runs [16-Oct-2018 15:56:34] Completed 5 of 8 simulation runs [16-Oct-2018 15:56:34] Completed 6 of 8 simulation runs [16-Oct-2018 15:56:38] Completed 7 of 8 simulation runs [16-Oct-2018 15:56:38] Completed 8 of 8 simulation runs [16-Oct-2018 15:56:38] Cleaning up parallel workers...
Постройте график скорости холостого хода двигателя относительно времени для различных значений параметров и входов. Выход регистрируется в формате массива и может быть получен из объекта SimulationOutput.
for i = 1:numSims simOut = out(i); t = simOut.tout; y = simOut.yout; plot(t, y) hold all end
delete(gcp('nocreate'))
Parallel pool using the 'local' profile is shutting down.