exponenta event banner

Использование неоптимального решения в приложениях Fast 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 с ограничениями на MV и OV

Создайте контроллер 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)

См. также

Функции

Блоки

Связанные темы