В этом примере показано, как использовать "оптимальную стоимость" выходной порт блока 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);