Этот пример показывает, как гарантировать наихудшее время выполнения контроллера MPC в приложениях реального времени при помощи неоптимального решения, возвращенного решателем оптимизации.
Модель прогнозирующего управления (MPC) решает квадратичную задачу программирования (QP) на каждом контрольном интервале. Встроенный решатель QP использует итерационный алгоритм активного набора, который эффективен для приложений MPC. Однако, когда ограничения присутствуют, нет возможности предсказать, сколько итераций решателя требуется для поиска оптимального решения. Кроме того, в приложениях реального времени количество итераций может резко измениться от одного контрольного интервала к следующему. В таких случаях время выполнения в худшем случае может превысить предел, который допускается на аппаратной платформе и определяется шагом расчета контроллером.
Можно гарантировать наихудшее время выполнения для контроллера MPC, применив неоптимальное решение после того, как количество итераций оптимизации превысит заданное максимальное значение. Чтобы задать время выполнения в худшем случае, сначала определите время, необходимое для одной итерации оптимизации, экспериментировав с контроллером в номинальных условиях. Затем установите небольшую верхнюю границу количества итераций на контрольный интервал.
По умолчанию, когда достигается максимальное количество итераций, контроллер MPC не использует неоптимальное решение. Вместо этого контроллер устанавливает флаг ошибки (status = 0
) и замораживает его выход. Часто решение, доступное в более ранних итерациях, достаточно хорошо, но требует уточнения, чтобы найти оптимальное решение, что приводит ко многим дополнительным итерациям.
В этом примере показано, как сконфигурировать контроллер MPC, чтобы использовать неоптимальное решение. Субоптимальное решение является возможным решением, доступным при окончательной итерации (изменено, при необходимости, чтобы удовлетворить любым жестким ограничениям на манипулируемых переменных). Чтобы определить, обеспечивает ли неоптимальное решение приемлемую эффективность управления для вашего приложения, запустите симуляции в рабочей области значений.
Модель объекта управления является стабильной случайным образом сгенерированной системой в пространстве состояний. Имеет 10
состояния, 3
манипулированные переменные (MV) и 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;
Уменьшите максимальное количество итераций для решателя QP с активным набором по умолчанию до небольшого числа.
mpcobjSub.Optimizer.ActiveSetOptions.MaxIterations = 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)