Оптимизация ответа временного интервала моделей Simulink Используя параллельные вычисления

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

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

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

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

open_system('boilerpressure_demo')

Конструктивные требования

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

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

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

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

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

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

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

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

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

Чтобы сконфигурировать задачу оптимизации, чтобы использовать параллельные вычисления нажимают Options в Response Optimizer и выбирают вкладку Parallel Options. Выберите опцию "Use the parallel pool during optimization". Это инициировало автоматизированный поиск любых зависимостей моделей. В этом примере, библиотека Мармита (libsteam.slx) найден как зависимость моделей (в дополнение к boilerpressure_demo сама модель), и отображен в поле списка зависимостей от файла Модели.

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

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

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

Конфигурирование и выполнение оптимизации в командной строке

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

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

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

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

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')