Явное MPC управление объектом с одним входом и одним выходом

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

Для примера, который управляет двойным интегратором с неявным контроллером MPC, смотрите Прогнозирующее Управление Модели Объекта с одним входом и одним выходом.

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

Линейная динамическая модель разомкнутого контура является двойным интегратором.

plant = tf(1,[1 0 0]);

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

Создайте объект контроллера с периодом расчета 0,1 секунд и предсказание и управляйте горизонтами 10 и 3 шагов соответственно.

Ts = 0.1;
mpcobj = mpc(plant, Ts, 10, 3);
-->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',-1,'Max',1);

Сгенерируйте явный контроллер MPC

Явный MPC выполняет эквивалентную явную кусочную аффинную версию закона о MPC управлении, заданного традиционным неявным MPC. Чтобы сгенерировать явный объект MPC от традиционного MPC один, необходимо указать диапазон для каждого состояния контроллера, опорного сигнала, управлял переменным и измеренным воздействием. Это позволяет, чтобы мультипараметрическая проблема квадратичного программирования, сопоставленная к проблеме MPC, была настроена и решена, раз и навсегда, в пространстве параметров, заданном этими областями значений.

Используйте generateExplicitRange функция, чтобы получить структуру области значений, где можно указать диапазоны параметра.

range = generateExplicitRange(mpcobj);
-->Converting the "Model.Plant" property of "mpc" object to state-space.
-->Converting model to discrete time.
   Assuming no disturbance added to measured output channel #1.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Контроллер MPC состояния включает состояния от модели объекта управления, возмущения и шумовой модели, в том порядке. Установка области значений переменной состояния иногда затрудняет, когда состояние не соответствует физическому параметру. В этом случае несколько запусков симуляции объекта разомкнутого контура с типичной ссылкой и сигналами воздействия рекомендуются для того, чтобы собрать данные, которые отражают области значений состояний.

range.State.Min(:) = [-10;-10];
range.State.Max(:) = [10;10];

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

range.Reference.Min = -2;
range.Reference.Max = 2;

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

range.ManipulatedVariable.Min = -1.1;
range.ManipulatedVariable.Max = 1.1;

Используйте generateExplicitMPC команда, чтобы получить явный контроллер MPC с указанными диапазонами параметра.

mpcobjExplicit = generateExplicitMPC(mpcobj, range)

Regions found / unexplored:       19/       0

 
Explicit MPC Controller
---------------------------------------------
Controller sample time:    0.1 (seconds)
Polyhedral regions:        19
Number of parameters:      4
Is solution simplified:    No
State Estimation:          Default Kalman gain
---------------------------------------------
Type 'mpcobjExplicit.MPC' for the original implicit MPC design.
Type 'mpcobjExplicit.Range' for the valid range of parameters.
Type 'mpcobjExplicit.OptimizationOptions' for the options used in multi-parametric QP computation.
Type 'mpcobjExplicit.PiecewiseAffineSolution' for regions and gain in each solution.

Используйте simplify функция с 'exact' метод, чтобы соединить пары областей, соответствующие усиления которых являются тем же самым и чье объединение является выпуклым набором. Выполнение так может уменьшать объем потребляемой памяти явного контроллера MPC, не жертвуя никакой эффективностью.

mpcobjExplicitSimplified = simplify(mpcobjExplicit, 'exact')

Regions to analyze:       15/      15

 
Explicit MPC Controller
---------------------------------------------
Controller sample time:    0.1 (seconds)
Polyhedral regions:        15
Number of parameters:      4
Is solution simplified:    Yes
State Estimation:          Default Kalman gain
---------------------------------------------
Type 'mpcobjExplicitSimplified.MPC' for the original implicit MPC design.
Type 'mpcobjExplicitSimplified.Range' for the valid range of parameters.
Type 'mpcobjExplicitSimplified.OptimizationOptions' for the options used in multi-parametric QP computation.
Type 'mpcobjExplicitSimplified.PiecewiseAffineSolution' for regions and gain in each solution.

Количество кусочных аффинных областей было сокращено.

Постройте кусочный аффинный раздел

Можно рассмотреть любой 2D раздел кусочного аффинного раздела, заданного явным законом о MPC управлении.

Используйте generatePlotParameters команда, чтобы получить структуру параметра, где можно задать который 2D раздел построить впоследствии.

params = generatePlotParameters(mpcobjExplicitSimplified)
params = 

  struct with fields:

                  State: [1x1 struct]
              Reference: [1x1 struct]
    MeasuredDisturbance: [1x1 struct]
    ManipulatedVariable: [1x1 struct]

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

