В этом примере показано, как к разработке и реализации пользовательское средство оценки состояния, которое эквивалентно встроенному Фильтру Калмана, автоматически спроектированному линейным контроллером MPC.
Линейный контроллер MPC, предоставленный программным обеспечением Model Predictive Control Toolbox, включает средство оценки состояния по умолчанию, чтобы упростить реализацию контроллера. Для линейного независимого от времени (LTI) контроллером MPC, модель предсказания которого никогда не изменяется во времени выполнения, средство оценки состояния по умолчанию, является Фильтр Калмана LTI. Этот фильтр автоматически создан с использованием модель предсказания, заданная в объекте MPC, и это обычно работает на многие приложения MPC. Однако, чтобы достигнуть удовлетворительных результатов в некоторых случаях, необходимо настроить или заменить Фильтр Калмана. Для этого можно выполнить пользовательскую оценку состояния; то есть, обойдите встроенное средство оценки и предоставьте оцененные состояния непосредственно контроллеру MPC, когда время выполнения сигнализирует, x[k|k]
.
Один общий подход к разработке пользовательского средства оценки состояния должен сначала реализовать то, которое эквивалентно встроенному Фильтру Калмана. Можно затем использовать его в качестве начальной точки для индивидуальной настройки, например, путем изменения ее структуры или настройки ее параметров. В этом примере вы сначала исследуете простой LTI контроллер MPC, чтобы изучить, как встроенный Фильтр Калмана сгенерирован. Вы затем реализуете эквивалентное средство оценки в Simulink с помощью или базовых блоков Simulink или блока Kalman Filter, включенного с программным обеспечением Control System Toolbox.
Примите, что у вас есть непрерывное время, одно вход, одно выход нелинейный объект. Объект имеет два состояния, и вы хотите спроектировать LTI контроллер MPC в установившейся рабочей точке.
Задайте состояние, введите, и выходные значения в этой рабочей точке.
x0 = [1.6931; 4.3863]; u0 = 7.7738; y0 = 0.5;
Можно получить линейную модель объекта управления в рабочей точке несколькими способами, такими как система идентификации и линеаризация. В данном примере примите тот G
получившаяся линейная модель объекта управления.
G = ss([-2 1;-9.7726 -1.3863],[0;1],[0.5 0],0);
Чтобы использовать объект для пользовательской оценки состояния, дискретизируйте модель объекта управления с шагом расчета 0,1.
Ts = 0.1; Gd = c2d(G,Ts);
Создайте LTI контроллер MPC, использующий линейную модель объекта управления.
mpcobj = mpc(G,Ts);
-->The "PredictionHorizon" property of "mpc" object is empty. Trying PredictionHorizon = 10. -->The "ControlHorizon" property of the "mpc" object is empty. Assuming 2. -->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
Установите номинальные значения внутренней модели объекта управления, чтобы отразить установившуюся рабочую точку.
mpcobj.Model.Nominal.Y = y0; mpcobj.Model.Nominal.U = u0; mpcobj.Model.Nominal.X = x0;
Сделайте контроллер менее агрессивным путем сокращения настраивающего веса выхода от 1 до 0,2. Используйте значения по умолчанию для других параметров контроллера.
mpcobj.Weights.OutputVariables = 0.2;
Как контроллер обратной связи, одна важная задача контроллера MPC состоит в том, чтобы полностью отклонить воздействия во время выполнения, то есть, установившуюся ошибку на объекте, выход является нулем в присутствии воздействия. Диспетчеры MPC используют возмущение, чтобы задать воздействие, которое будет отклонено. Состояния возмущения отражают присутствие такого воздействия во время выполнения.
Поскольку наиболее распространенное воздействие является неизмеренным воздействием шага, добавленным на объекте выход, контроллер MPC сконфигурирован, чтобы отклонить такое воздействие по умолчанию. Чтобы быть точнее, MPC использует интегратор дискретного времени с безразмерным усилением единицы как выходное возмущение по умолчанию. Его вход, w
, белый шум с модульным отклонением и нулевым средним значением. Можно исследовать возмущение по умолчанию с помощью getoutdist
функция.
God = getoutdist(mpcobj);
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Другими словами, MPC ожидает отклонять случайное подобное шагу воздействие на объекте выход с ожидаемой величиной 1 (после масштабирования). В этом примере сохраните это выходное возмущение по умолчанию.
Получить полную модель предсказания, используемую контроллером MPC, Gpred
, увеличьте модель объекта управления с возмущением. Измеренный выход, замеченный MPC теперь, становится суммой объекта выход и возмущение выход. Следует иметь в виду что входное значение белого шума w
не вход к модели предсказания потому что w
не измерено.
A = blkdiag(Gd.A,God.A); Bu = [Gd.B; 0]; Cm = [Gd.C God.C]; D = Gd.D; Gpred = ss(A,Bu,Cm,D,Ts);
Поскольку диспетчер MPC все еще должен знать все состояния модели предсказания во время выполнения, включая состояние интегратора от выходного возмущения, Фильтр Калмана LTI автоматически спроектирован, чтобы оценить три состояния во время выполнения.
В оформлении по умолчанию наблюдатель, используемый Фильтром Калмана:
x[k+1] = A*x[k] + w[k] y[k] = Cm*x[k] + v[k]
Контроллер MPC также принимает шум измерения при выходе y
белый шум с нулевым средним значением и модульным отклонением после масштабирования. Поэтому моделью шума измерения по умолчанию является Gmn
показанный ниже:
Gmn = ss(1,'Ts',Ts);
В этом сценарии в проекте Фильтра Калмана существует три аддитивных шума: (1) шум процесса добавляется к переменной, которой управляют; (2) шум процесса, добавленный к входу God
; (3) шум измерения, добавленный к входу Gmn
:
[ Gd.B(1) 0 0 ] [ wn1 ] w[k] = [ Gd.B(2) 0 0 ] * [ wn2 ] = B_est * white noise [ 0 God.B 0 ] [ wn3 ] v[k] = [ Gd.D God.D Gmn.D ] * wn4 = D_est * white noise
B_est = [[Gd.B;0] [0;0;God.B] [0;0;0]]; D_est = [Gd.D God.D Gmn.D];
Поэтому получить шумовые ковариационные матрицы Q
R
, и N
, используйте следующие уравнения.
Q = Expectation{w*ctranspose(w)} = B_est * ctranspose(B_est) R = Expectation{v*ctranspose(v)} = D_est * ctranspose(D_est) N = Expectation{w*ctranspose(v)} = B_est * ctranspose(D_est)
Q = B_est*B_est'; R = D_est*D_est'; N = B_est*D_est';
Можно получить усиления, L
и {M}, с помощью kalman
функция.
G = eye(3); H = zeros(1,3); [~, L, ~, M] = kalman(ss(A,[Bu G],Cm,[D H],Ts),Q,R,N);
Этот процесс проектирования Фильтра Калмана по умолчанию происходит автоматически, когда вы создаете контроллер MPC объект. Чтобы получить получившееся оформление по умолчанию, используйте getEstimator
функция.
[L1,M1,A1,Cm1,Bu1] = getEstimator(mpcobj);
Эти параметры средства оценки идентичны тем, вы ранее вывели вручную.
На данном этапе можно создать собственный Фильтр Калмана в Simulink. Один способ создать этот фильтр состоит в том, чтобы использовать базовые блоки Simulink на основе L
M
A
, Cm
, и Bu
.
mdl = 'mpc_KalmanFilter'; load_system(mdl) open_system([mdl '/State Estimator'])
В качестве альтернативы можно использовать блок Kalman Filter, обеспеченный программным обеспечением Control System Toolbox. Этот блок использует Gpred
модель как системная модель, а также шумовые ковариационные матрицы Q
R
, и N
.
Поскольку Фильтр Калмана спроектирован в номинальной рабочей точке и использует переменные отклонения, номинальная стоимость должна быть вычтена из входных сигналов Фильтра Калмана, u
и y
, и добавил к его выходному сигналу, x[k|k]
.
Модель Simulink содержит три цикла MPC управления, которые управляют тем же объектом.
open_system(mdl);
Создайте второй контроллер MPC, который использует пользовательскую оценку состояния.
mpcobjCSE = mpcobj;
setEstimator(mpcobjCSE,'custom')
Симулируйте модель.
sim(mdl); open_system([mdl '/Output']); open_system([mdl '/Input']);
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Результат симуляции показывает, что встроенное средство оценки состояния и пользовательские средства оценки состояния приводят к тому же результату.
Можно применить деривацию средства оценки состояния в этом примере к объектам MIMO. Кроме того, при использовании адаптивного из линейного разового варьирования (LTV) MPC, встроенный Фильтр Калмана является LTV где L
M
, и ошибочная ковариационная матрица P
станьте изменяющимися во времени. Поэтому пользовательское средство оценки состояния будет более сложным.
mpc
| getEstimator
| setEstimator