Симулируйте Контроллер MPC с помощью пользовательского Решателя QP

Можно симулировать ответ с обратной связью контроллера MPC с помощью пользовательского решателя квадратичного программирования (QP) в Simulink ®.

Этот пример использует on-line приложение мониторинга, сначала решая его с помощью встроенного решателя Model Predictive Control Toolbox™, затем используя пользовательский решатель, который использует quadprog (Optimization Toolbox) решатель из Optimization Toolbox™.

Реализация пользовательского решателя QP таким образом не поддерживает генерацию кода. Для получения дополнительной информации о генерации кода для пользовательского решателя QP, смотрите Моделирование и Генерация кода для контроллера MPC с пользовательским решателем QP. Дополнительные сведения о решателях QP см. в разделе Решатели QP.

В интерактивном примере мониторинга qp.status выход блока MPC Controller возвращает положительное целое число каждый раз, когда контроллер получает допустимое решение текущей задачи QP во время выполнения и устанавливает mv выход. The qp.status значение соответствует количеству итераций, используемых для решения этого QP.

Если QP недопустим для заданного контрольного интервала, контроллер не может найти решение. В этом случае mv outport остается на своем последнем значении и qp.status outport возвращает -1. Точно так же, если максимальное количество итераций достигнуто во время оптимизации (редко), mv выход также замерзает, и qp.status outport возвращает 0.

Приложения MPC в реальном времени могут обнаружить, находится ли контроллер в режиме «failure» (0 или -1) путем мониторинга qp.status выход. В случае отказа должен быть активирован план резервного управления. Это важно, если есть вероятность, что QP может стать недопустимым, потому что действие по умолчанию (замораживание MVs) может привести к неприемлемому поведению системы, такому как нестабильность. Такой план резервного копирования обязательно является специфичным для конкретного приложения.

Приложение MPC с онлайн-мониторингом

Объект, используемый в этом примере, является системой с одним входом и одним выходом с жесткими пределами как на манипулируемой переменной (MV), так и на управляемом выходе (OV). Цель управления состоит в том, чтобы удерживать OV на заданном значении 0. Неизмеренное нарушение порядка нагрузки добавляется к OV. Это нарушение порядка первоначально является увеличением наклона. Реакция контроллера в конечном счете насыщает MV на своем жестком пределе. Когда происходит насыщение, контроллер не может больше ничего сделать, и нарушение порядка в конечном счете управляет OV выше заданного верхнего предела. Когда контроллер предсказывает, что невозможно форсировать OV ниже этого верхнего предела, QP во время выполнения становится недопустимым.

Определите объект как систему SISO первого порядка с единичным коэффициентом усиления.

Plant = tf(1,[2 1]);

Определите неизмеренное нарушение порядка нагрузки. Сигнал растёт от 0 на 2 между 1 и 3 секунд, затем отклоняется от 2 на 0 между 3 и 5 секунд.

LoadDist = [0 0; 1 0; 3 2; 5 0; 7 0];

Проектирование контроллера MPC

Создайте объект MPC с помощью модели тестового объекта. Выбранный контрольный интервал составляет около одной десятой доминирующей временной константы объекта.

Ts = 0.2;
Obj = mpc(Plant, Ts);
-->The "PredictionHorizon" property of "mpc" object is empty. Trying PredictionHorizon = 10.
-->The "ControlHorizon" property of the "mpc" object is empty. Assuming 2.
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000.
-->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000.
-->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.

Задайте жесткие ограничения на входе (MV) и выходе (OV) объекта. По умолчанию все ограничения СН жесткие, а ограничения СН мягкие.

Obj.MV.Min = -0.5;
Obj.MV.Max =  1;
Obj.OV.Min = -1;
Obj.OV.Max =  1;
Obj.OV.MinECR = 0; % change OV lower limit from soft to hard
Obj.OV.MaxECR = 0; % change OV upper limit from soft to hard

Как правило, жесткие ограничения OV не рекомендуются и используются здесь только для иллюстрации того, как обнаружить недопустимый QP. Жесткие ограничения OV делают недопустимость вероятной, и в этом случае важен план резервного управления. Этот пример не включает план резервного копирования. Однако, как показано на симуляции, действие по умолчанию замораживания одиночного MV является лучшим ответом в этом простом случае.

Симулируйте использование Simulink со встроенными Решателями QP

Чтобы запустить этот пример, необходимы Simulink и Optimization Toolbox.

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink is required to run this example.')
    return
end
if ~mpcchecktoolboxinstalled('optim')
    disp('The Optimization Toolbox is required to run this example.')
    return
end

Создайте систему управления в модели Simulink и включите qp.status outport путем выбора параметра Optimization status блока MPC Controller. Отображение qp.status во время выполнения значение в возможностях «Состояние контроллера».

mdl = 'mpc_onlinemonitoring';
open_system(mdl)

Симулируйте ответ с обратной связью с помощью решателя QP Model Predictive Control Toolbox по умолчанию.

open_system([mdl '/Controller Status'])
open_system([mdl '/Response'])
sim(mdl)
-->Converting the "Model.Plant" property of "mpc" object to state-space.
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Объяснение отклика с обратной связью

Как показано в области ответа, на 1,4 секунде увеличение нарушения порядка заставляет MV насыщаться на своей нижней границе -0,5, что является решением QP в этих условиях (потому что контроллер пытается удерживать OV в заданном значении 0).

