Этот пример показов, как решить, используя Simulink, задачу MPC, в которой некоторые манипулированные переменные принадлежат дискретному набору.
Исправьте начальное значение генератора для повторяемости.
rng(0);
Создайте строго соответствующий объект в дискретном времени с 4 состояниями, двумя входами и одним выходом.
plant = drss(4,1,2); plant.D = 0;
Увеличьте полномочия управления первого входа, чтобы лучше проиллюстрировать его вклад в управление.
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;
Создайте выход уставку, равную нулю, из шагов 20
на 35
и равным 0.6
до и после.
r = ones(1,50)*0.6; r(20:35) = 0;
Создайте симуляцию замкнутого цикла Simulink с помощью блока MPC Controller, с mpcobj
объект передан как параметр, чтобы управлять объектом с двойным интегратором. В данном примере откройте ранее существовавшую модель Simulink dcsdemo.slxc
.
open('dcsdemo.slx')
Теперь можно запустить модель, нажав Запуск или с помощью команды MATLAB sim
.
sim('dcsdemo.slx')
-->No sample time provided for plant model. Assuming sample time = controller's sample time = 0.1. -->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.
ans = Simulink.SimulationOutput: tout: [51x1 double] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
После симуляции графики двух возможностей показывают, что манипулируемая переменная не превышает предел, и выход объекта отслеживает опорный сигнал примерно через полсекунды.
Набор дискретного управления MPC