Улучшание производительности управления с предварительным (предварительный просмотр)

В этом примере показано, как спроектировать прогнозирующий контроллер модели с предвидением (предварительный просмотр) на ссылке и измеренных траекториях воздействия.

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

Задайте модель объекта управления как линейную независимую от времени систему с двумя входными параметрами (одна переменная, которой управляют, и одно измеренное воздействие) и один выход.

plant = ss(tf({1,1},{[1 .5 1],[1 1]}),'min');

Получите матрицы пространства состояний модели объекта управления, установите время выборки 0,2 с, получите матрицы дискретного времени и задайте начальное условие.

[A,B,C,D] = ssdata(plant);              % continuous time ss realization
Ts = 0.2;                               % sampling time
[Ad,Bd,Cd,Dd] = ssdata(c2d(plant,Ts));  % discrete time ss realization
x0 = [0;0;0];                           % initial condition

Модель проекта прогнозирующий контроллер

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

plant = setmpcsignals(plant,'MV',1,'MD',2);

Создайте mpc объект.

p = 20;                         % prediction horizon
m = 10;                         % control horizon
mpcobj = mpc(plant,Ts,p,m);
% Specify MV constraints.
mpcobj.MV = struct('Min',0,'Max',2);
% Specify weights
mpcobj.Weights = struct('MV',0,'MVRate',0.1,'Output',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.

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

Tstop = 30;                     % simulation time.
time = (0:Ts:(Tstop+p*Ts))';    % time vector
r = double(time>10);            % reference signal
v = -double(time>20);           % measured disturbance signal

Используйте mpcsimopt объект включить функцию предварительного просмотра в симуляции с обратной связью.

params = mpcsimopt(mpcobj);
params.MDLookAhead='on';
params.RefLookAhead='on';

Симулируйте в MATLAB® с тулбоксом MPC sim команда.

YY1 = sim(mpcobj,Tstop/Ts+1,r,v,params);
-->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.

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

Создайте массив, чтобы сохранить выходные параметры с обратной связью.

YY2 = [];
% Create variables to store current states of plant and controller
x = x0;                   % initial plant state
xmpc = mpcstate(mpcobj);  % pointer to current controller state

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

for ct=0:round(Tstop/Ts)
    % Plant equations: output update
    y = C*x + D(:,2)*v(ct+1);
    % Store output signals
    YY2 = [YY2,y]; %#ok<*AGROW>
    % Compute MPC law. Extracts references r(t+1),r(t+2),...,r(t+p) and
    % measured disturbances v(t),v(t+1),...,v(t+p) for previewing.
    u = mpcmove(mpcobj,xmpc,y,r(ct+2:ct+p+1),v(ct+1:ct+p+1));
    % Plant equations: state update
    x = Ad*x+Bd(:,1)*u+Bd(:,2)*v(ct+1);
end

Постройте результаты.

figure
t = 0:Ts:Tstop;
plot(t,r(1:length(t)),'c:',t,YY1,'r-',t,YY2,'bo');
xlabel('Time');
ylabel('Plant Output');
legend({'Reference';'From sim command';'From mpcmove command'},'Location','SouthEast');
grid

Ответы идентичны.

Оптимальные предсказанные траектории возвращены mpcmove. Примите вам, начинают с текущего состояния и имеют изменение заданного значения в 0,5 на 5 шагах и принимают, что измеренное воздействие исчезло.

r1 = [ones(5,1);0.5*ones(p-5,1)];
v1 = zeros(p+1,1);
[~,Info] = mpcmove(mpcobj,xmpc,y,r1(1:p),v1(1:p+1));

Извлеките оптимальные предсказанные траектории и постройте их.

topt = Info.Topt;
yopt = Info.Yopt;
uopt = Info.Uopt;
figure
subplot(211)
title('Optimal sequence of predicted outputs')
stairs(topt,yopt);
grid
axis([0 p*Ts -2 2]);
subplot(212)
title('Optimal sequence of manipulated variables')
stairs(topt,uopt);
axis([0 p*Ts -2 2]);
grid

Получите представление LTI контроллера MPC с предварительным просмотром

Когда ограничения не активны, контроллер MPC ведет себя как линейный контроллер. Можно получить форму пространства состояний контроллера MPC, с y, [r (t+1); r (t+2);...; r (t+p)], и [v (t); v (t+1);...; v (t+p)] как входные параметры контроллеру.

Получите матрицы пространства состояний линеаризовавшего контроллера.

LTI = ss(mpcobj,'rv','on','on');
[AL,BL,CL,DL] = ssdata(LTI);

Создайте массив, чтобы сохранить выходные параметры с обратной связью.

YY3 = [];
% Setup initial state of the MPC controller
x = x0;
xL = [x0;0;0];

Запустите основной цикл симуляции

for ct=0:round(Tstop/Ts)
    % Plant output update
    y = Cd*x + Dd(:,2)*v(ct+1);
    % Save output and refs value
    YY3 =[YY3,y];
    % Compute the linear MPC control action
    u = CL*xL + DL*[y;r(ct+2:ct+p+1);v(ct+1:ct+p+1)];
    % Note that the optimal move provided by MPC would be: mpcmove(MPCobj,xmpc,y,ref(t+2:t+p+1),v(t+1:t+p+1));
    % Plant update
    x = Ad*x + Bd(:,1)*u + Bd(:,2)*v(ct+1);
    % Controller update
    xL = AL*xL + BL*[y;r(ct+2:ct+p+1);v(ct+1:ct+p+1)];
end

Постройте результаты.

figure
plot(t,r(1:length(t)),'c:',t,YY3,'r-');
xlabel('Time');
ylabel('Plant Output');
legend({'Reference';'Unconstrained MPC'},'Location','SouthEast');
grid

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

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

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink(R) is required to run this example.')
    return
end

time = (0:Ts:(Tstop+p*Ts))'; % time vector
r = double(time>10); % reference signal
v = -double(time>20); % measured disturbance signal

% Define the reference signal in structure
ref.time = time;
ref.signals.values = r;

% Define the measured disturbance
md.time = time;
md.signals.values = v;

% Open Simulink model
mdl = 'mpc_preview';
open_system(mdl)

% Simulate the model using the Simulink |sim| command
sim(mdl,Tstop);

Постройте результаты.

figure
t = 0:Ts:Tstop;
plot(t,r(1:length(t)),'c:',t,YY1,'r-',t,YY2,'bo',t,ySL,'gx');
xlabel('Time');
ylabel('Plant Output');
legend({'Reference';'From sim command';'From mpcmove command';'From Simulink'},'Location','SouthEast');
grid

Ответы идентичны.

bdclose('mpc_preview')

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

|

Похожие темы