Этот пример показывает, как использовать параллельные вычисления, чтобы оптимизировать ответ временного интервала модели Simulink®. Вы используете Simulink® Design Optimization™ и Parallel Computing Toolbox™, чтобы настроить усиления дискретного контроллера PI бойлера, чтобы соответствовать конструктивным требованиям. Пример также показывает, как программное обеспечение автоматически обрабатывает зависимости от файла модели.
Этот пример требует Parallel Computing Toolbox™.
Модель Simulink состоит из модели бойлера и дискретного контроллера PI. При использовании параллельных вычислений Simulink Design Optimization выполняет проверку зависимости моделей, которая распознает библиотеку модели бойлера установленной библиотекой.
В порядке проиллюстрировать, как зависимости моделей обработаны при использовании параллельных вычислений, мы копируем модель бойлера и блок библиотеки к временной папке прежде, чем открыть модель.
pathToLib = boilerpressure_setup; %Copies boiler model and library to a temporary folder addpath(pathToLib); open_system('boilerpressure_demo')
Давление бойлера отрегулировано дискретным контроллером PI. Конструктивные требования для контроллера должны ограничить изменение давления бойлера в + - %5 из номинального давления.
У начального контроллера есть довольно хорошие характеристики регулирования, но в присутствии дополнительных воздействий тепла, смоделированных блоком Heat Disturbance, мы хотим настроить производительность контроллера, чтобы обеспечить более трудное регулирование давления.
Дважды кликните блок 'Response Optimization GUI with preloaded data' в модели Simulink, чтобы открыть предварительно сконфигурированный Response Optimization Tool. Response Optimization Tool сконфигурирован с:
1. Верхние и нижние границы, представляющие + допустимая область значений на-5% на давлении барабана
2. Цель отслеживания уставки минимизировать отклонение давления барабана номинала
3. Контроллер PI усиления, Кп и Ки, выбран для настройки
Нажмите Plot Model Response, чтобы отобразить изменения давления барабана с начальным контроллером.
При вычислении образцового ответа с начальным контроллером эта сложная модель заняла много времени, чтобы моделировать. Используя параллельные вычисления может уменьшать время оптимизации путем симуляции модели параллельно. Для получения дополнительной информации о параллельных вычислениях и производительности оптимизации см., что пример "Улучшает Производительность Оптимизации Используя Параллельные вычисления".
Чтобы сконфигурировать задачу оптимизации, чтобы использовать параллельные вычисления нажимают Options в Response Optimization Tool и выбирают вкладку 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)