exponenta event banner

Быстрое моделирование ускорителя с использованием 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 для задания различных значений параметров и внешнего ввода для каждого моделирования. Массив объектов 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

Шаг 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: Результаты графика

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

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.