OV продолжает увеличиваться из-за нарушения порядка пандуса и, на 2,2 секунды, превышает заданную жесткую верхнюю границу 1.0. Поскольку QP сформулирован в терминах предсказанных выходов, контроллер все еще предсказывает, что он может вернуть OV ниже 1,0 в следующем движении, и поэтому задача QP все еще является допустимой.

Наконец, на t = 3,2 секунде контроллер предсказывает, что он больше не может перемещать OV ниже 1,0 в течение следующего контрольного интервала, и задача QP становится недопустимой и qp.status изменяется на -1 в это время.

Через три секунды нарушение порядка уменьшается. На 3,8 секунде QP снова становится допустимым. OV все еще намного выше своей уставки, однако, и MV остается насыщенным до 5,4 секунд, когда решение QP должно увеличить MV, как показано. С этого момента MV не насыщается, и контроллер способен привести OV к своей уставке.

Когда QP допустимо, встроенный решатель находит решение в трех итерациях или менее.

Симулируйте с пользовательским решателем QP

Чтобы изучить, как пользовательский решатель ведет себя в тех же условиях, активируйте пользовательскую опцию решателя, задав Optimizer.CustomSolver свойство контроллера MPC.

Obj.Optimizer.CustomSolver = true;

Вы также должны предоставить функцию MATLAB ®, которая удовлетворяет всем следующим требованиям:

  • Имя функции должно быть mpcCustomSolver.

  • Входные параметры функции должны совпадать с заданными в mpcCustomSolver.txt файл шаблона.

  • Функция должна находиться в пути MATLAB.

В данном примере используйте пользовательский решатель, заданный в mpcCustomSolver.txt, который использует quadprog команда из Optimization Toolbox в качестве пользовательского решателя QP. Чтобы реализовать свой собственный пользовательский решатель, измените этот файл.

Сохраните функцию в рабочей папке как .m файл.

src = which('mpcCustomSolver.txt');
dest = fullfile(pwd,'mpcCustomSolver.m');
copyfile(src,dest,'f');

Проверьте сохраненные mpcCustomSolver.m файл.

function [x, status] = mpcCustomSolver(H, f, A, b, x0)
% mpcCustomSolver allows user to specify a custom quadratic programming
% (QP) solver to solve the QP problem formulated by MPC controller.  When
% the "mpcobj.Optimizer.CustomSolver" property is set true, instead of
% using the built-in QP solver, MPC controller will now use the customer QP
% solver defined in this function for simulations in MATLAB and Simulink.
%
% The MPC QP problem is defined as follows:
%   Find an optimal solution, x, that minimizes the quadratic objective
%   function, J = 0.5*x'*H*x + f'*x, subject to linear inequality
%   constraints, A*x >= b.
%
% Inputs (provided by MPC controller at run-time):
%       H: a n-by-n Hessian matrix, which is symmetric and positive definite.
%       f: a n-by-1 column vector.
%       A: a m-by-n matrix of inequality constraint coefficients.
%       b: a m-by-1 vector of the right-hand side of inequality constraints.
%      x0: a n-by-1 vector of the initial guess of the optimal solution.
%
% Outputs (fed back to MPC controller at run-time):
%       x: must be a n-by-1 vector of optimal solution. 
%  status: must be an finite integer of:
%           positive value: number of iterations used in computation
%                        0: maximum number of iterations reached
%                       -1: QP is infeasible
%                       -2: Failed to find a solution due to other reasons
% Note that even if solver failed to find an optimal solution, "x" must be
% returned as a n-by-1 vector (i.e. set it to the initial guess x0)
%
% DO NOT CHANGE LINES ABOVE

% The following code is an example of how to implement the custom QP solver
% in this function.  It requires Optimization Toolbox to run.

% Define QUADPROG options and turn off display of optimization results in
% Command window.
options = optimoptions('quadprog');
options.Display = 'none';  
% By definition, constraints required by "quadprog" solver is defined as
% A*x <= b.  However, in our MPC QP problem, the constraints are defined as
% A*x >= b.  Therefore, we need to implement some conversion here:
A_custom = -A;
b_custom = -b;
% Compute the QP's optimal solution.  Note that the default algorithm used
% by "quadprog" ('interior-point-convex') ignores x0.  "x0" is used here as
% an input argument for illustration only.
H = (H+H')/2; % ensure Hessian is symmetric
[x, ~, Flag, Output] = quadprog(H, f, A_custom, b_custom, [], [], [], [], x0, options);
% Converts the "flag" output to "status" required by the MPC controller.
switch Flag
    case 1
        status = Output.iterations;
    case 0
        status = 0;
    case -2
        status = -1;
    otherwise
        status = -2;
end
% Always return a non-empty x of the correct size.  When the solver fails,
% one convenient solution is to set x to the initial guess.
if status <= 0
    x = x0;
end

Повторите симуляцию.

set_param([mdl '/Controller Status'],'ymax','10');
sim(mdl)
-->Converting the "Model.Plant" property of "mpc" object to state-space.
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Входной и выходной сигналы объекта управления идентичны сигналам, полученным с помощью встроенного решателя Model Predictive Control Toolbox, но qp.status показывает, что quadprog не принимает такое же количество итераций, чтобы найти решение. Однако он обнаруживает тот же период недопустимости.

bdclose(mdl);

Похожие темы