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

В этом примере показано, как спроектировать, анализируйте и симулируйте прогнозирующий контроллер модели с трудными и мягкими ограничениями для объекта с одним измеренным выходом (MO) и тремя входными параметрами. Входные параметры состоят из одной переменной, которой управляют, (MV), одного измеренного воздействия (MD) и одного неизмеренного воздействия (UD). После разработки контроллера и анализа ее установившихся усилений с обратной связью, вы выполняете симуляции с sim команда, в for цикл с помощью mpcmove, и с Simulink®. Симуляции с несоответствиями модели, без ограничений, и в разомкнутом контуре показывают. Воздействия ввода и вывода и шумовые модели также обработаны, а также как изменить усиления Кальмана встроенного средства оценки состояния.

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

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

plantTF = tf({1,1,1},{[1 .5 1],[1 1],[.7 .5 1]}) % define and display tf object
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). Задержки, если есть включены в модель в пространстве состояний.

Можно преобразовать объект в дискретное время сами, когда вам нужны системные матрицы дискретного времени для анализа или симуляции, (как в этом примере) или, когда это необходимо, использовать метод преобразования дискретного времени кроме 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 ZOH
plantDSS =
 
  A = 
            x1       x2       x3       x4       x5
   x1   0.8862  -0.1891        0        0        0
   x2   0.1891   0.9807        0        0        0
   x3        0        0   0.8187        0        0
   x4        0        0        0    0.841  -0.2637
   x5        0        0        0   0.1846   0.9729
 
  B = 
            u1       u2       u3
   x1   0.1891        0        0
   x2  0.01929        0        0
   x3        0   0.1813        0
   x4        0        0   0.1846
   x5        0        0  0.01899
 
  C = 
          x1     x2     x3     x4     x5
   y1      0      1      1      0  1.429
 
  D = 
       u1  u2  u3
   y1   0   0   0
 
Sample time: 0.2 seconds
Discrete-time state-space model.

По умолчанию программное обеспечение принимает, что все входные сигналы объекта являются переменными, которыми управляют. Чтобы задать типы сигнала, такой, как измерено и неизмеренные воздействия, используют setmpcsignals функция. В этом примере первый входной сигнал является переменной, которой управляют, вторым является измеренное воздействие, и третьим является неизмеренное воздействие. Эта информация хранится в модели объекта управления 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 использует интегратор в качестве возмущения для:

  • Каждый неизмеренный вход воздействия и

  • Каждое неизмеренное воздействие, действующее на каждого, измерило выходные параметры

если выполнение так не вызывает нарушение наблюдаемости состояния.

Объект MPC также имеет шумовую модель, которая задает характеристики аддитивного шума, который ожидается на измеренных выходных переменных. По умолчанию, это, принят, чтобы быть модулем статическое усиление, которое эквивалентно предположению, что диспетчер ожидает, что измеренные выходные переменные будут затронуты, во время выполнения, белым шумом (с ковариационной матрицей, которая зависит от входных матриц целой модели предсказания). Для получения дополнительной информации см. Модели Предсказания MPC.

Отобразите входное возмущение. Как ожидалось это - интегратор дискретного времени.

getindist(mpcobj)
-->The "Model.Disturbance" property of "mpc" object is empty:
   Assuming unmeasured input disturbance #3 is integrated white noise.
   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 =
 
  A = 
       x1
   x1   1
 
  B = 
       UD1-wn
   x1     0.2
 
  C = 
        x1
   UD1   1
 
  D = 
        UD1-wn
   UD1       0
 
Sample time: 0.2 seconds
Discrete-time state-space model.

Отобразите выходное возмущение.

getoutdist(mpcobj)
ans =

  Empty state-space model.

Задайте возмущение для неизмеренного входа как интегратор, управляемый белым шумом с отклонением 1000.

mpcobj.Model.Disturbance = tf(sqrt(1000),[1 0]);

Отобразите входное возмущение снова, чтобы проверить, что оно изменяется.

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.

Отобразите контроллер MPC объект mpcobj рассмотреть его свойства.

mpcobj
 
MPC object (created on 22-Jul-2021 21:31:47):
---------------------------------------------
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

Исследуйте установившееся смещение

Исследовать, может ли контроллер MPC отклонить постоянные выходные воздействия и отследить постоянное заданное значение с нулевыми смещениями в устойчивом состоянии, вычислить усиление DC с обратной связью от выходных воздействий до управляемых выходных параметров с помощью cloffset команда. Это усиление также известно как устойчивое состояние выходная чувствительность замкнутого цикла.

DC = cloffset(mpcobj);
fprintf('DC gain from output disturbance to output = %5.8f (=%g) \n',DC,DC);
   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.
