В этом примере показано использование 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 для задания различных значений параметров и внешнего ввода для каждого моделирования. Массив объектов Input предварительно выделен для повышения производительности. Также следует отметить, что внешние входные данные могут быть непосредственно заданы в объекте CountingInput вместо использования параметра модели.
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 создается с помощью 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...
Постройте график частоты вращения холостого хода двигателя по времени для различных значений параметров и входов. Выходные данные регистрируются в формате массива, доступ к ним можно получить из объекта ExecutingOutput.
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.