В этом примере показано, как спроектировать контроллер путем определения желаемой формы для ответа разомкнутого контура объекта с контроллером. loopsyn
команда проектирует контроллер, который формирует ответ разомкнутого контура, чтобы приблизительно совпадать с целевой формой цикла, которую вы обеспечиваете. loopsyn
позволяет вам настроить компромисс между эффективностью и робастностью, чтобы получить удовлетворительные ответы временного интервала при предотвращении хрупких проектов с инверсией объекта или гибкой отменой режима.
В этом примере вы проектируете контроллер для самолета model.The, пример показывает, как, варьируясь баланс между эффективностью и робастностью влияет на форму цикла и ответ с обратной связью. Пример затем показывает, как уменьшать порядок контроллера при сохранении желательных характеристик ответа.
Этот пример использует 2D вход, 2D выход модель [1] самолета НАСА HiMAT. Самолет показывают в следующей схеме.
Контрольные переменные являются элевоном и приводами утки ( и ). Выходные переменные являются углом нападения () и угол отношения (). Модель имеет шесть состояний, данных
,
где и лифт и состояния привода утки, соответственно. Используя следующие матрицы пространства состояний, создайте модель этого объекта.
A = [ -2.2567e-02 -3.6617e+01 -1.8897e+01 -3.2090e+01 3.2509e+00 -7.6257e-01; 9.2572e-05 -1.8997e+00 9.8312e-01 -7.2562e-04 -1.7080e-01 -4.9652e-03; 1.2338e-02 1.1720e+01 -2.6316e+00 8.7582e-04 -3.1604e+01 2.2396e+01; 0 0 1.0000e+00 0 0 0; 0 0 0 0 -3.0000e+01 0; 0 0 0 0 0 -3.0000e+01]; B = [0 0; 0 0; 0 0; 0 0; 30 0; 0 30]; C = [0 1 0 0 0 0; 0 0 0 1 0 0]; D = [0 0; 0 0]; G = ss(A,B,C,D); G.InputName = {'elevon','canard'}; G.OutputName = {'attack','attitude'};
Исследуйте сингулярные значения модели.
sigma(G)
Этот объект плохо обусловлен, в том смысле, что существует разрыв приблизительно 40 дБ между самыми большими и самыми маленькими сингулярными значениями около желаемой полосы пропускания управления 8 рад/с. Далее, когда график шага показывает, ответ разомкнутого контура этого объекта нестабилен.
step(G)
Чтобы спроектировать стабилизировавшийся контроллер для этого объекта, выберите целевую форму цикла. Типичная форма цикла имеет низкое усиление на высоких частотах для робастности и высокое усиление в низких частотах для эффективности. Для желаемой частоты среза 8 рад/с простая целевая форма цикла, которая удовлетворяет эти требования, .
Gd = tf(8,[1 0]);
sigma(Gd,{0.1 100})
grid on
Спроектируйте начальный контроллер с loopsyn
.
[K0,CL0,gamma0,info0] = loopsyn(G,Gd); gamma0
gamma0 = 1.2846
Эффективность gamma
мера как хорошо форма цикла с K0
совпадает с желаемой формой цикла. Значения рядом или ниже 1 указывают на тот G*K0
близко к Gd
. Сравните достигнутую форму цикла с целью.
L0 = G*K0; sigma(L0,"b",Gd,"r--",{.1,100}); grid legend("L0 (actual loop shape)","Gd (target loop shape)");
Соответствие не очень близко в низких частотах, хотя оно улучшает близкое перекрестное соединение. Кроме того, эти два сингулярных значения все еще несколько далеко друг от друга вокруг перекрестного соединения, такого, что существует эффективно две частоты среза. Исследуйте, как эта форма разомкнутого контура влияет на переходной процесс с обратной связью.
step(CL0,5)
Удар в attitude
отслеживание (нижний правый график) является результатом разделения этих двух сингулярных значений, ведя к ответу с двумя постоянными времени. Кроме того, между attack
существует значительная связь и
attitude
. Желательно настроить контроллер, чтобы уменьшать удар в attitude
отслеживание, уменьшайте связь, и, если возможно уменьшайте перерегулирование в attack
ответ.
Чтобы улучшить проект, можно попытаться изменить баланс что loopsyn
забастовки между эффективностью и робастностью. Для этого используйте alpha
входной параметр к loopsyn
. По умолчанию, loopsyn
использование alpha = 0.5
, который оптимизирует эффективность, удовлетворяющую робастности, являющейся не хуже, чем половина максимальной достижимой робастности. alpha = 0
оптимизирует для эффективности (mixsyn
спроектируйте). Установка alpha = 1
использует максимизирующий робастность ncfsyn
проект. Во-первых, рассмотрите чистый mixsyn
проект.
alpha = 0; [K_mix,CL_mix,gamma_mix,info_mix] = loopsyn(G,Gd,alpha); gamma_mix
gamma_mix = 0.7723
gamma
значение указывает на намного более близкое соответствие к целевой форме цикла, которую можно подтвердить путем графического вывода ответов разомкнутого контура.
L_mix = G*K_mix; sigma(L0,"b",L_mix,"g",Gd,"r--",{.1,100}); grid legend("L0 (inital design)","L_mix (mixsyn design)","Gd (target loop shape)");
Этот проект примерно инвертирует объект. В результате сингулярные значения L_mix
сходитесь около частоты среза, и обычно намного ближе вместе, чем на исходном объекте. С этим инвертирующим объект контроллером ответ с обратной связью показывает хорошую эффективность с минимальным перерегулированием и перекрестной связью.
step(CL0,CL_mix,5) legend("Initial design","mixsyn design","Location","southeast")
Однако эта эффективность происходит за счет робастности. Сравните запасы устойчивости системы с первоначальным проектом и mixsyn
проект.
DM0 = diskmargin(G,K0); DM_mix = diskmargin(G,K_mix); DM0.DiskMargin
ans = 0.1206
DM_mix.DiskMargin
ans = 0.0517
Инвертирующий объект проект имеет плохую робастность. Например, если самое маленькое сингулярное значение модели объекта управления составляет 1% самого большого сингулярного значения, инвертирование объекта усиливает ошибки модели на коэффициент 100 в направлении самого маленького сингулярного значения. Таким образом, если вы не имеете очень точную модель, желательно использовать проект с лучшей робастностью.
В другой крайности чистый ncfsyn
спроектируйте, оптимизированный для робастности. Вычислите такой контроллер, использующий alpha = 1
, и исследуйте получившуюся устойчивость, форму цикла и ответы.
alpha = 1; [K_ncf,CL_ncf,gamma_ncf,info_ncf] = loopsyn(G,Gd,alpha); gamma_ncf
gamma_ncf = 2.8360
DM_ncf = diskmargin(G,K_ncf); DM_ncf.DiskMargin
ans = 0.2201
L_ncf = G*K_ncf; sigma(L0,L_mix,L_ncf,Gd,"k--",{.1,100}); grid legend("L0 (inital design)","L_mix (mixsyn design)","L_ncf (ncfsyn design)","Gd (target loop shape)");
Увеличенное значение gamma
указывает на низкую производительность, хотя запас устойчивости улучшен, как ожидалось. График сингулярного значения показывает, что этот контроллер инвертирует объект еще меньше, чем начальная буква, которая очевидна в этом, разделение сингулярных значений является примерно тем же самым, как это было для объекта разомкнутого контура. Разделение частот среза приводит к большим постоянным времени и малым постоянным времени в переходном процессе, который является четным более плохой, чем первоначальный проект. Удар, следующий из широкой перекрестной области, теперь очевиден во всех четырех каналах ввода-вывода.
step(CL0,CL_mix,CL_ncf,5) legend("Initial design","mixsyn design","ncfsyn design","Location","southeast")
Таким образом, чтобы изменить к лучшему оформление по умолчанию, немного способствуя mixsyn
проект, не выбрасывая слишком много запаса устойчивости может дать к подходящему проекту для этого объекта. Можно управлять сколько loopsyn
эффективность пользы или робастность установкой alpha
к любому значению между 0 и 1. Значением по умолчанию, используемым в начальном контроллере, является alpha = 0.5
. Попробуйте значение, которое немного способствует эффективности, и сравните результаты с первоначальным проектом.
alpha = 0.25; [K,CL,gamma,info] = loopsyn(G,Gd,alpha); gamma
gamma = 1.0226
L = G*K; sigma(L0,L,Gd,"k--",{.1,100}); grid legend("L0 (inital design)","L (final design)","Gd (target loop shape)");
DM = diskmargin(G,K); DM.DiskMargin
ans = 0.0966
step(CL0,CL,5) legend("initial (alpha = 0.5)","final (alpha = 0.25)","Location","southeast")
alpha = 0.25
спроектируйте выражения довольно хорошая эффективность, уменьшая связь и устранение удара в attitude
ответ. Это имеет немного меньший запас устойчивости (дисковое поле приблизительно 0,09, по сравнению с приблизительно 0,125 для первоначального проекта). Для вашего приложения можно выбрать любое значение alpha
между 0 и 1 достигает приемлемого баланса между эффективностью и робастностью.
Иногда возможно упростить контроллер, возвращенный loopsyn
при сохранении желательных характеристик отклика системы. В этом примере, контроллер K
девятый порядок.
order(K)
ans = 9
Видеть, возможно ли упростить K
, используйте balred
команда.
balred(K)
График показывает сингулярные значения Ганкеля контроллера, который указывает на относительный энергетический вклад каждого режима. Сингулярное значение Ганкеля уменьшается резко после шестого порядка, так попытайтесь уменьшать контроллер соответственно.
Kr = balred(K,6); order(Kr)
ans = 6
Сравните сингулярные значения уменьшаемого и контроллеров полного порядка, чтобы подтвердить, что различие между ними мало.
sigma(K,K-Kr,{1e-4,1e6}) legend("K (ninth order)","difference K-Kr")
Можно также подтвердить, что контроллер уменьшаемого порядка производит фактически идентичный ответ с обратной связью.
CLr = feedback(G*Kr,eye(2)); step(CL,CLr,5) legend("K (ninth order)","Kr (sixth order)","Location","southeast")
Зная, что контроллер шестого порядка достаточен, чтобы достигнуть желаемых ответов, можно использовать loopsyn
спроектировать новый контроллер, задавая целевой порядок с ord
входной параметр. Этот подход является альтернативой предыдущему подходу разработки и контроллера полного порядка, сопровождаемого сокращением.
Спроектируйте новый контроллер шестого порядка с alpha = 0.25
и сравните ответы на ответ, полученный с уменьшаемым контроллером.
alpha = 0.25; [K6,CL6,gamma6,info6] = loopsyn(G,Gd,alpha,6); step(CLr,CL6,5) legend("Kr (reduced to 6th order)","K6 (computed at 6th order)","Location","southeast")
Разработка контроллера шестого порядка непосредственно дает к подобному переходному процессу, несмотря на то, что для этой конкретной системы этот подход приводит к некоторому сокращению эффективности (gamma6 = 1.4
, по сравнению с gamma = 1.0
для полного порядка, alpha = 0.25
контроллер K
). Однако для некоторых систем, этот подход может быть лучше, потому что он оптимизирует сам контроллер более низкоуровневый, вместо того, чтобы удалить потенциально важную динамику из оптимизированного контроллера.
loopsyn
позволяет вам настроить компромисс между эффективностью и робастностью, чтобы установить подходящее равновесие для вашего приложения. Можно попробовать различные значения alpha
найти контроллер, который работает на ваши требования. Можно затем уменьшать порядок контроллера с balred
, или используйте ord
аргумент loopsyn
синтезировать контроллер более низкоуровневый непосредственно.
[1] Сафонов, M., А. Лоб и Г. Хартманн. “Свойства обратной связи Многомерных Систем: Роль и Использование Матрицы Различия в Возврате”. Транзакции IEEE на Автоматическом управлении 26, № 1 (февраль 1981): 47–65.