Оставьте состояния свободными варьироваться.

params.State.Index = [];
params.State.Value = [];

Зафиксируйте опорный сигнал.

params.Reference.Index = 1;
params.Reference.Value = 0;

Зафиксируйте переменную, которой управляют.

params.ManipulatedVariable.Index = 1;
params.ManipulatedVariable.Value = 0;

Используйте plotSection команда, чтобы построить 2D раздел, заданный двумя свободными параметрами. Для получения дополнительной информации смотрите plotSection.

plotSection(mpcobjExplicitSimplified, params);
axis([-4 4 -4 4]);
grid
xlabel('State #1');
ylabel('State #2');

Симулируйте Используя mpcmove Функция

Сравните симуляции с обратной связью для традиционного неявного MPC и явного MPC с помощью mpcmove и mpcmoveExplicit функции соответственно.

Инициализируйте переменные, чтобы сохранить ответы MPC с обратной связью.

Tf = round(5/Ts);
YY = zeros(Tf,1);
YYExplicit = zeros(Tf,1);
UU = zeros(Tf,1);
UUExplicit = zeros(Tf,1);

Подготовьте модель объекта управления, используемую в симуляции

sys = c2d(ss(plant),Ts);
xsys = [0;0];
xsysExplicit = xsys;

Чтобы получить указатель на внутренние состояния для обоих контроллеров, используйте mpcstate.

xmpc = mpcstate(mpcobj);
xmpcExplicit = mpcstate(mpcobjExplicitSimplified);

Итеративно симулируйте ответ с обратной связью для обоих контроллеров.

for t = 0:Tf

    % update plant measurement
    ysys = sys.C*xsys;
    ysysExplicit = sys.C*xsysExplicit;

    % compute traditional MPC action
    u = mpcmove(mpcobj,xmpc,ysys,1);
    % compute explicit MPC action
    uExplicit = mpcmoveExplicit(mpcobjExplicit,xmpcExplicit,ysysExplicit,1);

    % store signals
    YY(t+1)=ysys;
    YYExplicit(t+1)=ysysExplicit;
    UU(t+1)=u;
    UUExplicit(t+1)=uExplicit;

    % update plant state
    xsys = sys.A*xsys + sys.B*u;
    xsysExplicit = sys.A*xsysExplicit + sys.B*uExplicit;
end

% Norm of the differences between traditional and explicit controller signals.
fprintf('\nDifference between traditional and Explicit MPC responses using MPCMOVE command is %g\n',...
    norm(UU-UUExplicit)+norm(YY-YYExplicit));
Difference between traditional and Explicit MPC responses using MPCMOVE command is 2.19461e-13

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

Сравните симуляции с обратной связью между традиционным и явным MPC с помощью sim команда.

Tf = 5/Ts;                      % number of simulation iterations
[y1,t1,u1] = sim(mpcobj,Tf,1);  % simulate with traditional MPC
[y2,t2,u2] = sim(mpcobjExplicitSimplified,Tf,1); % simulate with explicit MPC
-->Converting the "Model.Plant" property of "mpc" object to state-space.
-->Converting model to discrete time.
   Assuming no disturbance added to measured output channel #1.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Результаты симуляции идентичны.

fprintf('\nDifference between traditional and Explicit MPC responses using SIM command is %g\n',...
    norm(u2-u1)+norm(y2-y1));
Difference between traditional and Explicit MPC responses using SIM command is 2.19384e-13

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

Симулируйте традиционный контроллер MPC в Simulink. Блок MPC Controller сконфигурирован, чтобы использовать mpcobj как его контроллер.

mdl = 'mpc_doubleint';
open_system(mdl)
sim(mdl)

Симулируйте явный контроллер MPC в Simulink. Блок Explicit MPC Controller сконфигурирован, чтобы использовать mpcobjExplicitSimplified как его контроллер.

mdlExplicit = 'empc_doubleint';
open_system(mdlExplicit)
sim(mdlExplicit)

Ответы с обратной связью идентичны.

fprintf('\nDifference between traditional and Explicit MPC responses in Simulink is %g\n',...
    norm(uExplicit-u)+norm(yExplicit-y));
Difference between traditional and Explicit MPC responses in Simulink is 2.21176e-13

Закройте обоих simulink модели.

bdclose(mdl)
bdclose(mdlExplicit)

Похожие темы