lsqnonlin с моделью Simulink ®

Этот пример показывает, как настроить параметры модели Simulink. Модель, optsim, включена в optim/ demos папка установки MATLAB ®. Модель включает нелинейный процесс объекта смоделированный как Диаграмма Simulink.

Объект с насыщением привода

Объект представляет собой недостаточно демпфированную модель третьего порядка с пределами привода. Пределы привода являются пределом насыщения и скорости нарастания пределом. Предел насыщения привода отсекает входные значения более чем на 2 модули или менее чем на -2 модули. Скорость нарастания предела привода составляет 0,8 ед./сек. Реакция системы с обратной связью на вход шага показана в Отклике с обратной связью. Вы можете увидеть этот ответ, открывая модель (тип optsim в командной строке или нажатии кнопки имя модели) и выбором Запуска из меню Симуляции. Значение графиков отклика к возможностям.

Реакция с обратной связью

Задача состоит в том, чтобы спроектировать цикл управления с обратной связью, который отслеживает вход единичного шага в систему. Установка с обратной связью вводится в терминах блоков, где объект и привод расположены в иерархическом блоке Subsystem. Блок Scope отображает выходные траектории в процессе проекта.

Модель замкнутой системы

Чтобы решить эту проблему, минимизируйте ошибку между выходом и входным сигналом. (Напротив, в примере Использование fminimax с моделью Simulink ® решение включает минимизацию максимального значения выхода.) Переменные являются параметрами контроллера Пропорциональная Интегральная производная (PID). Если бы вам только нужно было минимизировать ошибку в один момент модуля, у вас была бы скаляр целевая функция. Но цель состоит в том, чтобы минимизировать ошибку для всех временных шагов от 0 до 100, таким образом создавая мультиобъективную функцию (по одной функции для каждого временного шага).

Использование lsqnonlin для выполнения аппроксимации методом наименьших квадратов при отслеживании выходов. Отслеживание выполняется функцией tracklsq, который вложен в runtracklsq в конце этого примера. tracklsq возвращает сигнал ошибки yout, выход вычисляется вызовом sim, минус входной сигнал 1.

Функция runtracklsq настраивает все необходимые значения и затем вызывает lsqnonlin с целевой функцией tracklsq. Переменная options передано в lsqnonlin определяет критерии и отображаемые признаки. Опции задают отсутствие отображаемого выхода, чтобы использовать 'levenberg-marquardt' алгоритм, и опции дают допуски на прекращение для шага и целевой функции порядка 0,001.

Чтобы запустить симуляцию в модели optsimнеобходимо задать переменные Kp, Ki, Kd, a1, и a2 (a1 и a2 являются переменными в блоке Plant). Kp, Ki, и Kd являются переменными, которые будут оптимизированы. Функция tracklsq вложен внутри runtracklsq так что переменные a1 и a2 являются общими между этими двумя функциями. Переменные a1 и a2 инициализируются в runtracklsq.

Целевая функция tracklsq запускает симуляцию. Можно запустить симуляцию либо в базовом рабочем пространстве, либо в текущем рабочем пространстве, то есть в рабочей области вызова функции sim, которая в данном случае является рабочей областью tracklsq. В этом примере SrcWorkspace для опции задано значение 'Current' чтобы сказать sim чтобы запустить симуляцию в текущей рабочей области. runtracklsq запускает симуляцию на 100 секунд.

Когда симуляция будет завершена, runtracklsq создает myobj объект в текущей рабочей области (то есть рабочая область tracklsq). Блок Outport в модели блок-схемы помещает yout поле объекта в текущей рабочей области в конце симуляции.

Когда бегаешь runtracklsq, оптимизация дает решение для пропорционального, интегрального и производной (Kp, Ki, Kd) усиления контроллера.

[Kp, Ki, Kd] = runtracklsq
Kp = 3.1330
Ki = 0.1465
Kd = 14.3918

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

Реакция с обратной связью после lsqnonlin

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

Численное решение, произведенное решателем с переменным шагом, однако, не является плавной функцией параметров из-за механизмов управления размером шага. Это отсутствие гладкости может предотвратить сходимость стандартной программы оптимизации. Отсутствие сглаживания не является проблемой, когда вы используете решатель с фиксированным шагом. (Для получения дополнительной информации см. [53].)

Программное обеспечение Simulink Design Optimization™ рекомендуется для решения мультиобъективных задач оптимизации в сочетании с решателями с переменной Simulink. Это программное обеспечение предоставляет специальный числовой градиентный расчет, которое работает с Simulink и избегает введения проблемы отсутствия плавности.

Функция помощника

Следующий код создает runtracklsq вспомогательная функция.

function [Kp,Ki,Kd] = runtracklsq
% RUNTRACKLSQ demonstrates using LSQNONLIN with Simulink.
mdl = 'optsim';
open_system(mdl)                             % Load the model
in = Simulink.SimulationInput(mdl);          % Create simulation input object
in = in.setModelParameter('StopTime','100'); % Stop time 100
pid0 = [0.63 0.0504 1.9688];                 % Initial gain values
a1 = 3; a2 = 43;                             % Initialize model plant variables
options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt',...
   'Display','off','StepTolerance',0.001,'OptimalityTolerance',0.001);
% Optimize the gains
set_param(mdl,'FastRestart','on');           % Fast restart
pid = lsqnonlin(@tracklsq,pid0,[],[],options);
set_param(mdl,'FastRestart','off');
% Return the gains
Kp = pid(1); Ki = pid(2); Kd = pid(3); 

    function F = tracklsq(pid)
      % Track the output of optsim to a signal of 1
      % Set the simulation input object parameters
      in = in.setVariable('Kp',pid(1),'Workspace',mdl);
      in = in.setVariable('Ki',pid(2),'Workspace',mdl);
      in = in.setVariable('Kd',pid(3),'Workspace',mdl);
      
      % Simulate
      out = sim(in);
      F = out.get('yout') - 1;
    end
end

Копирайт 2019-2020 The MathWorks, Inc.