Коммутационные контроллеры на основе оптимальных затрат

Этот пример показывает, как использовать выходной порт «оптимальной стоимости» блока 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

Проектирование контроллера MPC

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

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

®

Чтобы запустить этот пример, требуется 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

Использование 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);

См. также

Похожие темы