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
