В этом примере показано, как использовать параллельные вычисления, чтобы оптимизировать ответ временного интервала модели 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. Усиления ПИ-контроллера, Кп и Ки, выбраны для настройки
Нажмите 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')
rmpath(pathToLib)
boilerpressure_cleanup(pathToLib)