DC gain from output disturbance to output = 0.00000000 (=5.77316e-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 и измеренное входное воздействие 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 поле опции симуляции возражает, чтобы задать более общий аддитивный выходной сигнал воздействия (такой как шаг) на измеренном объекте выход.

Симулируйте систему с обратной связью и сохраните результаты в переменные y рабочей областиTU, и xp. Сохранение этого переменные позволяет вам выборочно строить сигналы в новом окне рисунка и в любом данном цвете и порядке.

[y,t,u,xp] = sim(mpcobj,Nf,r,v,SimOptions);

Постройте график результатов.

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. В данном примере знаменатель каждой из трех передаточных функций объекта имеет один или два коэффициента, которые отличаются от соответствующих единиц на объекте, заданном ранее в, Задают раздел Модели объекта управления, который диспетчер MPC использует для предсказания.

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 секунд). Несмотря на это ухудшение, контроллер все еще может отследить выходную ссылку.

Симулируйте ответ разомкнутого контура

Можно также протестировать поведение объекта и контроллера в разомкнутом контуре, с помощью sim команда. Установите OpenLoop отметьте к on, и обеспечьте последовательность значений переменных, которыми управляют, чтобы взволновать систему (последовательность проигнорирована если OpenLoop установлен в off).

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.

Смягчите ограничения

Для контроллера MPC каждое ограничение имеет связанное безразмерное значение ECR. Ограничению с большим значением ECR позволяют быть нарушенным больше, чем ограничение с меньшим значением ECR. По умолчанию все ограничения на переменные, которыми управляют, имеют значение ECR нуля, делая их трудно. Можно задать ненулевое значение ECR для ограничения, чтобы сделать его мягким.

Ослабьте ограничения на переменные, которыми управляют, от трудно до мягкого.

mpcobj.ManipulatedVariables.MinECR = 1;   % ECR for the MV lower bound
mpcobj.ManipulatedVariables.MaxECR = 1;   % ECR for the MV upped bound

Задайте выходное ограничение. По умолчанию все ограничения на выходные переменные (измерил выходные параметры) имеют значение ECR одного, делая их мягкими. Можно уменьшать значение ECR для выходного ограничения, чтобы сделать его тяжелее, однако лучшая практика должна сохранить выходные ограничения мягкими. Мягкие выходные ограничения предпочтены, потому что объект выходные параметры зависит и от состояний объекта и от измеренных воздействий; поэтому, если достаточно большое воздействие происходит, объект, выходные ограничения могут быть нарушены независимо от состояния объекта (и поэтому независимо от любых мер управления, принятых контроллером MPC). Они нарушение особенно вероятно, когда переменные, которыми управляют, имеют трудные ограничения. Такое неизбежное нарушение трудного ограничения приводит к неосуществимой проблеме MPC, для которой, не может быть вычислена никакая переменная, которой управляют.

mpcobj.OutputVariables.Max = 1.1;    % define the (soft) output constraint

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

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.

SimOptions.OpenLoop = 'off';                    % set closed loop option
[y,t,u,xp,xc] = sim(mpcobj,Nf,r,v,SimOptions);  % run simulation
-->Simulation is in closed-loop (the "OpenLoop" property of "mpcsimopt" object is "off") and the "MVSignal" property of "mpcsimopt" object is ignored.
-->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 (seconds)')                    % 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.
-->Simulation is in closed-loop (the "OpenLoop" property of "mpcsimopt" object is "off") and the "MVSignal" property of "mpcsimopt" object is ignored.
-->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 (seconds)')                    % add a label to the lower x axis
ylabel('xc')                                % add a label to the lower y axis
grid                                        % add grid to lower plot

Как ожидалось состояния контроллера отличаются от тех ранее построенных, и полный ответ с обратной связью несколько медленнее.

Симулируйте контроллер в замкнутом цикле Используя mpcmove

Для более общего применения можно симулировать контроллер MPC в цикле for с помощью функции mpcmove. Используя эту функцию, можно запустить симуляции со следующими функциями.

  • Нелинейные или изменяющиеся во времени объекты

  • Ограничения или веса, которые варьируются во время выполнения

  • Воздействие или опорные сигналы, которые не известны прежде, чем запустить симуляцию

Если ваш объект непрерывен, необходимо преобразовать его в дискретное время прежде, чем симулировать его в цикле for с помощью mpcmove.

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

[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);            % get handle to controller state
r = 1;                              % output reference signal

Отобразите начальное состояние контроллера. Состояние, которое является mpcstate возразите, содержит состояния контроллера только в текущее время. В частности: * xmpc.Plant текущее значение предполагаемых состояний объекта. * xmpc.Disturbance текущее значение состояний возмущений. * xmpc.Noise текущее значение шумовых состояний моделей. * xmpc.LastMove последнее значение переменной, которой управляют. * xmpc.Covariance текущее значение ковариационной матрицы средства оценки.

xmpc                                % display controller states
MPCSTATE object with fields
          Plant: [0 0 0 0 0]
    Disturbance: 0
          Noise: [1x0 double]
       LastMove: 0
     Covariance: []

