В этом примере показано, как использовать недиагональные выходные матрицы веса в прогнозирующем контроллере модели.
Линейная модель объекта управления имеет два входных параметров и два выходных параметров.
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 с предсказанием и управляйте горизонтом 20
и 2
шаги, соответственно.
mpcobj = mpc(plant,Ts,20,2);
-->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});
Чтобы задать недиагональные выходные веса, необходимо выбрать альтернативную функцию стоимости вместо стандартной функции стоимости. Альтернативная функция стоимости позволяет недиагональное взвешивание, но требует, чтобы веса были идентичны на каждом шаге горизонта предсказания. Для получения дополнительной информации о них функция стоимости смотрите Задачу оптимизации. Чтобы выбрать альтернативную функцию стоимости, необходимо задать матрицы веса в массивах ячеек. Для получения дополнительной информации смотрите раздел по весам в mpc
. Задайте недиагональный выходной вес, соответствуя ((y1-r1) - (y2-r2)) ^2.
OW = [1 -1]'*[1 -1]; mpcobj.Weights.OutputVariables = {OW};
Недиагональный входной вес, соответствуя (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);
-->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.
Постройте график результатов.
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');
Различие между двумя переменными погрешностями, которыми управляют, имеет тенденцию обнулять.
Теперь симулируйте MPC с обратной связью в Simulink. Как ожидалось результаты идентичны.
mdl = 'mpc_weightsdemo';
open_system(mdl);
sim(mdl)
Закройте simulink модель.
bdclose(mdl);