Быстрые моделирования акселератора Используя Parsim

Этот пример показывает использование Быстрого Акселератора в приложениях, которые требуют идущих параллельно моделирований для области значений входных значений и значений параметров.

Мы используем модель скорости холостого хода механизма, которая моделирует скорость холостого хода механизма. Входной параметр этой модели является напряжением обходного воздушного клапана, и вывод является скоростью холостого хода.

Мы идем параллельно моделирования с помощью parsim с двумя наборами напряжений клапана и путем независимого варьирования двух из трех параметров усиления передаточных функций в области значений двух значений. Следовательно, всего, мы будем запускать восемь различных наборов моделирований.

Легко настроить этот пример для вашего собственного приложения путем изменения файла скрипта, используемого, чтобы создать этот пример. Щелкните по ссылке в левом верхнем угле этой страницы, чтобы отредактировать файл скрипта. Щелкните по ссылке в правом верхнем углу, чтобы запустить этот пример от MATLAB®.

Шаг 1: Подготовка

Сначала мы открываем модель, где режим моделирования был установлен в Быстрый Акселератор. Входные данные по умолчанию и обязательные параметры предварительно загружены в рабочей области моделей.

Мы копируем входной параметр по умолчанию и данные времени к переменной так, чтобы мы могли позже изменить их и передать их команде SIM.

Открытая модель:

mdl = 'sldemo_raccel_engine_idle_speed';
open_system(mdl);

% Copy input data
inpData = evalin('base', 'inpData');
tData = evalin('base', 'time');

Шаг 2: Setup, чтобы создать быструю цель акселератора

Быстрый исполняемый файл Акселератора для модели создается в вызове SetupFcn с помощью функции buildRapidAcceleratorTarget от пакета Simulink.BlockDiagram. Функция buildRapidAcceleratorTarget возвращает набор параметра периода выполнения по умолчанию, который присвоен глобальной переменной, RTP, в SetupFcn и используется на следующем шаге, чтобы изменить значения параметров. Откройте sldemo_parallel_rapid_accel_sims_script_setup в редакторе, чтобы посмотреть на код. Обратите внимание на то, что процесс сборки оптимизирован так, чтобы, если файлы типа "build" уже присутствуют и совместимы с моделью и архитектурой машины затем, это возвратилось рано.

Шаг 4: Создайте входные наборы

Здесь мы тревожим вектор входных значений по умолчанию, чтобы получить новый вектор входных значений.

В этом примере мы будем строить график скорости холостого хода механизма как функции напряжения клапана для различных значений параметров.

inpSets{1} = inpData;
rndPertb = 0.5 + rand(length(tData), 1);
inpSets{2} = inpSets{1}.*rndPertb;
numInpSets  = length(inpSets);

Шаг 3: Создайте наборы параметра

Используя значение по умолчанию 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

Шаг 4: Выполните моделирования

Используйте функцию 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...

Шаг 5: Постройте график результатов

Постройте график скорости холостого хода механизма относительно времени для различных значений параметров и входных параметров. Вывод зарегистрирован формат массивов и может быть получен доступ от объекта SimulationOutput.

for i = 1:numSims
        simOut = out(i);
        t = simOut.tout;
        y = simOut.yout;
        plot(t, y)
        hold all
end

Шаг 6: Закройте работников MATLAB

delete(gcp('nocreate'))
Parallel pool using the 'local' profile is shutting down.
Была ли эта тема полезной?