Этот пример показывает использование Быстрого Акселератора в приложениях, которые требуют идущих параллельно моделирований для области значений входных значений и значений параметров.
Мы используем модель скорости холостого хода механизма, которая моделирует скорость холостого хода механизма. Входной параметр этой модели является напряжением обходного воздушного клапана, и вывод является скоростью холостого хода.
Мы идем параллельно моделирования с помощью parsim
с двумя наборами напряжений клапана и путем независимого варьирования двух из трех параметров усиления передаточных функций в области значений двух значений. Следовательно, всего, мы будем запускать восемь различных наборов моделирований.
Легко настроить этот пример для вашего собственного приложения путем изменения файла скрипта, используемого, чтобы создать этот пример. Щелкните по ссылке в левом верхнем угле этой страницы, чтобы отредактировать файл скрипта. Щелкните по ссылке в правом верхнем углу, чтобы запустить этот пример от MATLAB®.
Сначала мы открываем модель, где режим моделирования был установлен в Быстрый Акселератор. Входные данные по умолчанию и обязательные параметры предварительно загружены в рабочей области моделей.
Мы копируем входной параметр по умолчанию и данные времени к переменной так, чтобы мы могли позже изменить их и передать их команде SIM.
Открытая модель:
mdl = 'sldemo_raccel_engine_idle_speed'; open_system(mdl); % Copy input data inpData = evalin('base', 'inpData'); tData = evalin('base', 'time');
Быстрый исполняемый файл Акселератора для модели создается в вызове SetupFcn с помощью функции buildRapidAcceleratorTarget
от пакета Simulink.BlockDiagram
. Функция buildRapidAcceleratorTarget
возвращает набор параметра периода выполнения по умолчанию, который присвоен глобальной переменной, RTP
, в SetupFcn и используется на следующем шаге, чтобы изменить значения параметров. Откройте sldemo_parallel_rapid_accel_sims_script_setup
в редакторе, чтобы посмотреть на код. Обратите внимание на то, что процесс сборки оптимизирован так, чтобы, если файлы типа "build" уже присутствуют и совместимы с моделью и архитектурой машины затем, это возвратилось рано.
Здесь мы тревожим вектор входных значений по умолчанию, чтобы получить новый вектор входных значений.
В этом примере мы будем строить график скорости холостого хода механизма как функции напряжения клапана для различных значений параметров.
inpSets{1} = inpData; rndPertb = 0.5 + rand(length(tData), 1); inpSets{2} = inpSets{1}.*rndPertb; numInpSets = length(inpSets);
Используя значение по умолчанию rtp структура от шага 2, мы создаем новую структуру с различными значениями для настраиваемых переменных в модели. Мы хотим видеть, как скорость холостого хода изменяет для различных значений параметров gain2
и gain3
. Поэтому мы генерируем различные наборы параметра с различными значениями gain2
и gain3
и оставляем другие настраиваемые переменные в их значениях по умолчанию.
Создайте массив объектов Simulink.SimulationInput
задать различные значения параметров и внешний входной параметр для каждого моделирования. Массив объектов SimulationInput предварительно выделяется для лучшей производительности. Также обратите внимание, что внешний входной параметр может быть непосредственно задан на объекте SimulationInput вместо того, чтобы использовать параметр модели.
Служебная функция Simulink.BlockDiagram.modifyTunableParameters
является удобным способом создать rtp структуру с различными значениями параметров. Используйте PreSimFcn
, sldemo_parallel_rapid_accel_sims_script_presim
на объекте SimulationInput получить доступ к RTP
и создать наборы параметра.
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(numSims) = Simulink.SimulationInput(mdl); idx = 1; for iG2 = 1:num_gain2_vals for iG3 = 1:num_gain3_vals for inpSetsIdx = 1:numInpSets in(idx).ModelName = mdl; in(idx) = in(idx).setModelParameter('SimulationMode', 'rapid', ... 'RapidAcceleratorUpToDateCheck', 'off', ... 'SaveTime', 'on', ... 'SaveOutput', 'on'); in(idx).PreSimFcn = @(x) sldemo_parallel_rapid_accel_sims_script_presim(x, gain2_vals(iG2), gain3_vals(iG3)); in(idx).ExternalInput = [tData, inpSets{inpSetsIdx}]; idx = idx + 1; end end 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));
[28-Feb-2018 11:00:04] Checking for availability of parallel pool... [28-Feb-2018 11:00:04] Loading Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [28-Feb-2018 11:00:04] Configuring simulation cache folder on parallel workers... [28-Feb-2018 11:00:04] Running SetupFcn on parallel workers... [28-Feb-2018 11:00:33] Loading model on parallel workers... [28-Feb-2018 11:00:38] Running simulations... [28-Feb-2018 11:00:41] Completed 1 of 8 simulation runs [28-Feb-2018 11:00:41] Completed 2 of 8 simulation runs [28-Feb-2018 11:00:42] Completed 3 of 8 simulation runs [28-Feb-2018 11:00:42] Completed 4 of 8 simulation runs [28-Feb-2018 11:00:42] Completed 5 of 8 simulation runs [28-Feb-2018 11:00:42] Completed 6 of 8 simulation runs [28-Feb-2018 11:00:43] Completed 7 of 8 simulation runs [28-Feb-2018 11:00:43] Completed 8 of 8 simulation runs [28-Feb-2018 11:00:44] 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.