Можно симулировать ответ с обратной связью контроллера 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) может привести к неприемлемому поведению системы, такому как нестабильность. Такой план резервного копирования обязательно является специфичным для конкретного приложения.
Объект, используемый в этом примере, является системой с одним входом и одним выходом с жесткими пределами как на манипулируемой переменной (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 с помощью модели тестового объекта. Выбранный контрольный интервал составляет около одной десятой доминирующей временной константы объекта.
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 и 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 допустимо, встроенный решатель находит решение в трех итерациях или менее.
Чтобы изучить, как пользовательский решатель ведет себя в тех же условиях, активируйте пользовательскую опцию решателя, задав 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);