fminimax
с моделью Simulink ®Этот пример показывает, как настроить параметры модели Simulink. Модель, optsim
, включена в optim
/ demos
папка установки MATLAB ®. Модель включает нелинейный процесс объекта смоделированный как Диаграмма Simulink.
Объект с насыщением привода
Объект представляет собой недостаточно демпфированную модель третьего порядка с пределами привода. Пределы привода являются пределом насыщения и скорости нарастания пределом. Предел насыщения привода отсекает входные значения более чем на 2 модули или менее чем на -2 модули. Скорость нарастания предела привода составляет 0,8 ед./сек. Реакция системы с обратной связью на вход шага показана в Отклике с обратной связью. Вы можете увидеть этот ответ, открывая модель (тип optsim
в командной строке или нажатии кнопки имя модели) и выбором Запуска из меню Симуляции. Значение графиков отклика к возможностям.
Реакция с обратной связью
Задача состоит в том, чтобы спроектировать цикл управления с обратной связью, который отслеживает вход единичного шага в систему. Установка с обратной связью вводится в терминах блоков, где объект и привод расположены в иерархическом блоке Subsystem. Блок Scope отображает выходные траектории в процессе проекта.
Модель замкнутой системы
Чтобы оптимизировать эту систему, минимизируйте максимальное значение выхода в любой момент времени от 0 до 100. (Напротив, в примере lsqnonlin с моделью Simulink ® решение включает минимизацию ошибки между выходом и входным сигналом.)
Код для этого примера содержится в вспомогательной функции runtrackmm
в конце этого примера. Целевой функцией является просто выход yout
возвращен sim
команда. Но минимизация максимального вывода за все временные шаги может заставить выход оказаться намного ниже единицы для некоторых временных шагов. Чтобы сохранить выход выше 0,95 через первые 20 секунд, функция ограничения trackmmcon
содержит ограничение yout >= 0.95
от t = 20
на t = 100
. Потому что ограничения должны быть в форме , ограничение в функции g = -yout(20:100) + 0.95
.
Оба trackmmobj
и trackmmcon
использовать результат yout from sim
, рассчитанная из текущих значений ПИД. Чтобы избежать вызова симуляции дважды, runtrackmm
имеет вложенные функции так, чтобы значение yout
разделяется между функциями цели и ограничениями. Симуляция вызывается только при изменении текущей точки.
Функции runtrackmm
.
[Kp,Ki,Kd] = runtrackmm
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 5 0 1.11982 1 11 1.184 0.07978 1 0.482 2 17 1.012 0.04285 1 -0.236 3 23 0.9996 0.00397 1 -0.0195 Hessian modified twice 4 29 0.9996 3.464e-05 1 0.000687 Hessian modified
5 35 0.9996 2.272e-09 1 -0.0175 Hessian modified twice Local minimum possible. Constraints satisfied. fminimax stopped because the predicted change in the objective function is less than the value of the function tolerance and constraints are satisfied to within the value of the constraint tolerance.
Kp = 0.5894
Ki = 0.0605
Kd = 5.5295
Последнее значение в Objective value
столбец выхода показывает, что максимальное значение для всех временных шагов составляет чуть менее 1. Реакция с обратной связью с этим результатом показана на рисунке Реакция с обратной связью с использованием fminimax.
Это решение отличается от решения, полученного в lsqnonlin с моделью Simulink ®, потому что вы решаете различные формулировки задачи.
Реакция с обратной связью с использованием fminimax
Следующий код создает runtrackmm
вспомогательная функция.
function [Kp, Ki, Kd] = runtrackmm optsim % initialize Simulink(R) pid0 = [0.63 0.0504 1.9688]; % a1, a2, yout are shared with TRACKMMOBJ and TRACKMMCON a1 = 3; a2 = 43; % Initialize plant variables in model yout = []; % Give yout an initial value pold = []; % tracks last pid opt = simset('solver','ode5','SrcWorkspace','Current'); options = optimset('Display','iter',... 'TolX',0.001,'TolFun',0.001); pid = fminimax(@trackmmobj,pid0,[],[],[],[],[],[],... @trackmmcon,options); Kp = pid(1); Ki = pid(2); Kd = pid(3); function F = trackmmobj(pid) % Track the output of optsim to a signal of 1. % Variables a1 and a2 are shared with RUNTRACKMM. % Variable yout is shared with RUNTRACKMM and % RUNTRACKMMCON. updateIfNeeded(pid) F = yout; end function [c,ceq] = trackmmcon(pid) % Track the output of optsim to a signal of 1. % Variable yout is shared with RUNTRACKMM and % TRACKMMOBJ updateIfNeeded(pid) c = -yout(20:100)+.95; ceq=[]; end function updateIfNeeded(pid) if ~isequal(pid,pold) % compute only if needed Kp = pid(1); Ki = pid(2); Kd = pid(3); [~,~,yout] = sim('optsim',[0 100],opt); pold = pid; end end end