Этот пример показывает, как управлять объектом с двойным интегратором под входной насыщенностью в Simulink® с помощью явного MPC.
См. также MPCDOUBLEINT.
Линейная динамическая модель разомкнутого цикла является двойным интегратором:
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.
Задайте области значений для состояний контроллера
Контроллер 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;
Создайте Явный контроллер MPC
Используйте команду generateExplicitMPC
, чтобы получить Явный контроллер MPC с ранее заданными областями значений параметра.
mpcobjExplicit = generateExplicitMPC(mpcobj, range); display(mpcobjExplicit);
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
с "точным" методом, чтобы соединить пары областей, соответствующие усиления которых являются тем же самым и чье объединение является выпуклым набором. Эта практика может уменьшать объем потребляемой памяти Явного контроллера MPC без жертвы любая производительность.
mpcobjExplicitSimplified = simplify(mpcobjExplicit, 'exact');
display(mpcobjExplicitSimplified);
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);
Задайте параметры для 2D графика
В этом примере вы строите 1th переменную состояния по сравнению с 2-й переменной состояния. Все другие параметры должны быть зафиксированы в значении в его области значений.
params.State.Index = []; params.State.Value = [];
Зафиксируйте другие ссылочные сигналы
params.Reference.Index = 1; params.Reference.Value = 0;
Зафиксируйте переменные, которыми управляют,
params.ManipulatedVariable.Index = 1; params.ManipulatedVariable.Value = 0;
Постройте 2D раздел
Используйте команду plotSection
, чтобы построить 2D раздел, заданный ранее.
plotSection(mpcobjExplicitSimplified, params); axis([-4 4 -4 4]); grid xlabel('State #1'); ylabel('State #2');
Сравните симуляцию с обратной связью между традицией MPC (как отнесено как Неявный 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.78199e-13
Сравните симуляцию с обратной связью между традицией 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.78084e-13
Чтобы запустить этот пример, Simulink® требуется.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end
Моделируйте с традиционным контроллером MPC в Simulink. Контроллер "mpcobj" задан в диалоговом окне блока.
mdl = 'mpc_doubleint';
open_system(mdl);
sim(mdl);
Моделируйте с Явным контроллером MPC в Simulink. Контроллер "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.69399e-13
bdclose(mdl) bdclose(mdlExplicit)