Используя fminimax с моделью Simulink

Другой подход к оптимизации параметров управления в модели Simulink®, показанной на Объекте с Насыщением Привода, должен использовать функцию fminimax. В этом случае, вместо того, чтобы минимизировать ошибку между выводом и входным сигналом, вы минимизируете максимальное значение вывода в любое время t между 0 и 100.

Код для этого примера, показанного ниже, содержится в функциональном runtrackmm, в котором целевой функцией является просто вывод yout, возвращенный командой sim. Но минимизация максимального вывода на всех временных шагах может обеспечить вывод, чтобы быть далекой ниже единицы, в течение некоторого времени продвигается. Чтобы сохранить вывод выше 0.95 после первых секунд 20, ограничительная функция, trackmmcon содержит ограничение yout >= 0.95 от t=20 до t=100. Поскольку ограничения должны быть в форме g ≤ 0, ограничением в функции является   g = -yout(20:100)+.95.

И trackmmobj и trackmmcon используют результат yout от sim, вычисленного от текущих значений ПИДа. Чтобы постараться не вызывать симуляцию дважды, runtrackmm имеет вложенные функции так, чтобы значение yout было совместно использовано ограничительными функциями и целью. Симуляция называется только, когда текущая точка изменяется.

Следующее является кодом для 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

Скопируйте код для runtrackmm в файл с именем runtrackmm.m, помещенный в папку на вашем пути MATLAB®.

Когда вы запускаете код, он возвращает следующие результаты:

[Kp,Ki,Kd] = runtrackmm
Done initializing optsim.

                  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.9995      0.007058            1         -0.0186    Hessian modified twice  
    4     29         0.9997     9.707e-07            1         0.00716    Hessian modified  

Local minimum possible. Constraints satisfied.

fminimax stopped because the size of the current search direction is less than
twice the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.

Kp =
    0.5910

Ki =
    0.0606

Kd =
    5.5383

Последнее значение в столбце Objective value вывода показывает, что максимальным значением для все время шагов является 0.9997. Ответ замкнутого цикла с этим результатом показывают в фигуре Ответ С обратной связью Используя fminimax.

Это решение отличается от решения, полученного в lsqnonlin с Моделью Simulink, потому что вы решаете различные проблемные формулировки.

Ответ с обратной связью Используя fminimax

Смотрите также

Похожие темы