Разрабатывающий образцовый прогнозирующий диспетчер, эквивалентный Горизонту Бога LQR

Этот пример показывает, как разработать модель бесконечного горизонта, прогнозирующий диспетчер путем установки весов на терминале предсказал состояния.

Задайте модель объекта управления

Линейная динамическая модель разомкнутого цикла задана ниже. Усиление DC также вычисляется.

Ts = 0.1;                                   % Sampling time
A = [0.8 Ts;0 0.9];
B = [0;Ts];
C = [1 0];
sysd = ss(A,B,C,0,Ts);                      % Discrete-time plant model
dcg = dcgain(sysd);                         % DC-gain of prediction model

Разработайте контроллер горизонта Бога LQR

Вычислите матрицу Riccati, сопоставленную с проблемой LQR с выходным весом Qy, и введите вес Qu:

Qy = 10;                                    % Output weight: y'*Qy*y
Qu = 0.1;                                   % Input weight:  u'*Qu*y
[K,P] = lqry(sysd,Qy,Qu);                   % LQR gain and Riccati matrix

Взвесьте терминальный x'(t+p)*P*x(t+p) состояния, где p является горизонтом прогноза контроллера MPC. Вычислите Фактор Холесского chol(P) матрицы Riccati P, так, чтобы терминальный штраф стал:

x'(t+p)*P*x(t+p) = [chol(P)*x(t+p)]'*[chol(P)*x(t+p)] = yc'(t+p)*yc(t+p)

где новый вывод yc(t+p) = chol(P)*x(t+p) и x(t) состояния приняты, чтобы быть полностью измеримыми.

cholP = chol(P);

Измените и увеличьте выходной вектор, чтобы включать полный x состояния и yc: Выведите =, вектор состояния x + вывел yc, таким образом что yc '*yc = x '*P*x

sysd.C = [eye(2);cholP];
sysd.D = zeros(4,1);

Преобразуйте контроллер LQR в Конечный Горизонт контроллер MPC

Маркируйте новый дополнительный выходной сигнал yc (t) как неизмеренный:

sysd = setmpcsignals(sysd,'UO',[3 4]); % Cholesky factor is not measured
-->Assuming unspecified output signals are measured outputs.

Создайте объект контроллера с выборкой периода, прогноза и управляйте горизонтами:

p = 3;                   % Prediction horizon (for any p>=1, unconstrained MPC = LQR)
m = p;                   % Control horizon = prediction horizon
mpcobj = mpc(sysd,Ts,p,m); % MPC object
-->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.
   for output(s) y1 and zero weight for output(s) y2 y3 y4 

Задайте пределы насыщения привода как ограничения мВ.

mpcobj.MV = struct('Min',-3,'Max',3);

Задайте веса ввода и вывода на каждом шаге горизонта прогноза (терминальные веса установлены позже). Очень маленькие веса на входном шаге включены, чтобы сделать проблему QP сопоставленной с контроллером MPC положительный определенный:

mpcobj.Weights.OV = [sqrt(Qy) 0 0 0];       % Output weights (only on original output)
mpcobj.Weights.MV = sqrt(Qu);               % Input weight
mpcobj.Weights.MVRate = 1e-5;               % Very small weight on command input increments

Задайте заданные значения для вывода и входных сигналов:

ry = 1;                                     % Output set point
mpcobj.MV.Target = ry/dcg;                  % Set-point for manipulated variable

Наложите терминальный штраф x'(t+p)*P*x(t+p) путем определения модульного веса на yc(t+p) = chol(P)*x(t+p). Терминальный вес на u(t+p-1) остается то же самое, которое является sqrt(Qu):

Y = struct('Weight',[0 0 1 1]);             % Weight on y(t+p)
U = struct('Weight',sqrt(Qu));              % Weight on u(t+p-1)
setterminal(mpcobj,Y,U);                    % Set terminal weight y'*y = x'*P*x

Поскольку измеренный вывод является целым состоянием, демонтируйте любой дополнительный выходной интегратор воздействия, вставленный контроллером MPC:

setoutdist(mpcobj,'model',ss(zeros(4,1)));

Удалите средство оценки состояния путем определения следующего уравнения обновления измерения:

x[n|n] = x[n|n-1] + I * (x[n]-x[n|n-1]) = x[n]

Поскольку setterminal функционирует средство оценки состояния сброса к значению по умолчанию, мы используем функцию setEstimator, чтобы изменить средство оценки состояния после того, как setterminal называется.

setEstimator(mpcobj,[],eye(2));             % State estimate = state measurement

Сравните MPC и контроллеры LQR

Вычислите усиление контроллера MPC, когда ограничения будут неактивны, и сравнят его с усилением LQR:

mpcgain = dcgain(ss(mpcobj));
fprintf('\n(unconstrained) MPC: u(k)=[%8.8g,%8.8g]*x(k)',mpcgain(1),mpcgain(2));
fprintf('\n                LQR: u(k)=[%8.8g,%8.8g]*x(k)\n\n',-K(1),-K(2));
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

(unconstrained) MPC: u(k)=[-2.8363891,-2.1454028]*x(k)
                LQR: u(k)=[-2.8363891,-2.1454028]*x(k)

Усиления обратной связи состояния являются точно тем же самым.

Моделируйте Используя Simulink®

Чтобы запустить этот пример, Simulink® требуется.

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink(R) is required to run this example.')
    return
end

Задайте заданное значение для нового расширенного выходного вектора, содержащего x и chol(P)*x:

rx = (eye(2)-A)\B/dcg;
r = [rx;cholP*rx];                          % Set point for extended prediction model

Моделируйте управление с обратной связью линейной модели объекта управления в Simulink. Контроллер "mpcobj" задан в диалоговом окне блока.

mdl = 'mpc_infinite';
open_system(mdl);                           % Open Simulink(R) Model
sim(mdl);                                   % Start Simulation

Ответ с обратной связью показывает хорошую производительность отслеживания заданного значения.

bdclose('mpc_infinite');

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

Похожие темы