Обратите внимание на то, что xmpc объект указателя, который всегда указывает на текущее состояние контроллера. Начиная с mpcmove обновляет внутреннее состояние объекта, когда новое перемещение управления вычисляется, вы не должны обновлять xmpc, который всегда указывает на ток (следовательно обновленный) состояние.

isa(xmpc,'handle')
ans =

  logical

   1

Задайте массивы рабочей области YY и UU сохранить выход и входные сигналы, соответственно, так, чтобы можно было построить их после симуляции.

YY=[];
UU=[];

Запустите цикл симуляции.

for k=0:round(Tstop/Ts)-1

    % Define measured disturbance signal v(k). You can specify a more
    % complex dependence on time or previous states here, if needed.
    v = 0;
    if k*Ts>=10         % raising to 1 after 10 seconds
        v = 1;
    end

    % Define unmeasured disturbance signal d(k). You can specify a more
    % complex dependence on time or previous states here, if needed.
    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 can 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

    % Note, if the plant had a non-zero operating point the output equation would be:
    % y = mpcobj.Model.Nominal.Y + C*(x-mpcobj.Model.Nominal.X) + D(:,2)*v + D(:,3)*d;

    % Compute the MPC action (u) and update the internal controller states.
    % Note that you do not need the update xmpc because it always points
    % to the current controller states.
    u = mpcmove(mpcobj,xmpc,y,r,v);     % xmpc,y,r,v are values at current step k
    UU = [UU,u];                        % store current input

    % Plant equations: state update
    % You can simulate a more complex plant state behavior here, if needed.
    x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d;   % calculate next state and update current state

    % Note, if the plant had a non-zero operating point the state update equation would be:
    % x = mpcobj.Model.Nominal.X + mpcobj.Model.Nominal.DX + A*(x-mpcobj.Model.Nominal.X) + B(:,1)*(u-mpcobj.Model.Nominal.U(1)) + B(:,2)*v + B(:,3)*d;   % calculate next state and update current state

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 (seconds)')                    % 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 и воздействием является 0. Симулируйте контроллер и возвратите информационную структуру.

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

Поскольку оптимальные значения последовательности являются постоянными через каждый шаг управления, строят траектории с помощью ступенчатого графика.

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 (seconds)')                                % 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.

Чтобы сравнить результаты, воссоздайте объект MPC с ограничениями, которые вы используете в разделе Design MPC Controller и средстве оценки по умолчанию.

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.

Получите матрицы пространства состояний объекта непрерывного времени.

[A,B,C,D] = ssdata(plantCSS);       % get state-space realization

Откройте mpc_miso Модель Simulink для симуляции с обратной связью. Модель объекта управления реализована с непрерывным блоком пространства состояний.

open_system('mpc_miso')

Входные сигналы объекта u (t), v (t), и d (t) представляют переменную, которой управляют, измеренное входное воздействие и неизмеренное входное воздействие, соответственно, в то время как y (t) является измеренный выход. Параметры блоков являются матрицами, формирующими реализацию пространства состояний объекта непрерывного времени и начальные условия для пяти состояний. Контроллер MPC реализован с блоком MPC Controller, который имеет объект MPC рабочей области mpcobj в качестве параметра переменная, которой управляют, как выход и измеренный объект выход, опорный сигнал и измеренный объект ввела воздействие, соответственно, как входные параметры. Четыре блока Осциллографа строят пять сигналов цикла, которые также сохранены (за исключением опорного сигнала) четырьмя блоками К рабочей области.

Симулируйте систему замкнутого цикла с помощью 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.

Графики в блоках Scope эквивалентны тем в Симулировании Ответа С обратной связью Используя sim Команду и Симулируют Ответ С обратной связью с разделами Несоответствия Модели с незначительными различиями вследствие того, что в Симулируют Ответ С обратной связью Используя sim Команду, неизмеренный сигнал воздействия является нулем, и что в Симулируют Ответ С обратной связью с Несоответствием Модели, вы добавляете шум во ввод и вывод объекта. Также обратите внимание что, в то время как sim MPC команда внутренне дискретизирует любую непрерывную модель объекта управления с помощью метода ZOH, Simulink обычно использует алгоритм интегрирования (в этом примере ode45) симулировать замкнутый цикл, когда блок непрерывного времени присутствует.

Запустите симуляцию с синусоидальным Выходным шумом.

Примите, что выходные измерения затронуты синусоидальным воздействием (один тональный шум датчика) частоты 0,1 Гц.

omega = 2*pi/10;                            % disturbance radial frequency

Откройте mpc_misonoise Модель Simulink, которая похожа на mpc_miso модель за исключением синусоидального воздействия, добавленного к измеренному выходу. Кроме того, время симуляции более длинно, и неизмеренное воздействие начинается перед измеренным воздействием.

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.

setindist(mpcobj,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.

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

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

Объекты

Приложения

Блоки

Похожие темы