Используйте субоптимальное решение в быстрых приложениях MPC

В этом примере показано, как гарантировать время выполнения худшего случая контроллера 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 с ограничениями на MVS и OVs

Создайте контроллер 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 определило последовательность оптимального управления.

Симулируйте в MATLAB со случайными Выходными воздействиями

Во-первых, симулируйте контроллер 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 со случайными Выходными воздействиями

Симулируйте контроллеры в 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)

Смотрите также

Функции

Блоки

Похожие темы