Этот пример показывает, как гарантировать время выполнения худшего случая контроллера MPC в режиме реального времени приложения при помощи субоптимального решения, возвращенного решателем оптимизации.
Образцовое прогнозирующее управление (MPC) решает проблему квадратичного программирования (QP) в каждом интервале управления. Встроенный решатель QP использует итеративный алгоритм активного набора, который эффективен для приложений MPC. Однако, когда ограничения присутствуют, нет никакого способа предсказать, сколько итерации решателя требуются, чтобы находить оптимальным решением. Кроме того, в режиме реального времени приложения, количество итераций может измениться существенно от одного интервала управления до следующего. В таких случаях время выполнения худшего случая может превысить предел, который позволен на аппаратной платформе и определен шагом расчета контроллера.
Можно гарантировать время выполнения худшего случая для контроллера MPC путем применения субоптимального решения после того, как количество итераций оптимизации превысит заданное максимальное значение. Чтобы установить время выполнения худшего случая, сначала определите время, необходимое для одной итерации оптимизации путем экспериментирования с контроллером при номинальных условиях. Затем установите маленькую верхнюю границу на количестве итераций на интервал управления.
По умолчанию, когда максимальное количество итераций достигнуто, диспетчер MPC не использует субоптимальное решение. Вместо этого контроллер устанавливает флаг ошибки (status = 0
) и замораживает его вывод. Часто, решение, доступное в более ранних итерациях, достаточно хорошо, но требует, чтобы улучшение нашло оптимальное решение, которое приводит ко многим дополнительным итерациям.
Этот пример показывает, как сконфигурировать ваш контроллер MPC, чтобы использовать субоптимальное решение. Субоптимальное решение является выполнимым решением, доступным в итоговой итерации (измененный, при необходимости, чтобы удовлетворить любые трудные ограничения на переменные, которыми управляют). Определить, обеспечивает ли субоптимальное решение приемлемую производительность управления для вашего приложения, симуляций выполнения через ваш рабочий диапазон.
Модель объекта управления является стабильной случайным образом сгенерированной системой пространства состояний. Это имеет состояния 10
, переменные, которыми управляют, (MV) 3
и 3
выходные параметры (OV).
rng(1234); nX = 10; nOV = 3; nMV = 3; Plant = rss(nX,nOV,nMV); Plant.d = 0; Ts = 0.1;
Создайте контроллер MPC со значениями по умолчанию для всех параметров контроллера кроме ограничений. Задайте ограничения и на которыми управляют и на выходные переменные.
verbosity = mpcverbosity('off'); % Temporarily disable command line messages. mpcobj = mpc(Plant, Ts); for i = 1:nMV mpcobj.MV(i).Min = -1.0; mpcobj.MV(i).Max = 1.0; end for i = 1:nOV mpcobj.OV(i).Min = -1.0; mpcobj.OV(i).Max = 1.0; end
Одновременные ограничения и на которыми управляют и на выходные переменные требуют, чтобы относительно большое количество итераций QP определило последовательность оптимального управления.
Во-первых, моделируйте контроллер MPC, использующий оптимальное решение в каждом интервале управления. Чтобы фокусироваться только на выходной производительности подавления помех, обнулите выходные значения ссылки.
T = 5; N = T/Ts + 1; r = zeros(1,nOV); SimOptions = mpcsimopt(); SimOptions.OutputNoise = 3*randn(N,nOV); [y,t,u,~,~,~,status] = sim(mpcobj,N,r,[],SimOptions);
Постройте количество итераций, используемых в каждом интервале управления.
figure stairs(status) hold on title('Number of Iterations')
Наибольшее число итераций равняется 21, и среднее значение является 5,8 итерациями.
Создайте контроллер MPC с теми же настройками, но сконфигурируйте его, чтобы использовать субоптимальное решение.
mpcobjSub = mpcobj; mpcobjSub.Optimizer.UseSuboptimalSolution = true;
Сократите максимальное количество итераций к небольшому числу.
mpcobjSub.Optimizer.MaxIter = 3;
Моделируйте второй контроллер с той же выходной последовательностью воздействия.
[ySub,tSub,uSub,~,~,~,statusSub] = sim(mpcobjSub,N,r,[],SimOptions);
Постройте количество итераций, используемых в каждом интервале управления на том же графике. Для любого интервала управления, в котором достигнуто максимальное количество итераций, statusSub
является нулем. Прежде, чем построить результат, определенный номер итераций для этих интервалов к 3
.
statusSub(statusSub == 0) = 3; stairs(statusSub) legend('optimal','suboptimal')
Наибольшее число итераций равняется теперь 3, и среднее значение является 2,8 итерациями.
Сравните производительность этих двух контроллеров. Когда субоптимальное решение используется, нет никакого значительного ухудшения в производительности управления по сравнению с оптимальным решением.
figure for ct=1:3 subplot(3,1,ct) plot(t,y(:,ct),t,ySub(:,ct)) end subplot(3,1,1) title('Outputs') legend('optimal','suboptimal')
Для приложения реального времени пока каждая итерация решателя берет меньше чем 30 миллисекунд на оборудовании, время выполнения худшего случая не превышает шаг расчета контроллера (секунды 0.1
). В целом безопасно принять, что время выполнения, используемое каждой итерацией, является более или менее константой.
Моделируйте контроллеры в Simulink®.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end Model = 'mpc_SuboptimalSolution'; open_system(Model) sim(Model)
Как в симуляции командной строки, среднем количестве итераций QP на интервал управления, уменьшенный, значительно не влияя на производительность управления.
mpcverbosity(verbosity); % Enable command line messages.
bdclose(Model)