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

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

Для примера, который управляет двойным интегратором с неявным контроллером MPC, см. Model Predictive Control of a Объект с Одним Входом и Одним Выходом.

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

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

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

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

Создайте объект контроллера с периодом дискретизации, предсказанием и горизонтами управления.

Ts = 0.1;
p = 10;
m = 3;
mpcobj = mpc(plant, Ts, p, m);
-->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, необходимо задать область значений для каждого состояния контроллера, опорный сигнал, управляемую переменную и измеренную нарушением порядка так, чтобы многопараметрическая квадратичная задача программирования была решена в пространстве параметров, заданном этими областями значений.

Используйте 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.

Количество кусочно-аффинных регионов уменьшено.

Построение кусочно-аффинной перегородки

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

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

params = generatePlotParameters(mpcobjExplicitSimplified);

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

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

Исправьте другие опорные сигналы.

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

Исправьте манипулированные переменные.

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

Использование plotSection команда для построения графика 2-D сечения, определенного ранее.

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

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 1.79044e-13

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

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

Tf = 5/Ts;                      % simulation iterations
[y1,t1,u1] = sim(mpcobj,Tf,1);  % simulation with tradition MPC
[y2,t2,u2] = sim(mpcobjExplicitSimplified,Tf,1); % simulation 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 1.79056e-13

Симулируйте с использованием Simulink

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

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

Симулируйте традиционный контроллер 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 1.64411e-13
bdclose(mdl)
bdclose(mdlExplicit)

Похожие темы