Этот пример показывает использование Быстрого Акселератора в приложениях, которые требуют идущих параллельно симуляций для области значений входных значений и значений параметров.
Мы используем модель скорости холостого хода механизма, которая моделирует скорость холостого хода механизма. Вход этой модели является напряжением обходного воздушного клапана, и вывод является скоростью холостого хода.
Мы идем параллельно симуляции с помощью 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®.
Сначала мы открываем модель, где режим симуляции был установлен в Быстрый Акселератор. Входные данные по умолчанию и обязательные параметры предварительно загружены в базовом рабочем пространстве.
Открытая модель:
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
установить параметры модели, чтобы запустить симуляции в Быстром Режиме Accelerator и позволить регистрировать. Быстрая цель Акселератора создается с помощью SetupFcn
. Быстрая цель Акселератора является сборкой однажды и используемый всеми последующими симуляциями, экономящими время, требуемое для образцовой компиляции. Вот код для 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.