Настройка весов контроллера

В этом примере показано, как варьироваться веса на выходных параметрах, входных параметрах, и ECR ослабляют переменную для мягких ограничений в режиме реального времени.

Веса, заданные в объекте MPC, заменены весами, предоставленными блоку MPC Controller. Если сигнал веса не соединяется с блоком MPC Controller, то соответствующий вес является тем, заданным в объекте MPC.

Задайте модель объекта управления

Задайте многомерную линейную систему дискретного времени без прямого сквозного соединения ввода-вывода и примите, что вход № 4 является измеренным воздействием, и выход № 4 не измерен.

Ts = 0.1; % sampling time
plant = tf({1,[1 1],5,2;3,[1 5],1,0;0,0,1,[1 1];2,[1 -1],0,0},...
    {[1 1 1],[1 3 4 5],[1 10],[1 5];
      [1 1],[1 2],[1 2 8],[1 1];
      [1 2 1],[1 3 1 1],[1 1],[1 2];
      [1 1],[1 3 10 10],[1 10],[1 1]});
plant = c2d(ss(plant),Ts);
plant.D = 0;

Спроектируйте контроллер MPC

Задайте типы сигнала ввода и вывода.

plant = setmpcsignals(plant,'MD',4,'UO',4);
% Create the controller object with sampling period, prediction and control
% horizons:
p = 20;                                     % Prediction horizon
m = 3;                                      % Control horizon
mpcobj = mpc(plant,Ts,p,m);
-->Assuming unspecified input signals are manipulated variables.
-->Assuming unspecified output signals are measured outputs.
-->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.
   for output(s) y1 y2 y3 and zero weight for output(s) y4 

Задайте ограничения мВ.

mpcobj.MV(1).Min = -6;
mpcobj.MV(1).Max = 6;
mpcobj.MV(2).Min = -6;
mpcobj.MV(2).Max = 6;
mpcobj.MV(3).Min = -6;
mpcobj.MV(3).Max = 6;

Симулируйте Используя Simulink®

Чтобы запустить этот пример, Simulink® требуется.

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink(R) is required to run this example.')
    return
end
% Define reference signal.
Tstop = 10;
ref = [1 0 3 1];
r = struct('time',(0:Ts:Tstop)');
N = numel(r.time);
r.signals.values=ones(N,1)*ref;

Задайте измеренное воздействие.

v = 0.5;

Веса OV линейно увеличиваются со временем, за исключением выхода № 2, который не взвешивается.

ywt.time = r.time;
ywt.signals.values = (1:N)'*[.1 0 .1 .1];

Веса MVRate уменьшаются линейно со временем.

duwt.time = r.time;
duwt.signals.values = (1-(1:N)/2/N)'*[.1 .1 .1];

Вес ECR увеличивается экспоненциально со временем.

ECRwt.time = r.time;
ECRwt.signals.values = 10.^(2+(1:N)'/N);

Запустите симуляцию.

mdl = 'mpc_onlinetuning';
open_system(mdl);                   % Open Simulink(R) Model
sim(mdl);                           % Start Simulation
-->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.
-->Assuming output disturbance added to measured output channel #3 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Симулируйте Используя команду MPCMOVE

Задайте действительный объект и объект состояния MPC.

[A,B,C,D] = ssdata(plant);
x = zeros(size(plant.B,1),1);   % Initial state of the plant
xmpc = mpcstate(mpcobj);        % Initial state of the MPC controller

Сохраните траектории MPC с обратной связью в массивах YY, UU, XX.

YY = [];
UU = [];
XX = [];

Используйте объект MPCMOVEOPT обеспечить веса во времени выполнения.

options = mpcmoveopt;

Запустите симуляцию.

for t = 0:N-1,
    % Store states
    XX = [XX,x]; %#ok<*AGROW>
    % Compute plant output (no feedthrough from MV to Y)
    y = C*x+D(:,4)*v;
    YY = [YY;y'];
    % Obtain reference signal
    ref = r.signals.values(t+1,:)';
    % Update MPCMOVEOPT object with run-time weights
    options.MVRateWeight = duwt.signals.values(t+1,:);
    options.OutputWeight = ywt.signals.values(t+1,:);
    options.ECRWeight = ECRwt.signals.values(t+1,:);
    % Compute control action
    u = mpcmove(mpcobj,xmpc,y(1:3),ref,v,options);
    UU = [UU;u'];
    % Update plant states
    x = A*x + B(:,1:3)*u + B(:,4)*v;
end

Постройте и сравните результаты симуляции

figure(1);
clf;
subplot(121)
plot(0:Ts:Tstop,[YY ysim])
grid
title('output')
subplot(122)
plot(0:Ts:Tstop,[UU usim])
grid
title('input')

Результаты симуляции являются тем же самым.

fprintf('\n\nDifference between MPC Simulink block and MPCMOVE simulations: %g',norm(UU-usim)+norm(YY-ysim));

Difference between MPC Simulink block and MPCMOVE simulations: 6.66853e-11
bdclose(mdl);

Смотрите также

Похожие темы