В этом примере показано, как управлять объектом с двойным интегратором под входной насыщенностью в 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.
Контроллер 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.State.Index = []; params.State.Value = [];
Зафиксируйте другие ссылочные сигналы.
params.Reference.Index = 1; params.Reference.Value = 0;
Зафиксируйте переменные, которыми управляют.
params.ManipulatedVariable.Index = 1; params.ManipulatedVariable.Value = 0;
Используйте plotSection
команда, чтобы построить 2D раздел, заданный ранее.
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.77882e-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.78084e-13
Чтобы запустить этот пример, 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.69399e-13
bdclose(mdl) bdclose(mdlExplicit)