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

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

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

Используйте parsim идти параллельно симуляции с двумя наборами напряжений клапана. Независимо варьируйтесь два из трех параметров усиления передаточной функции в области значений двух значений. В следующей таблице перечислены эти восемь симуляций, наряду со значениями параметров. На Шаге 2 создайте внешние входные параметры, inpSets. Переменные gain2 и gain3 соответствуйте двум параметрам усиления.

  Run 1      inpSets(1)    gain2 = 25     gain3 = 20

  Run 2      inpSets(1)    gain2 = 25     gain3 = 30

  Run 3      inpSets(1)    gain2 = 35     gain3 = 20

  Run 4      inpSets(1)    gain2 = 35     gain3 = 30

  Run 5      inpSets(2)    gain2 = 25     gain3 = 20

  Run 6      inpSets(2)    gain2 = 25     gain3 = 30

  Run 7      inpSets(2)    gain2 = 35     gain3 = 20

  Run 8      inpSets(2)    gain2 = 35     gain3 = 30

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

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

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

mdl = 'sldemo_raccel_engine_idle_speed';
open_system(mdl);

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

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

inpSets(1) = timeseries(inpData, time);
rndPertb = 0.5 + rand(length(time), 1);
inpSets(2) = timeseries(inpData.*rndPertb, time);
numInpSets  = length(inpSets);

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

Затем исследуйте, как скорость холостого хода изменяет для различных значений параметров 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

Шаг 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));
[21-May-2021 17:46:47] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
[21-May-2021 17:47:51] Starting Simulink on parallel workers...
Analyzing and transferring files to the workers ...done.
[21-May-2021 17:48:54] Configuring simulation cache folder on parallel workers...
[21-May-2021 17:48:55] Running SetupFcn on parallel workers...
[21-May-2021 17:50:14] Loading model on parallel workers...
[21-May-2021 17:50:22] Running simulations...
[21-May-2021 17:50:29] Completed 1 of 8 simulation runs
[21-May-2021 17:50:29] Completed 2 of 8 simulation runs
[21-May-2021 17:50:29] Completed 3 of 8 simulation runs
[21-May-2021 17:50:29] Completed 4 of 8 simulation runs
[21-May-2021 17:50:29] Completed 5 of 8 simulation runs
[21-May-2021 17:50:29] Completed 6 of 8 simulation runs
[21-May-2021 17:50:36] Completed 7 of 8 simulation runs
[21-May-2021 17:50:36] Completed 8 of 8 simulation runs
[21-May-2021 17:50:36] 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'))

Смотрите также

Похожие темы