Оптимизация временных характеристик моделей Simulink ® с помощью параллельных вычислений

Этот пример показывает, как использовать параллельные вычисления для оптимизации временной характеристики модели Simulink ®. Вы используете Simulink ® Design Optimization™ и Parallel Computing Toolbox™, чтобы настроить усиления дискретного ПИ-регулятора бойлера, чтобы соответствовать проектным требованиям. Пример также показывает, как программное обеспечение автоматически обрабатывает зависимости файла модели.

Этот пример требует Parallel Computing Toolbox™.

Открытие модели

Модель Simulink состоит из модели бойлера и дискретного ПИ-контроллера. При использовании параллельных вычислений Simulink Design Optimization выполняет проверку зависимости модели, которая распознает библиотеку модели бойлера как установленную библиотеку.

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

pathToLib = boilerpressure_setup;   %Copies boiler model and library to a temporary folder
addpath(pathToLib);
open_system('boilerpressure_demo')

Требования к проектированию

Давление в котле регулируется дискретным ПИ-контроллером. Проектное требование для контроллера состоит в том, чтобы ограничить изменение давления бойлера в пределах + -% 5 от номинального давления.

Начальный контроллер имеет довольно хорошие регуляторные характеристики, но при наличии дополнительных тепловых нарушений порядка, смоделированных блоком Heat Disturbance, мы хотим настроить эффективность контроллера, чтобы обеспечить более жесткое регулирование давления.

Дважды кликните блок 'Response Optimization GUI with preloaded data' в модели Simulink, чтобы открыть предварительно настроенный сеанс Response Optimizer. Конфигурация Response Optimizer:

1. Верхняя и нижняя границы, представляющие допустимую область значений значений давления в барабане + -5%

2. Отслеживание уставки, чтобы минимизировать отклонение давления в барабане от номинального

3. Усиления ПИ-контроллера, Kp и Ki, выбираются для настройки

Нажмите Plot Model Response, чтобы отобразить изменения давления в барабане с помощью начального контроллера.

Настройка и выполнение оптимизации в графическом интерфейсе пользователя с помощью параллельных вычислений

При вычислении отклика модели с помощью начального контроллера эта сложная модель долго симулировалась. Использование параллельных вычислений может уменьшить время оптимизации путем симуляции модели параллельно. Для получения дополнительной информации о параллельных вычислениях и оптимизации смотрите эффективность руководства Улучшение оптимизации Эффективности Использование параллельных вычислений.

Чтобы сконфигурировать задачу оптимизации для использования параллельных вычислений, щелкните Опции (Options) в Оптимизаторе отклика (Response Optimizer) и выберите вкладку Параллельные опции (Parallel Options). Выберите опцию «Использовать параллельный пул во время оптимизации». Это запускает автоматический поиск любых зависимостей модели. В этом примере библиотека таблиц Steam (libsteam.slx) обнаруживается как зависимость модели (в дополнение к boilerpressure_demo сама модель), и отображается в списке Зависимости файла модели.

Нажатие кнопки OK конфигурирует оптимизацию, чтобы использовать параллельные вычисления.

Чтобы запустить оптимизацию, нажмите кнопку Оптимизировать. Окно прогресса открывает отображение прогресса оптимизации и обновления графиков, чтобы показать оптимизированный ответ.

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

Настройка и выполнение оптимизации в командной строке

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

Выберите переменные модели для оптимизации и установите более низкие пределы

p = sdo.getParameterFromModel('boilerpressure_demo',{'Kp','Ki'});
p(1).Minimum = 0.001;
p(2).Minimum = 0.001;

Выберите сигнал модели для ограничения и создайте симулятор, чтобы симулировать модель.

nPressure = Simulink.SimulationData.SignalLoggingInfo;
nPressure.BlockPath               = 'boilerpressure_demo/1//y0';
nPressure.OutputPortIndex         = 1;
nPressure.LoggingInfo.NameMode    = 1;
nPressure.LoggingInfo.LoggingName = 'nPressure';

simulator = sdo.SimulationTest('boilerpressure_demo');
simulator.LoggingInfo.Signals = nPressure;

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

bnds = getbounds('boilerpressure_demo/Drum pressure constraint');
PressureLimits = [bnds{:}];
bnds = getbounds('boilerpressure_demo/Drum pressure constraint(Reference Tracking)');
PressureRegulation = [bnds{:}];
requirements = struct(...
    'PressureLimits', PressureLimits, ...
    'PressureRegulation', PressureRegulation);

Определите функцию, вызываемую во время оптимизации. Заметьте, что функция использует симулятор и требования, определенные ранее, чтобы оценить проект.

evalDesign = @(p) boilerpressure_design(p,simulator,requirements);
type boilerpressure_design
function design = boilerpressure_design(p,simulator,requirements)
%BOILERPRESSURE_DESIGN
%
% The boilerpressure_design function is used to evaluate a boiler
% controller design design.
%
% The |p| input argument is the vector of controller parameters.
%
% The |simulator| input argument is a sdo.SimulinkTest object used to
% simulate the |boilerpressure_demo| model and log simulation signals.
%
% The |requirements| input argument contains the design requirements used
% to evaluate the boiler controller design.
%
% The |design| return argument contains information about the design
% evaluation that can be used by the |sdo.optimize| function to optimize
% the design.
%
% see also sdo.optimize, sdoExampleCostFunction

% Copyright 2011 The MathWorks, Inc.

%% Simulate the model
%
% Use the simulator input argument to simulate the model and log model
% signals.
% 
% First ensure that we simulate the model with the parameter values chosen
% by the optimizer.
%
simulator.Parameters = p;
%% 
% Simulate the model and log signals.
%
simulator = sim(simulator);
%%
% Get the simulation signal log, the simulation log name is defined by the
% model |SignalLoggingName| property
%
logName = get_param('boilerpressure_demo','SignalLoggingName');
simLog = get(simulator.LoggedData,logName);

%% Evaluate the design requirements
%
% Use the requirements input argument to evaluate the design requirements
%
% Check the Pressure signal against the |PressureLimits| requirements.
%
nPressure = get(simLog,'nPressure');
c = [...
    evalRequirement(requirements.PressureLimits(1),nPressure.Values); ...
    evalRequirement(requirements.PressureLimits(2),nPressure.Values)];
%%
% Use the PressureLimits requirements as non-linear constraints for
% optimization.
design.Cleq = c(:);
%%
% Check the pressure signal against the |PressureRegulation| requirement.
%
f = evalRequirement(requirements.PressureRegulation,nPressure.Values);
%%
% Use the PressureRegulation requirement as an objective for optimization.
design.F = f;
end

Настройте опции оптимизации, чтобы использовать параллельный пул и задать зависимости файлов модели и модели.

opt = sdo.OptimizeOptions;
opt.UseParallel              = true;
opt.OptimizedModel           = 'boilerpressure_demo';
[dirs,files]                 = sdo.getModelDependencies('boilerpressure_demo');
opt.ParallelFileDependencies = files;

Чтобы запустить оптимизацию с помощью параллельного пула, передайте опции оптимизации, opt, к sdo.optimize команда.

Закрытие модели

После оптимизации модели мы удаляем модель бойлера и файл библиотеки из временной папки.

bdclose('boilerpressure_demo')
rmpath(pathToLib)
boilerpressure_cleanup(pathToLib)