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