Быстрые симуляции Accelerator с использованием Parsim

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

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

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

УправляемыйExternalInputgain2gain3
1inpSets (1)2520
2inpSets (1)2530
3inpSets (1)3520
4inpSets (1)3530
5inpSets (2)2520
6inpSets (2)2530
7inpSets (2)3520
8inpSets (2)3530

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

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

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

Откройте модель:

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 объект, чтобы задать параметры модели, чтобы запустить симуляции в режиме Rapid Accelerator и включить логгирование. Цель 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

Шаг 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));
[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...

Шаг 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.