Этот пример показывает, как использовать выходной порт «оптимальной стоимости» блока MPC Controller, чтобы переключаться между несколькими прогнозирующими контроллерами модели, выходы которых ограничены дискретными значениями.
Линейная модель объекта управления выглядит следующим образом:
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);