Переключающиеся контроллеры на основе оптимальных затрат

В этом примере показано, как использовать "оптимальную стоимость" выходной порт блока 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);

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

Похожие темы