В этом примере показано, как использовать недиагональные матрицы веса в прогнозирующем контроллере модели.
Линейная модель объекта управления имеет два входных параметров и два выходных параметров.
plant = ss(tf({1,1;1,2},{[1 .5 1],[.7 .5 1];[1 .4 2],[1 2]})); [A,B,C,D] = ssdata(plant); Ts = 0.1; % sampling time plant = c2d(plant,Ts); % convert to discrete time
Создайте контроллер MPC.
p=20; % prediction horizon m=2; % control horizon mpcobj = mpc(plant,Ts,p,m);
-->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.
Задайте ограничения на переменную, которой управляют.
mpcobj.MV = struct('Min',{-3;-2},'Max',{3;2},'RateMin',{-100;-100},'RateMax',{100;100});
Задайте недиагональный выходной вес. Обратите внимание на то, что это задано в массиве ячеек.
OW = [1 -1]'*[1 -1]; % Non-diagonal output weight, corresponding to ((y1-r1)-(y2-r2))^2 mpcobj.Weights.OutputVariables = {OW}; % Non-diagonal input weight, corresponding to (u1-u2)^2 mpcobj.Weights.ManipulatedVariables = {0.5*OW};
Задайте опции симуляции.
Tstop = 30; % simulation time Tf = round(Tstop/Ts); % number of simulation steps r = ones(Tf,1)*[1 2]; % reference trajectory
Запустите симуляцию с обратной связью и постройте результаты.
[y,t,u] = sim(mpcobj,Tf,r); subplot(211) plot(t,y(:,1)-r(1,1)-y(:,2)+r(1,2));grid title('(y_1-r_1)-(y_2-r_2)'); subplot(212) plot(t,u);grid title('u');
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Чтобы запустить этот пример, Simulink® требуется.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this part of the example.') return end
Теперь симулируйте MPC с обратной связью в Simulink®.
mdl = 'mpc_weightsdemo';
open_system(mdl);
sim(mdl)
bdclose(mdl);