В этом примере показано, как использовать выход «оптимальной стоимости» блока контроллера MPC для переключения между несколькими модельными контроллерами прогнозирования, выходы которых ограничены дискретными значениями.
Линейная модель установки выглядит следующим образом:
plant = ss(tf({1,1},{[1 1.2 1],[1 1]}),'min'); % Plant with 2 inputs and 1 output
[A,B,C,D] = ssdata(plant); % Get state-space realization matrices, to be used in Simulink
x0 = [0;0;0]; % Initial plant state
Укажите типы входных и выходных сигналов.
plant = setmpcsignals(plant,'MV',1,'MD',2); % First input is manipulated, second is measured disturbance
Проектирование двух контроллеров MPC с ограничениями СН u=-1 и u=1соответственно. Только u в текущее время квантуется. Последующие вычисленные управляющие действия могут иметь любое значение в диапазоне от -1 до 1. Контроллер использует подход отходящего горизонта, так что эти значения на самом деле не идут к растениям.
Ts = 0.2; % Sampling time p = 20; % Prediction horizon m = 10; % Control horizon mpc1 = mpc(plant,Ts,p,m); % First MPC object mpc2 = mpc(plant,Ts,p,m); % Second MPC object % Specify weights mpc1.Weights = struct('MV',0,'MVRate',.3,'Output',1); % Weights mpc2.Weights = struct('MV',0,'MVRate',.3,'Output',1); % Weights % Specify constraints mpc1.MV = struct('Min',[-1;-1],'Max',[-1;1]); % Constraints on the manipulated variable: u = -1 mpc2.MV = struct('Min',[1;-1],'Max',[1;1]); % Constraints on the manipulated variable: u = 1
-->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. -->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.
Для выполнения этого примера необходимо приложение Simulink ®.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end % Specify signals: Tstop = 40; ref.time = 0:Ts:(Tstop+p*Ts); ref.signals.values = double(ref.time>10)'; % Step change in reference signal at time t=10 md.time = ref.time; md.signals.values = double(md.time>30)'; % Step change in measured disturbance signal at time t=30
Откройте и смоделируйте модель Simulink ®:
mdl = 'mpc_optimalcost'; open_system(mdl); % Open Simulink(R) Model sim(mdl,Tstop); % Start Simulation
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.




Обратите внимание, что:
Время от 0 до 10 управляющее действие продолжает переключаться между MPC1 (-1) и MPC2 (+ 1). Это происходит потому, что опорный сигнал равен 0 и требует выхода контроллера на 0 для достижения устойчивого состояния, которое не может быть достигнуто ни с одним из контроллеров MPC.
С момента времени 10 по 30 выбирается MPC2 управляющий выход (+ 1), потому что опорный сигнал становится + 1 и требует выхода контроллера на + 1 для достижения устойчивого состояния (коэффициент усиления установки равен 1), что может быть достигнуто посредством MPC2.
Со времени 30 по 40 действие управления снова начинает переключаться. Это происходит потому, что при наличии измеренного возмущения (+ 1) MPC1 приводит к установившемуся состоянию 0, а MPC2 приводит к установившемуся состоянию + 2, в то время как опорный сигнал по-прежнему требует + 1.
Использовать mpcmove для выполнения пошагового моделирования и вычисления текущего управляющего действия MPC:
[Ad,Bd,Cd,Dd] = ssdata(c2d(plant,Ts)); % Discrete-time dynamics Nsteps = round(Tstop/Ts); % Number of simulation steps
Инициализация матриц для хранения результатов моделирования
YY = zeros(Nsteps+1,1); RR = zeros(Nsteps+1,1); UU = zeros(Nsteps+1,1); COST = zeros(Nsteps+1,1); x = x0; % Initial plant state xt1 = mpcstate(mpc1); % Initial state of the MPC controller #1 xt2 = mpcstate(mpc2); % Initial state of the MPC controller #2
Начать моделирование.
for td=0:Nsteps % Construct signals v = md.signals.values(td+1); r = ref.signals.values(td+1); % Plant equations: output update y = Cd*x + Dd(:,2)*v; % Compute both MPC moves options = mpcmoveopt; options.OnlyComputeCost = true; % the last input argument tells "mpcmove" to only compute the optimal cost [u1,Info1] = mpcmove(mpc1,xt1,y,r,v,options); [u2,Info2] = mpcmove(mpc2,xt2,y,r,v,options); % Compare the resulting optimal costs and choose the input value % corresponding to the smallest cost if Info1.Cost<=Info2.Cost u = u1; cost = Info1.Cost; % Update internal MPC state to the correct value xt2.Plant = xt1.Plant; xt2.Disturbance = xt1.Disturbance; xt2.LastMove = xt1.LastMove; else u = u2; cost = Info2.Cost; % Update internal MPC state to the correct value xt1.Plant = xt2.Plant; xt1.Disturbance = xt2.Disturbance; xt1.LastMove = xt2.LastMove; end % Store plant information YY(td+1) = y; RR(td+1) = r; UU(td+1) = u; COST(td+1) = cost; % Plant equations: state update x = Ad*x + Bd(:,1)*u + Bd(:,2)*v; end
Постройте график результатов mpcmove для сравнения с результатами моделирования, полученными в Simulink ®:
subplot(131) plot((0:Nsteps)*Ts,[YY,RR]); % Plot output and reference signals grid title('OV and Reference') subplot(132) plot((0:Nsteps)*Ts,UU); % Plot manipulated variable grid title('MV') subplot(133) plot((0:Nsteps)*Ts,COST); % Plot optimal MPC value function grid title('Optimal cost')

Эти графики напоминают графики в областях модели Simulink ®.
bdclose(mdl);