exponenta event banner

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

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

В этом примере требуется Toolbox™ параллельных вычислений.

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

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

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

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

Требования к конструкции

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

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

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

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

2. Контрольная цель отслеживания для минимизации отклонения давления в барабане от номинального

3. Для настройки выбраны коэффициенты усиления контроллера PI, Kp и Ki

Щелкните График (Plot) Реакция модели (Model Response), чтобы отобразить изменения давления в барабане с исходным контроллером.

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

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

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

Нажатие кнопки ОК настраивает оптимизацию для использования параллельных вычислений.

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

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

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

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

Выберите переменные модели для оптимизации и задайте нижние пределы

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)