Использование fminimax с моделью Simulink ®

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

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

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

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

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

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

Чтобы оптимизировать эту систему, минимизируйте максимальное значение выхода в любой момент времени t от 0 до 100. (Напротив, в примере lsqnonlin с моделью Simulink ® решение включает минимизацию ошибки между выходом и входным сигналом.)

Код для этого примера содержится в вспомогательной функции runtrackmm в конце этого примера. Целевой функцией является просто выход yout возвращен sim команда. Но минимизация максимального вывода за все временные шаги может заставить выход оказаться намного ниже единицы для некоторых временных шагов. Чтобы сохранить выход выше 0,95 через первые 20 секунд, функция ограничения trackmmcon содержит ограничение yout >= 0.95 от t = 20 на t = 100. Потому что ограничения должны быть в форме g0, ограничение в функции   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

См. также

Похожие темы