Моделируйте контроллер MPC с пользовательским решателем QP

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

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

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

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

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

Приложения MPC в реальном времени могут обнаружить, является ли контроллер в режиме "отказа" (0 или -1) путем контроля выходного порта qp.status. Если отказ происходит, резервный план управления должен быть активирован. Это важно, если существует шанс, что QP мог стать неосуществимым, потому что действие по умолчанию (замораживающий MVS) может привести к недопустимому поведению системы, такому как нестабильность. Такой план резервного копирования, обязательно, специализирован.

Приложение MPC с онлайновым контролем

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

Задайте объект как систему SISO первого порядка с усилением единицы.

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

Задайте неизмеренное воздействие загрузки. Подъемы сигнала от 0 до 2 между 1 и секунды 3, затем сползает, отступают от 2 до 0 между секундами 5 и 3.

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.

Задайте трудные ограничения на вход объекта (мВ) и выведите (OV). По умолчанию все ограничения мВ трудны, и ограничения 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 делают infeasibility, вероятно, в этом случае резервный план управления важен. Этот пример не включает план резервного копирования. Однако как показано в симуляции, действие по умолчанию замораживания одного мВ является лучшим ответом в этом простом случае.

Моделируйте Используя 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 путем выбора параметра состояния Optimization блока MPC Controller. Отобразите значение qp.status во время выполнения в осциллографе Состояния контроллера.

mdl = 'mpc_onlinemonitoring';
open_system(mdl)

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

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 секунды, увеличивающееся воздействие заставляет мВ насыщать в его нижней границе-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 все еще много больше его заданного значения, однако, и мВ остается влажным до 5,4 секунд, когда решение QP состоит в том, чтобы увеличить мВ как показано. С тех пор мВ не насыщается, и контроллер может отвезти OV к его заданному значению.

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

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

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

Obj.Optimizer.CustomSolver = true;

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

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

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

  • Функция должна быть на пути MATLAB.

В данном примере используйте пользовательский решатель, заданный в mpcCustomSolver.txt, который использует команду quadprog от Optimization Toolbox как пользовательский решатель QP. Чтобы реализовать ваш собственный решатель 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 не берет то же количество итераций, чтобы найти решение. Однако это действительно обнаруживает тот же infeasibility период времени.

bdclose(mdl);

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте