Этот пример показывает, как спроектировать прогнозирующий контроллер модели для объекта с одним измеренным выходом, одной манипулированной переменной, одним измеренным нарушением порядка и одним неизмеренным нарушением порядка.
Определите модель объекта управления. В этом примере используются непрерывные передаточные функции времени от каждого входа к выходу. Отобразите модель объекта управления в командной строке.
plantTF = tf({1,1,1},{[1 .5 1],[1 1],[.7 .5 1]}) % display transfer functions
plantTF = From input 1 to output: 1 --------------- s^2 + 0.5 s + 1 From input 2 to output: 1 ----- s + 1 From input 3 to output: 1 ------------------- 0.7 s^2 + 0.5 s + 1 Continuous-time transfer function.
В данном примере явным образом преобразуйте объект в форму дискретного состояния пространства перед переходом к функции создания контроллера MPC.
Функция создания контроллера может принимать объекты в непрерывном времени или дискретном времени. Когда настраивается задача оптимизации, чтобы найти оптимальное значение манипулируемой переменной, контроллер MPC автоматически преобразует объект непрерывного времени (в любом формате) в модель дискретного состояния пространства, используя Нуль Order Hold.
Преобразование объекта в дискретное время полезно, когда вам нужны системные матрицы дискретного времени для анализа или симуляции (как в этом примере) или хотите, чтобы контроллер использовал объект дискретного времени, преобразованный с методом, отличным от ZOH.
plantCSS = ss(plantTF); % convert plant from transfer function to continuous-time state space Ts = 0.2; % specify a sample time of 0.2 seconds plantDSS = c2d(plantCSS,Ts); % convert plant to discrete-time state space, using Zero Order Hold
По умолчанию все входные сигналы объекта приняты как переменные с манипуляциями. Использование setmpcsignal
определить, какие сигналы измеряются и не измеряются нарушения порядка. В этом примере первый входной сигнал является манипулированной переменной, второй - измеренным нарушением порядка, третий - неизмеренным нарушением порядка. Эта информация хранится в модели объекта управления plantDSS
и позже используется контроллером mpc.
plantDSS = setmpcsignals(plantDSS,'MV',1,'MD',2,'UD',3); % specify signal types
Создайте объект контроллера, задав время дискретизации, а также горизонты предсказания и управления (10 и 3 шага соответственно).
mpcobj = mpc(plantDSS,Ts,10,3);
-->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.
Поскольку вы не задали веса квадратичной функции затрат, которая будет минимизирована контроллером, их значение принято как значение по умолчанию (0 для манипулируемых переменных, 0,1 для манипулируемых переменных скоростей, 1 для выходных переменных). Кроме того, на данной точке задача MPC все еще без ограничений, так как вы еще не указали никаких ограничений.
Задайте жесткие ограничения для управляемой переменной.
mpcobj.MV = struct('Min',0,'Max',1,'RateMin',-10,'RateMax',10);
Модели входного и выходного возмущения определяют динамические характеристики неизмеренных нарушений порядка на входе и выходе, соответственно, поэтому они могут быть лучше отклонены. По умолчанию эти модели возмущения приняты как интеграторы, если вы не задаете их иначе. Объект mpc также имеет модель шума, которая задает динамику шума на измеренной выходной переменной. По умолчанию это принято как статическое усиление единицы, что эквивалентно принятию, что шум белый. В этом примере нет измеренного выходного нарушения порядка, поэтому нет необходимости задавать выходную модель возмущения, и шум на измеренном выходном сигнале принимается белым.
Задайте модель возмущения для неизмеренного входа в качестве интегратора, управляемого белым шумом с отклонением = 1000
.
mpcobj.Model.Disturbance = tf(sqrt(1000),[1 0]);
Отобразите объект контроллера MPC mpcobj
чтобы просмотреть его свойства.
mpcobj
MPC object (created on 27-Jan-2021 07:33:56): --------------------------------------------- Sampling time: 0.2 (seconds) Prediction Horizon: 10 Control Horizon: 3 Plant Model: -------------- 1 manipulated variable(s) -->| 5 states | | |--> 1 measured output(s) 1 measured disturbance(s) -->| 3 inputs | | |--> 0 unmeasured output(s) 1 unmeasured disturbance(s) -->| 1 outputs | -------------- Indices: (input vector) Manipulated variables: [1 ] Measured disturbances: [2 ] Unmeasured disturbances: [3 ] (output vector) Measured outputs: [1 ] Disturbance and Noise Models: Output disturbance model: default (type "getoutdist(mpcobj)" for details) Input disturbance model: user specified (type "getindist(mpcobj)" for more details) Measurement noise model: default (unity gain after scaling) Weights: ManipulatedVariables: 0 ManipulatedVariablesRate: 0.1000 OutputVariables: 1 ECR: 100000 State Estimation: Default Kalman Filter (type "getEstimator(mpcobj)" for details) Constraints: 0 <= MV1 <= 1, -10 <= MV1/rate <= 10, MO1 is unconstrained
Отобразите входную модель возмущения. Как и ожидалось, указанный интегратор преобразуется в дискретное время.
getindist(mpcobj)
ans = A = x1 x1 1 B = Noise#1 x1 0.8 C = x1 UD1 7.906 D = Noise#1 UD1 0 Sample time: 0.2 seconds Discrete-time state-space model.
Отобразите выходную модель возмущения. Как и ожидалось, он пуст.
getoutdist(mpcobj)
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. ans = Empty state-space model.
Чтобы выяснить, сможет ли контроллер MPC отклонить постоянные выходные нарушения порядка и отследить постоянную уставку с нулевыми смещениями в установившемся состоянии, вычислите коэффициент усиления постоянного тока замкнутого цикла от выходных нарушений порядка до управляемых выходов с помощью cloffset
команда. Это также известно как устойчивое состояние выхода чувствительность закрытого цикла.
DC = cloffset(mpcobj);
fprintf('DC gain from output disturbance to output = %5.8f (=%g) \n',DC,DC);
DC gain from output disturbance to output = 0.00000000 (=3.21965e-15)
Нулевой коэффициент усиления (который обычно является результатом того, что контроллер имеет интеграторы в качестве входных или выходных моделей возмущения) означает, что измеренный выход объекта управления будет отслеживать желаемую выходную контрольную уставку.
sim
КомандаThe sim
команда предоставляет быстрый способ моделирования контроллера MPC в замкнутом цикле с линейным инвариантным по времени объектом, когда ограничения и веса остаются постоянными, и нарушения порядка и опорные сигналы могут быть легко и полностью заданы раньше времени.
Во-первых, задайте время симуляции и ссылку и сигналы нарушения порядка
Tstop = 30; % simulation time Nf = round(Tstop/Ts); % number of simulation steps r = ones(Nf,1); % output reference signal v = [zeros(Nf/3,1);ones(2*Nf/3,1)]; % measured input disturbance signal
Запустите симуляцию замкнутой системы и постройте график результатов. Объект, указанный в mpcobj.Model.Plant
используется как модель объекта управления в замкнутом цикле, так и как внутренняя модель объекта управления, используемая контроллером для предсказания отклика над горизонтом прогноза. Использование sim
для симуляции системы замкнутого цикла для шагов Nf с ссылка и измеренного входного нарушения порядка v.
sim(mpcobj,Nf,r,v) % simulate plant and controller in closed loop
Манипулируемая переменная первоначально попадает на верхнюю границу и приводит выход объекта к ссылке значению в течение нескольких секунд. Затем он оседает на своем максимально допустимом значении, 1. Через 10 секунд измеренный нарушением порядка сигнал повышается с 0 до 1, что заставляет выход объекта превысить ссылку значения примерно на 30%. Манипулируемая переменная попадает на нижнюю границу в попытке отклонить нарушение порядка. Контроллер способен вернуть выход объекта к ссылке значению через несколько секунд, и управляемая переменная оседает на своем минимальном значении. Неизмеренный сигнал нарушения порядка всегда равен нулю, потому что неизмеренное нарушение порядка еще не задано.
Можно использовать объекты опций симуляции, чтобы задать дополнительные опции симуляции, а также сигналы шума и нарушения порядка, которые поступают в объект, но неизвестны контроллеру. В этом примере используйте объект опции симуляции, чтобы задать неизмеренный входной сигнал нарушения порядка, а также аддитивный шум как на манипулируемых переменных, так и на измеренных выходах. Вы также будете позже использовать этот объект опций, чтобы задать объект для использования в симуляции, который отличается от используемого внутри контроллера. Создайте объект опции симуляции с опциями по умолчанию и без сигнала.
SimOptions = mpcsimopt; % create object
Создайте сигнал нарушения порядка и задайте его в объекте опций симуляции
d = [zeros(2*Nf/3,1);-0.5*ones(Nf/3,1)]; % define a step disturbance signal SimOptions.UnmeasuredDisturbance = d; % specify unmeasured input disturbance signal
Задайте сигналы шума в объекте опций симуляции. Во времени симуляции функция симуляции непосредственно добавляет заданный выходной шум к измеренному выходу перед подачей его на контроллер. Он также непосредственно добавляет заданный входной шум к манипулируемой переменной (не к никаким сигналам нарушения порядка) перед подачей его на объект.
SimOptions.OutputNoise=.001*(rand(Nf,1)-.5); % specify output measurement noise SimOptions.InputNoise=.05*(rand(Nf,1)-.5); % specify noise on manipulated variables
Обратите внимание, что вы также можете использовать OutputNoise
поле объекта опции симуляции для определения более общего дополнительного выходного сигнала нарушения порядка (такого как, например, шаг) на выходе измеряемой установки.
Использование sim
с дополнительными SimOptions
аргумент для симуляции системы замкнутого цикла и сохранения результатов в переменных рабочей области y
, |t|,|u| и xp
. Это позволяет вам избирательно отображать сигналы в новом окне рисунка и в любом заданном цвете и порядке.
[y,t,u,xp] = sim(mpcobj,Nf,r,v,SimOptions); % simulate closed loop
Постройте график результатов.
figure % create new figure subplot(2,1,1) % create upper subplot plot(0:Nf-1,y,0:Nf-1,r) % plot plant output and reference title('Output') % add title so upper subplot ylabel('MO1') % add a label to the upper y axis grid % add a grid to upper subplot subplot(2,1,2) % create lower subplot plot(0:Nf-1,u) % plot manipulated variable title('Input'); % add title so lower subplot xlabel('Simulation steps') % add a label to the lower x axis ylabel('MV1') % add a label to the lower y axis grid % add a grid to lower subplot
Несмотря на добавленный шум (который особенно заметен на манипулируемом переменном графике) и несмотря на измеренные и немеренные нарушения порядка, вводимые после 50 и 100 шагов соответственно, контроллер способен достигать и поддерживать хорошее отслеживание. Манипулируемая переменная оседает примерно в 1 после начальной части симуляции (стадии от 20 до 50), примерно в 0 для отклонения измеренного нарушения порядка (стадии от 70 до 100) и примерно в 0,5 для отклонения обоих нарушений порядка (стадии от 120 до 150).
Проверьте робастность контроллера MPC на несоответствие модели. Задайте истинное объект для использования в симуляции следующим truePlantCSS
.
truePlantTF = tf({1,1,1},{[1 .8 1],[1 2],[.6 .6 1]}) % specify and display transfer functions truePlantCSS = ss(truePlantTF); % convert to continuous state space truePlantCSS = setmpcsignals(truePlantCSS,'MV',1,'MD',2,'UD',3); % specify signal types
truePlantTF = From input 1 to output: 1 --------------- s^2 + 0.8 s + 1 From input 2 to output: 1 ----- s + 2 From input 3 to output: 1 ------------------- 0.6 s^2 + 0.6 s + 1 Continuous-time transfer function.
Обновите объект опции симуляции путем определения SimOptions.Model
как структура с двумя полями, Plant
(содержащая истинную модель объекта управления) и Nominal
(содержащее значения рабочих точек для истинного объекта). В данном примере номинальные значения для производных по состоянию и входов не заданы, поэтому они приняты равными нулю, что приводит к y = SimOptions.Model.Nominal.Y + C*(x-SimOptions.Model.Nominal.X)
где x
и y
- состояние и измеренный выход объекта управления, соответственно.
SimOptions.Model = struct('Plant',truePlantCSS); % create the structure and assign the 'Plant' field SimOptions.Model.Nominal.Y = 0.1; % create and assign the 'Nominal.Y' field SimOptions.Model.Nominal.X = -.1*[1 1 1 1 1]; % create and assign the 'Nominal.X' field SimOptions.PlantInitialState = [0.1 0 -0.1 0 .05]; % specify the initial state of the true plant
удалите любой сигнал, ранее добавленный к измеренному выходу и к манипулируемой переменной
SimOptions.OutputNoise = []; % remove output measurement noise SimOptions.InputNoise = []; % remove noise on manipulated variable
Запустите симуляцию замкнутой системы и постройте график результатов. Начиная с SimOptions.Model
не пуст, SimOptions.Model.Plant
преобразуется в дискретное время (с использованием удержания нулевого порядка) и используется в качестве модели объекта управления в симуляции замкнутого цикла, в то время как объект в mpcobj.Model.Plant
используется контроллером только для предсказания отклика над горизонтом предсказания.
sim(mpcobj,Nf,r,v,SimOptions) % simulate the closed loop
-->Converting model to discrete time.
В результате несоответствия модели видна некоторая деградация в отклике, особенно контроллеру нужно немного больше времени, чтобы достичь отслеживания, и манипулируемая переменная теперь оседает на уровне около 0,5, чтобы отклонить измеренное нарушение порядка (см. значения от 5 до 10 секунд) и устанавливается на уровне около 0,9, чтобы отклонить обоих входных нарушений порядка (от 25 до 30 секунд). Несмотря на это, контроллер по-прежнему способен отслеживать выход ссылку.
Каждое ограничение связано с параметром без размерности, называемым значением ECR. Ограничение с большим значением ECR допускается нарушать больше, чем ограничение с меньшим значением ECR. По умолчанию все ограничения, накладываемые на управляемые переменные, имеют значение ECR, равное нулю, что делает их жесткими. Можно задать ненулевое значение ECR для ограничения, чтобы сделать его мягким.
Обратите внимание, что можно обратиться к ManipulatedVariables
также как MV
. Ослабьте ограничения на управляемые переменные от жестких до мягких.
mpcobj.MV.MinECR = 1; % ECR for the lower bound on the manipulated variable mpcobj.MV.MaxECR = 1; % ECR for the upped bound on the manipulated variable
Задайте ограничение выхода. По умолчанию все ограничения, накладываемые на выходные переменные (измеренные выходы), имеют значение ECR, равное единице, что делает их мягкими. Можно уменьшить значение ECR для ограничения выхода, чтобы сделать его более трудным, однако всегда рекомендуется сохранять выходные ограничения мягкими. Это происходит главным образом из-за того, что выходы объекта зависят от состояния объекта, а также от измеренных нарушений порядка, поэтому, если происходит большое нарушение порядка, выходы объекта могут нарушать ограничения независимо от любого управляющего действия, предпринятого контроллером mpc, особенно когда управляемые переменные сами по себе жестко ограничены. Такое неизбежное нарушение жесткого ограничения приводит к недопустимой задаче MPC, для которой никакое MV не может быть вычислено.
mpcobj.OV.Max = 1.1; % define the (soft) output constraint % Note that is possible to refer to the |OutputVariables| field also as |OV|.
Запустите новую симуляцию с обратной связью, не включая объект опции симуляции, и, следовательно, без какого-либо несоответствия модели, неизмеренного нарушения порядка или шума, добавленного к манипулируемой переменной или измеренному выходу.
sim(mpcobj,Nf,r,v) % simulate the closed loop
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.
В попытке отклонить измеренное нарушение порядка, добиться отслеживания и предотвратить увеличение выходов выше своего мягкого ограничения 1.1, контроллер слегка нарушает мягкое ограничение на манипулируемую переменную, которое достигает небольших отрицательных значений с 10 до 11 секунд (вы можете увеличить изображение, чтобы увидеть это нарушение более четко). Ограничение на измеряемом выходе нарушается больше, чем ограничение на манипулируемой переменной.
Штрафуйте больше выход нарушений ограничений и перезапустите симуляцию.
mpcobj.OV.MaxECR = 0.001; % the closer to zero, the harder the constraint sim(mpcobj,Nf,r,v) % run a new closed-loop simulation.
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.
Теперь контроллер нарушает ограничение выхода только очень слабо. Как ожидалось, это улучшение эффективности на выходе происходит за счет нарушения манипулируемого ограничения переменной намного больше (манипулируемая переменная достигает -3 на пару шагов).
На каждом временном шаге контроллер MPC получает управляемую переменную путем умножения состояния объекта в дискретном времени (при наличии) на матрицу усиления (вычисленную путем решения ограниченной квадратичной задачи оптимизации). Поскольку состояние объекта обычно недоступно, по умолчанию контроллер использует линейный фильтр Калмана в качестве наблюдателя, чтобы оценить состояние объекта с увеличенным дискретным временем (то есть объекта, комплексного с моделями нарушения порядка и шума). Поэтому состояниями контроллера являются состояния этого фильтра Калмана, которые в свою очередь являются оценками состояний дополненного объекта дискретного времени.
Запустите симуляцию замкнутого цикла с несовпадением модели и неизмеренным нарушением порядка, используя оценщик по умолчанию, и верните структуру состояний контроллера xc
в рабочей области, чтобы можно было позже сравнить последовательности состояний.
[y,t,u,xp,xc] = sim(mpcobj,Nf,r,v,SimOptions);
-->Converting model to discrete time.
отобразить компонент структуры состояний контроллера
xc
xc = struct with fields: Plant: [150x5 double] Disturbance: [150x1 double] Noise: [150x0 double] LastMove: [150x1 double]
Постройте график выхода ответа объекта управления, а также состояний объекта, оцененных наблюдателем по умолчанию
figure; % create figure subplot(2,1,1) % create upper subplot axis plot(t,y) % plot y versus time title('Plant output'); % add title to upper plot ylabel('y') % add a label to the upper y axis grid % add grid to upper plot subplot(2,1,2) % create lower subplot axis plot(t,xc.Plant) % plot xc.Plant versus time title('Estimated plant states'); % add title to lower plot xlabel('Time (sec)') % add a label to the lower x axis ylabel('xc') % add a label to the lower y axis grid % add grid to lower plot
Как ожидалось, происходят внезапные изменения на 10 и 20 секундах из-за того, что измеренные и не измеренные сигналы нарушения порядка вводятся, соответственно.
Можно изменить усиления фильтра Калмана, используемого в качестве наблюдателя. Для этого сначала найдите стандартные матрицы усиления Калмана и пространства состояний.
[L,M,A1,Cm1] = getEstimator(mpcobj); % retrieve observer matrices
Вычислите и отобразите полюса наблюдателя по умолчанию. Обратите внимание, что, как и ожидалось, все они находятся внутри модуля круга, хотя некоторые из них кажутся относительно близкими к границе. Обратите внимание, что существует шесть состояний, пять принадлежащих модели объекта управления, шестое - модели входа возмущения.
e = eig(A1-A1*M*Cm1) % eigenvalues of observer state matrix
e = 0.5708 + 0.4144i 0.5708 - 0.4144i 0.4967 + 0.0000i 0.9334 + 0.1831i 0.9334 - 0.1831i 0.8189 + 0.0000i
Спроектируйте новую оценку состояния путем размещения полюса.
poles = [.8 .75 .7 .85 .6 .81]; % specify desired positions for the new poles L = place(A1',Cm1',poles)'; % calculate Kalman gain for time update M = A1\L; % calculate Kalman gain for measurement update
Установите коэффициент усиления новой матрицы в объекте контроллера mpc
setEstimator(mpcobj,L,M); % set the new estimation gains
повторный запуск симуляции замкнутого цикла
[y,t,u,xp,xc] = sim(mpcobj,Nf,r,v,SimOptions);
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. -->Converting model to discrete time.
Постройте график выхода ответа объекта управления, а также состояний объекта, оцененных новым наблюдателем
figure; % create figure subplot(2,1,1) % create upper subplot axis plot(t,y) % plot y versus time title('Plant output'); % add title to upper plot ylabel('y') % add a label to the upper y axis grid % add grid to upper plot subplot(2,1,2) % create lower subplot axis plot(t,xc.Plant) % plot xc.Plant versus time title('Estimated plant states'); % add title to lower plot xlabel('Time (sec)') % add a label to the lower x axis ylabel('xc') % add a label to the lower y axis grid % add grid to lower plot
Как ожидалось, состояния контроллера отличаются от таковых, нанесенных ранее, и общая реакция закрытого цикла несколько медленнее.
Проверяйте поведение объекта и контроллера в разомкнутом контуре, используя sim
команда. Установите OpenLoop
флаг в on
, и обеспечивают последовательность манипулируемых переменных, чтобы возбуждать систему.
SimOptions.OpenLoop = 'on'; % set open loop option SimOptions.MVSignal = sin((0:Nf-1)'/10); % define the manipulated variable signal
Симулируйте систему разомкнутого контура, содержащую истинное объект (ранее указанный в SimOptions.Model
), за которым следует контроллер. Поскольку опорный сигнал будет проигнорирован, можно избежать его указания.
sim(mpcobj,Nf,[],v,SimOptions) % simulate the open loop system
-->Converting model to discrete time.
mpcmove
В более общем случае закрытого цикла, в котором контроллер применяется к нелинейному или изменяющемуся во времени объекту, ограничения или веса могут измениться во время исполнения, или нарушению порядка и опорные сигналы трудно задать полностью раньше времени, можно использовать mpcmove
функция на каждом шаге в цикле for для симуляции контроллера MPC в закрытом цикле. Если ваш объект находится в непрерывном режиме, вам нужно будет преобразовать его в дискретное время (с использованием любого метода), чтобы симулировать его с циклом for.
Сначала получите матрицы пространства состояний в дискретном времени объекта управления и задайте время симуляции и начальные состояния для объекта и контроллера.
[A,B,C,D] = ssdata(plantDSS); % discrete-time plant plant ss matrices Tstop = 30; % Simulation time x = [0 0 0 0 0]'; % Initial state of the plant xmpc = mpcstate(mpcobj); % Initial state of the MPC controller r = 1; % Output reference signal
Отображение начального состояния контроллера. Обратите внимание, что это mpcstate
объект (не простая структура) и содержит состояния контроллера только в текущее время (не вся история до текущего времени, как структура, возвращенная sim). Он также содержит ковариационную матрицу оценщика. На каждом шаге симуляции необходимо обновлять xmpc
с новыми состояниями контроллера.
xmpc % controller states
MPCSTATE object with fields Plant: [0 0 0 0 0] Disturbance: 0 Noise: [1x0 double] LastMove: 0 Covariance: []
Задайте массивы рабочей области YY
и UU
чтобы сохранить траектории с обратной связью, чтобы они могли быть построены после симуляции.
YY=[]; UU=[];
Запустите цикл симуляции
for k=0:round(Tstop/Ts)-1 % Define measured disturbance signal v(k). You might specify a more % complex dependence on time or previous states here. v = 0; if k*Ts>=10 % raising to 1 after 10 seconds v = 1; end % Define unmeasured disturbance signal d(k). You might specify a more % complex dependence on time or previous states here. d = 0; if k*Ts>=20 % falling to -0.5 after 20 seconds d = -0.5; end % Plant equations: current output % If you have a more complex plant output behavior (including, for example, % model mismatch or nonlinearities) you might want to simulate it here. % Note that there cannot be any direct feedthrough between u and y. y = C*x + D(:,2)*v + D(:,3)*d; % calculate current output (D(:,1)=0) YY = [YY,y]; % store current output % Compute the MPC action (u) and update the controller states (xmpc) using mpcmove % Note that xmpc is updated by mpcmove even though it is an input argument! u = mpcmove(mpcobj,xmpc,y,r,v); % xmpc,y,r,v are values at current step k % Plant equations: state update % You might want to simulate a more complex plant state behavior here. x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d; % calculate next state and update current state UU = [UU,u]; % store current input end
Постройте график результатов.
figure % create figure subplot(2,1,1) % create upper subplot axis plot(0:Ts:Tstop-Ts,YY) % plot YY versus time ylabel('y') % add a label to the upper y axis grid % add grid to upper plot title('Output') % add title to upper plot subplot(2,1,2) % create lower subplot axis plot(0:Ts:Tstop-Ts,UU) % plot UU versus time ylabel('y') % add a label to the lower y axis xlabel('Time (sec)') % add a label to the lower x axis grid % add grid to lower plot title('Input') % add title to lower plot
Если в любой момент во время симуляции вы хотите проверить оптимальные предсказанные траектории с этой точки, они могут быть возвращены mpcmove
также. Предположим, что вы начинаете с текущего состояния (x
и xmpc
), в то время как ссылка изменяется на 0,5 и что нарушение порядка исчезло (и что оба сигнала остаются постоянными во время горизонта предсказания).
r = 0.5; % reference v = 0; % disturbance [~,info] = mpcmove(mpcobj,xmpc,y,r,v); % solve over prediction horizon
Отобразите информационную переменную.
info
info = struct with fields: Uopt: [11x1 double] Yopt: [11x1 double] Xopt: [11x6 double] Topt: [11x1 double] Slack: 0 Iterations: 1 QPCode: 'feasible' Cost: 0.1399
info
- структура, содержащая предсказанные оптимальные последовательности манипулируемых переменных, состояний объекта и выходов на горизонте предсказания. Эта последовательность вычисляется вместе с оптимальным перемещением путем решения квадратичной задачи оптимизации, чтобы минимизировать функцию затрат. Объект состояний и выходов в info
результат применения оптимальной манипулированной переменной последовательности непосредственно к mpcobj.Model.Plant
, в разомкнутом контуре. Поэтому этот процесс оптимизации без разомкнутого контура не эквивалентен симуляции замкнутого цикла, состоящего из объекта, оценщика и контроллера, используя либо sim
команда или mpcmove
итеративно в цикле for.
Извлеките предсказанные оптимальные траектории.
topt = info.Topt; % time yopt = info.Yopt; % predicted optimal plant model outputs uopt = info.Uopt; % predicted optimal mv sequence
Постройте график траекторий с помощью ступенчатых графиков. Ступенчатые графики используются, потому что нормальный график просто соединяет каждую вычисленную точку со следующей с помощью прямой прямой линии, в то время как оптимальные сигналы дискретного времени мгновенно скачут на каждом шаге и остаются постоянными до следующего шага. Это различие особенно заметно, поскольку для выходного сигнала объекта нужно построить только 10 интервалов (и только 3 для управляемой переменной).
figure % create new figure subplot(2,1,1) % create upper subplot stairs(topt,yopt) % plot yopt in a stairstep graph title('Optimal sequence of predicted outputs') % add title to upper subplot grid % add grid to upper subplot subplot(2,1,2) % create lower subplot stairs(topt,uopt) % plot uopt in a stairstep graph title('Optimal sequence of manipulated variables') % add title to upper subplot grid % add grid to upper subplot
Когда ограничения не активны, контроллер MPC ведет себя как линейный контроллер. Обратите внимание, что для конечной задачи Линейного Квадратичного Регулятора без ограничений по времени с конечным невосстановляющимся горизонтом, функция ценности зависит от времени, что заставляет оптимальный коэффициент усиления обратной связи изменяться во времени. Напротив, в MPC горизонт имеет постоянную длину, потому что он всегда отступает, приводя к инвариантной по времени функции ценности, и, следовательно, к инвариантному по времени оптимальному усилению обратной связи.
Вы можете получить форму пространства состояний контроллера MPC.
LTI = ss(mpcobj,'rv'); % get state space representation
Получите матрицы пространства состояний, чтобы симулировать линеаризированный контроллер.
[AL,BL,CL,DL] = ssdata(LTI); % get state space matrices
Инициализируйте переменные для симуляции замкнутого цикла как исходного контроллера MPC без ограничений, так и линеаризированного контроллера
mpcobj.MV = []; % remove input constraints mpcobj.OV = []; % remove output constraints Tstop = 5; % set simulation time y = 0; % set nitial measured output r = 1; % set output reference set-point (constant) u = 0; % set previous (initial) input command x = [0 0 0 0 0]'; % set initial state of plant xmpc = mpcstate(mpcobj); % set initial state of unconstrained MPC controller xL = zeros(size(BL,1),1); % set initial state of linearized MPC controller YY = []; % define workspace array to store plant outputs
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.
Симулируйте оба контроллера в замкнутом цикле с одной и той же моделью объекта управления
for k = 0:round(Tstop/Ts)-1 YY = [YY,y]; % store current output for plotting purposes % Define measured disturbance signal v(k). v = 0; if k*Ts>=10 v = 1; % raising to 1 after 10 seconds end % Define unmeasured disturbance signal d(k). d = 0; if k*Ts>=20 d = -0.5; % falling to -0.5 after 20 seconds end % Compute the control actions of both (unconstrained) MPC and linearized MPC uMPC = mpcmove(mpcobj,xmpc,y,r,v); % unconstrained MPC (this also updates xmpc) u = CL*xL+DL*[y;r;v]; % unconstrained linearized MPC % Compare the two control actions dispStr(k+1) = {sprintf('t=%5.2f, u=%7.4f (provided by LTI), u=%7.4f (provided by MPCOBJ)',k*Ts,u,uMPC)}; %#ok<*SAGROW> % Update state of unconstrained linearized MPC controller xL = AL*xL + BL*[y;r;v]; % Update plant state x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d; % Calculate plant output y = C*x + D(:,1)*u + D(:,2)*v + D(:,3)*d; % D(:,1)=0 end
Отображение символьных массивов, содержащих действия управления
for k=0:round(Tstop/Ts)-1 disp(dispStr{k+1}); % display each string as k increases end
t= 0.00, u= 5.2478 (provided by LTI), u= 5.2478 (provided by MPCOBJ) t= 0.20, u= 3.0134 (provided by LTI), u= 3.0134 (provided by MPCOBJ) t= 0.40, u= 0.2281 (provided by LTI), u= 0.2281 (provided by MPCOBJ) t= 0.60, u=-0.9952 (provided by LTI), u=-0.9952 (provided by MPCOBJ) t= 0.80, u=-0.8749 (provided by LTI), u=-0.8749 (provided by MPCOBJ) t= 1.00, u=-0.2022 (provided by LTI), u=-0.2022 (provided by MPCOBJ) t= 1.20, u= 0.4459 (provided by LTI), u= 0.4459 (provided by MPCOBJ) t= 1.40, u= 0.8489 (provided by LTI), u= 0.8489 (provided by MPCOBJ) t= 1.60, u= 1.0192 (provided by LTI), u= 1.0192 (provided by MPCOBJ) t= 1.80, u= 1.0511 (provided by LTI), u= 1.0511 (provided by MPCOBJ) t= 2.00, u= 1.0304 (provided by LTI), u= 1.0304 (provided by MPCOBJ) t= 2.20, u= 1.0053 (provided by LTI), u= 1.0053 (provided by MPCOBJ) t= 2.40, u= 0.9920 (provided by LTI), u= 0.9920 (provided by MPCOBJ) t= 2.60, u= 0.9896 (provided by LTI), u= 0.9896 (provided by MPCOBJ) t= 2.80, u= 0.9925 (provided by LTI), u= 0.9925 (provided by MPCOBJ) t= 3.00, u= 0.9964 (provided by LTI), u= 0.9964 (provided by MPCOBJ) t= 3.20, u= 0.9990 (provided by LTI), u= 0.9990 (provided by MPCOBJ) t= 3.40, u= 1.0002 (provided by LTI), u= 1.0002 (provided by MPCOBJ) t= 3.60, u= 1.0004 (provided by LTI), u= 1.0004 (provided by MPCOBJ) t= 3.80, u= 1.0003 (provided by LTI), u= 1.0003 (provided by MPCOBJ) t= 4.00, u= 1.0001 (provided by LTI), u= 1.0001 (provided by MPCOBJ) t= 4.20, u= 1.0000 (provided by LTI), u= 1.0000 (provided by MPCOBJ) t= 4.40, u= 0.9999 (provided by LTI), u= 0.9999 (provided by MPCOBJ) t= 4.60, u= 1.0000 (provided by LTI), u= 1.0000 (provided by MPCOBJ) t= 4.80, u= 1.0000 (provided by LTI), u= 1.0000 (provided by MPCOBJ)
Постройте график результатов.
figure % create figure plot(0:Ts:Tstop-Ts,YY) % plot plant outputs grid % add grid title('Unconstrained MPC control: Plant output') % add title xlabel('Time (sec)') % add label to x axis ylabel('y') % add label to y axis
Выполнение симуляции с обратной связью, в которой все ограничения контроллера выключены, легче использовать sim
, так как вам просто нужно задать ' off ' в Constraint
поле связанной mpcsimopt
объект опции симуляции.
SimOptions = mpcsimopt; % create simulation options object SimOptions.Constraints = 'off'; % remove all MPC constraints SimOptions.UnmeasuredDisturbance = d; % unmeasured input disturbance sim(mpcobj,Nf,r,v,SimOptions); % run closed loop simulation
Simulink является графическим блоком схемой, окружением для многодоменных системных симуляций. Можно соединить блоки, представляющие динамические системы (в этом случае объект и контроллер MPC), и моделировать замкнутый цикл. Помимо того, что система и ее взаимосвязи представлены визуально, одним из ключевых различий является то, что Simulink может использовать более широкую область значений алгоритмов интегрирования, чтобы решить базовые дифференциальные уравнения системы. Simulink также может автоматически сгенерировать код C (или PLC) и развернуть его для приложений реального времени.
% To run this part of the example, Simulink(R) is required. Check that % Simulink is installed, otherwise display a message and return if ~mpcchecktoolboxinstalled('simulink') % if Simulink not installed disp('Simulink(R) is required to run this part of the example.') return % end execution here end
Воссоздайте исходный объект mpc с исходным ограничением и исходным оценщиком по умолчанию, чтобы вы могли легко сравнить результаты.
mpcobj = mpc(plantDSS,Ts,10,3); mpcobj.MV = struct('Min',0,'Max',1,'RateMin',-10,'RateMax',10); mpcobj.Model.Disturbance = tf(sqrt(1000),[1 0]);
-->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.
Извлеките матрицы пространства состояний (непрерывного времени) объекта, которые будут управляться, поскольку они необходимы модели Simulink, которая должна быть открыта.
[A,B,C,D] = ssdata(plantCSS); % get state-space realization
Откройте ранее существовавшую модель Simulink для симуляции замкнутой системы. Модель объекта управления реализована с непрерывным блоком состояния пространство, и алгоритм интегрирования ode45 используется для вычисления его непрерывной временной характеристики.
%The block inputs are u(t), v(t) and d(t) representing the manipulated % variable, measured input disturbance, and unmeasured input disturbance, % respectively, while y(t) is the measured output. The block parameters % are the matrices forming the state space realization of the continuous-time % plant, and the initial conditions for the 5 states. % The MPC controller is implemented with an MPC controller block, which % has the workspace mpc object |mpcobj| as parameter, the manipulated % variable as output, and then the measured plant output, reference signal, % and measured plant input disturbance as inputs, respectively. % The four Scopes blocks plot the five loop signals, which are also saved % (except the reference signal) by four To-Workspace blocks. open_system('mpc_miso')
Симулируйте систему с помощью sim simulink
команда. Обратите внимание, что эта команда (которая симулирует модель Simulink и эквивалентна нажатию кнопки «Запустить» в модели) отличается от sim
команда, предоставляемая тулбоксом mpc (который вместо этого моделирует контроллер MPC в цикле с объектом LTI).
sim('mpc_miso')
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.
Графики в Scopes
блоки эквивалентны таковым на рисунках 1,2 и 3, с незначительными различиями из-за того, что в первой симуляции (Фигуры 1 и 2) неизмеренный нарушением порядка сигнал был нулем, и то есть второй симуляции (рисунок 3) шум был добавлен к входу и выходу объекта. Также обратите внимание, что, в то время как MPC sim
команда внутренне дискретизирует любую непрерывную модель объекта управления, используя ZOH, Simulink обычно использует алгоритм интегрирования (в этом примере ode45), чтобы симулировать замкнутый цикл, когда присутствует блок непрерывного времени.
Предположим, что на выходные измерения влияет синусоидальное нарушение порядка (шум одинарного датчика тона) частоты 0,1 Гц на измеренном выходе.
omega = 2*pi/10; % disturbance radial frequency
Откройте mpc_misonoise
Модель Simulink. Это похоже на модель 'mpc _ miso', за исключением синусоидального нарушения порядка, вводимого на измеренном выходе. Что также отличается, так это то, что время симуляции теперь установлено на 150 секунд, и что неизмеренные и измеренные входные нарушения порядка начинают действовать через 60 и 120 секунд, соответственно. Обратите внимание, что, по-другому по сравнению с предыдущими симуляциями, неизмеренное нарушение порядка запускается первым. Это позволяет более четко построить график и проанализировать ответ на неизмеренные нарушения порядка, происходящие от 60 до 120 секунд.
open_system('mpc_misonoise') % open new Simulink model
Поскольку этот шум ожидается, установка его в модель измерения шума поможет оценщику состояния игнорировать его, тем самым улучшая качество оценок состояния и позволяя всему контроллеру лучше отклонять нарушения порядка при отслеживании выхода ссылки.
mpcobj.Model.Noise = 0.5*tf(omega^2,[1 0 omega^2]); % measurement noise model
Измените проект MPC, задав модель возмущения на неизмеренном входе в виде белого Гауссова шума с нулем среднего и отклонением 0.1
. Это позволяет лучше отклонить типовые непостоянные нарушения порядка (за счет худшего отклонения входа постояннейшие нарушения порядка).
mpcobj.Model.Disturbance = tf(0.1); % static gain
Обратите внимание, что когда вы задаете статический коэффициент усиления как модель для входа нарушения порядка, выходом модель возмущения, состоящая из дискретизированного интегратора, автоматически добавляется к контроллеру. Это помогает отклонить постоянные (и медленно изменяющиеся) выходные нарушения порядка.
getoutdist(mpcobj)
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->A feedthrough channel in NoiseModel was inserted to prevent problems with estimator design. ans = A = x1 x1 1 B = u1 x1 0.2 C = x1 MO1 1 D = u1 MO1 0 Sample time: 0.2 seconds Discrete-time state-space model.
Уменьшите вес на отслеживании выходной переменной (тем самым делая больший акцент на минимизации скорости изменения манипулируемых переменных).
mpcobj.weights = struct('MV',0,'MVRate',0.1,'OV',0.005); % new weights
Сами по себе новые веса слишком сильно штрафуют манипулируемое изменение переменной, что приводит к очень низкой пропускной способности (медленному) контроллеру. Это приведет к отставанию выходных переменных от ссылки на многие шаги. Увеличение горизонта прогнозирования до 40 позволяет контроллеру полностью принимать во внимание стоимость выходной ошибки на 40 шагах вместо только 10, тем самым делая некоторый акцент на отслеживании.
mpcobj.predictionhorizon = 40; % new prediction horizon
Запустите симуляцию в течение 145 секунд
sim('mpc_misonoise',145) % the second argument is the simulation duration
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->A feedthrough channel in NoiseModel was inserted to prevent problems with estimator design.
Фильтр Калмана успешно учится игнорировать шум измерения через 50 секунд. Неизмеренные и измеренные нарушения порядка отклоняются в интервале времени от 10 до 20 секунд. Наконец, как и ожидалось, манипулируемая переменная остается в интервале между 0 и 1.
bdclose('all') % close all open Simulink models without saving any change close all % close all open figures
mpc
| MPC Controller | MPC Designer