В этом примере показано, как решить в 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