Этот пример показов, как решить в MATLAB задачу MPC, в которой некоторые манипулированные переменные принадлежат дискретному набору.
Исправьте начальное значение генератора для повторяемости.
rng(0);
Создайте строго соответствующий объект в дискретном времени с 4 состояниями, двумя входами и одним выходом.
plant = drss(4,1,2); plant.D = 0;
Установите время дискретизации равное 0,1 с, и увеличьте полномочия управления первого входа, чтобы лучше проиллюстрировать его вклад в управление.
plant.Ts = 0.1; plant.B(:,1)=plant.B(:,1)*2;
Создайте контроллер MPC с одним временем дискретизации секунды, 20
шаги предсказания горизонт и 5
шаги управляют горизонтом.
mpcobj = mpc(plant,0.1,20,5);
-->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(1).Type = 'integer';
)
mpcobj.MV(1).Type = [-1 -0.7 -0.3 0 0.2 0.5 1];
Используйте пределы скорости, чтобы применить максимальные значения шага и уменьшения для первой управляемой переменной.
mpcobj.MV(1).RateMin = -0.5; mpcobj.MV(1).RateMax = 0.5;
Установите пределы второй манипулируемой переменной, тип которой по умолчанию (непрерывный) не был изменен.
mpcobj.MV(2).Min = -2; mpcobj.MV(2).Max = 2;
sim
Результаты команд и графиковУстановите количество шагов симуляции.
simsteps = 50;
Создайте выход уставку, равную нулю, из шагов 20
на 35
и равным 0.6
до и после.
r = ones(simsteps,1)*0.6; r(20:35) = 0;
Симулируйте замкнутый цикл с помощью sim
команда. Возвращает входной и выходной сигналы объекта.
[YY,~,UU,~,~,~,status] = sim(mpcobj,simsteps,r);
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Постройте график результатов.
figure(1) subplot(211) % plant output plot([YY,r]); grid title("Tracking control"); subplot(223) % first plant input stairs(UU(:,1)); grid %title("MV(1) discrete set "+ num2str(mpcobj.MV(1).Type','%0.1f ')) title("MV(1) discrete set ") subplot(224) % second plant input stairs(UU(:,2)); grid title("MV(2) continuous between [-2 2]")
Как ожидалось, первая манипулируемая переменная ограничена значениями, заданными в дискретном наборе (с переходами меньше заданного предела), в то время как вторая может изменяться постоянно между -2
и 2
. Вывод объекта отслеживает значение ссылки через несколько секунд.
mpcmove
Результаты команд и графиковПолучите указатель на mpcobj
состояние и инициализация состояния объекта.
xmpc = mpcstate(mpcobj); x = xmpc.Plant;
Инициализируйте массивы, которые хранят сигналы.
YY = []; RR = []; UU = []; XX = [];
Выполните симуляцию с помощью mpcmove
команда для вычисления управляющих действий.
for k = 1:simsteps XX = [XX;x']; % store plant state y = plant.C*x; % calculate plant output YY = [YY;y]; % store plant output RR = [RR;r(k)]; % store reference u = mpcmove(mpcobj,xmpc,y,r(k)); % calculate optimal mpc move UU = [UU;u']; % store plant input x = plant.A*x+plant.B*u; % update plant state % is the last line necessary since x=xmpc.Plant gets updated anyway? end
Постройте график результатов.
figure(2) subplot(211) % plant output plot([YY,r]); grid title("Tracking control"); subplot(223) % first plant input stairs(UU(:,1)); grid title("MV(1) discrete set") subplot(224) % second plant input stairs(UU(:,2)); grid title("MV(2) continuous between [-2 2]")
Эти результаты симуляции идентичны таковым, достигнутой с помощью sim
команда.
Набор дискретного управления MPC