Прогнозирующее управление модели мультивхода объект Одно Выхода

В этом примере показано, как спроектировать прогнозирующий контроллер модели для объекта с одним измеренным выходом, одной переменной, которой управляют, одним измеренным воздействием и одним неизмеренным воздействием.

Задайте модель объекта управления

Задайте модель объекта управления. Поскольку этот пример использует непрерывные передаточные функции времени от каждого входа до выхода. Отобразите модель объекта управления в командной строке.

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 автоматически преобразует объект непрерывного времени (в любом формате) к модели в пространстве состояний дискретного времени, использование Нулевого Порядка Содержит.

Преобразование объекта к дискретному времени полезно, когда вы нуждаетесь в системных матрицах дискретного времени для анализа или симуляции, (как в этом примере) или хотите, чтобы контроллер использовал объект дискретного времени, преобразованный с методом кроме 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

Спроектируйте контроллер MPC

Создайте объект контроллера, задав время выборки, а также предсказание и управляйте горизонтами (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 отклонить постоянные выходные воздействия и отследить постоянное заданное значение с нулевыми смещениями в установившемся, вычислите усиление DC замкнутого цикла от выходных воздействий до управляемых выходных параметров с помощью 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 Команда

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 продвигается со ссылкой r и измеренным входным воздействием против.

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, для которой не может быть вычислен никакой мВ.

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 горизонт имеет постоянную длину, потому что это всегда отступает, приводя к независимой от времени функции ценности, и следовательно к независимому от времени оптимальному усилению обратной связи.

Можно получить форму пространства состояний контроллера 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®

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')

Симулируйте систему с помощью simulink sim команда. Обратите внимание на то, что эта команда (то, которое симулирует модель Simulink и эквивалентно нажатию на кнопку "Run" в модели), отличается от 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), шум был добавлен к вводу и выводу объекта. Также обратите внимание что это, в то время как sim MPC команда внутренне дискретизирует любую непрерывную модель объекта управления с помощью 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 specifing возмущение на неизмеренном входе как белый Гауссов шум с нулевым средним значением и отклонением 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

Собой новые веса оштрафовали бы переменное изменение, которым управляют, слишком много, приведя к очень низкой пропускной способности (медленный) контроллер. Это привело бы к выходным переменным, отстающим от ссылки для многих шагов. Увеличение predicion горизонта к 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

Смотрите также

| |

Похожие темы