В этом примере показано, как управлять установкой двойного интегратора при насыщении входных данных в Simulink ® с помощью явного MPC.
Пример управления двойным интегратором с неявным контроллером MPC см. в разделе Модельное предиктивное управление установкой с одним входом и одним выходом.
Линейная динамическая модель с разомкнутым контуром является двойным интегратором.
plant = tf(1,[1 0 0]);
Создайте объект контроллера с периодом выборки, прогнозом и горизонтами управления.
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.
Состояния контроллера ПДК включают в себя состояния из модели установки, модели возмущения и модели шума в этом порядке. Установка диапазона переменной состояния иногда затруднена, когда состояние не соответствует физическому параметру. В этом случае для сбора данных, отражающих диапазоны состояний, рекомендуется многократное моделирование установки с разомкнутым контуром с типичными опорными сигналами и сигналами возмущения.
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.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink is required to run this example.') return end
Моделирование традиционного контроллера MPC в Simulink. Блок контроллера MPC сконфигурирован для использования mpcobj в качестве своего контроллера.
mdl = 'mpc_doubleint';
open_system(mdl)
sim(mdl)



Смоделировать явный контроллер MPC в Simulink. Блок явного контроллера MPC настроен на использование 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)