Этот пример показывает, как разработать модель бесконечного горизонта, прогнозирующий диспетчер путем установки весов на терминале предсказал состояния.
Линейная динамическая модель разомкнутого цикла задана ниже. Усиление 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
Вычислите матрицу 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);
Маркируйте новый дополнительный выходной сигнал 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:
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® требуется.
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');