Этот пример показывает, как настроить контроллер для сокращения колебаний в гибком луче.
Рисунок 1 изображает активную систему управления вибрации для гибкого луча.
Рисунок 1: Активное управление гибкого луча
В этой настройке расположен привод, обеспечивающий силу и скоростной датчик. Мы можем смоделировать передаточную функцию от входа управления до скорости с помощью анализа конечных элементов. Сохраняя только первые шесть режимов, мы получаем модель объекта управления формы
со следующими значениями параметров.
% Parameters
xi = 0.05;
alpha = [0.09877, -0.309, -0.891, 0.5878, 0.7071, -0.8091];
w = [1, 4, 9, 16, 25, 36];
Получившейся моделью луча для дают
% Beam model G = tf(alpha(1)^2*[1,0],[1, 2*xi*w(1), w(1)^2]) + ... tf(alpha(2)^2*[1,0],[1, 2*xi*w(2), w(2)^2]) + ... tf(alpha(3)^2*[1,0],[1, 2*xi*w(3), w(3)^2]) + ... tf(alpha(4)^2*[1,0],[1, 2*xi*w(4), w(4)^2]) + ... tf(alpha(5)^2*[1,0],[1, 2*xi*w(5), w(5)^2]) + ... tf(alpha(6)^2*[1,0],[1, 2*xi*w(6), w(6)^2]); G.InputName = 'uG'; G.OutputName = 'y';
С этой настройкой датчика/привода луч является пассивной системой:
isPassive(G)
ans = logical 1
Это подтверждено путем замечания, что годограф Найквиста - положителен действительный.
nyquist(G)
Управление LQG является естественной формулировкой для активного управления вибрацией. Настройка управления LQG изображена в рисунке 2. Сигналы и являются шумом процесса и измерения, соответственно.
Рисунок 2: управляющая структура LQG
Сначала используйте lqg
, чтобы вычислить оптимальный контроллер LQG для цели
с шумовыми отклонениями:
[a,b,c,d] = ssdata(G);
M = [c d;zeros(1,12) 1]; % [y;u] = M * [x;u]
QWV = blkdiag(b*b',1e-2);
QXU = M'*diag([1 1e-3])*M;
CLQG = lqg(ss(G),QXU,QWV);
LQG-оптимальный контроллер CLQG
является комплексным с 12 состояниями и несколькими нулями отметки.
size(CLQG)
State-space model with 1 outputs, 1 inputs, and 12 states.
bode(G,CLQG,{1e-2,1e3}), grid, legend('G','CLQG')
Используйте тюнер общего назначения systune
, чтобы попытаться упростить этот контроллер. С systune
вы не ограничиваетесь контроллером полного порядка и можете настроить контроллеры любого порядка. Здесь, например, давайте настроим контроллер пространства состояний 2-го порядка.
C = ltiblock.ss('C',2,1,1);
Создайте модель с обратной связью блок-схемы в рисунке 2.
C.InputName = 'yn'; C.OutputName = 'u'; S1 = sumblk('yn = y + n'); S2 = sumblk('uG = u + d'); CL0 = connect(G,C,S1,S2,{'d','n'},{'y','u'},{'yn','u'});
Используйте критерий LQG выше в качестве единственной настраивающей цели. LQG настраивающаяся цель позволяет вам непосредственно задать веса производительности и шумовые ковариации.
R1 = TuningGoal.LQG({'d','n'},{'y','u'},diag([1,1e-2]),diag([1 1e-3]));
Теперь настройте контроллер C
, чтобы минимизировать цель LQG.
[CL1,J1] = systune(CL0,R1);
Final: Soft = 0.478, Hard = -Inf, Iterations = 40
Оптимизатор нашел контроллер 2-го порядка с. Сравните с оптимальным значением для CLQG
:
[~,Jopt] = evalGoal(R1,replaceBlock(CL0,'C',CLQG))
Jopt = 0.4673
Ухудшение производительности составляет меньше чем 5%, и мы уменьшали сложность контроллера с 12 до 2 состояний. Далее сравните импульсные ответы от с для этих двух контроллеров. Эти два ответа почти идентичны. Можно поэтому получить почти оптимальное затухание вибрации с простым контроллером второго порядка.
T0 = feedback(G,CLQG,+1); T1 = getIOTransfer(CL1,'d','y'); impulse(T0,T1,5) title('Response to impulse disturbance d') legend('LQG optimal','2nd-order LQG')
Мы использовали аппроксимированную модель луча, чтобы разработать эти два контроллера. Априорно, нет никакой гарантии, что эти контроллеры выполнят хорошо на действительном луче. Однако мы знаем, что луч является пассивной физической системой и что соединение отрицательной обратной связи пассивных систем всегда стабильно. Таким образом, если пассивно, мы можем быть уверены, что система с обратной связью будет стабильна.
Оптимальный контроллер LQG не пассивен. На самом деле его относительный пассивный индекс бесконечен, потому что даже не минимальная фаза.
getPassiveIndex(-CLQG)
ans = Inf
Это подтверждено его годографом Найквиста.
nyquist(-CLQG)
Используя systune
, можно повторно настроить контроллер второго порядка с дополнительным требованием, которое должно быть пассивно. Для этого создайте настраивающую цель пассивности для передаточной функции разомкнутого цикла от yn
до u
(который является). Используйте цель "WeightedPassivity" составлять знак "минус".
R2 = TuningGoal.WeightedPassivity({'yn'},{'u'},-1,1); R2.Openings = 'u';
Теперь повторно настройте модель CL1
с обратной связью, чтобы минимизировать объективный предмет LQG к тому, чтобы быть пассивным. Обратите внимание на то, что цель пассивности R2
теперь задана как трудное ограничение.
[CL2,J2,g] = systune(CL1,R1,R2);
Final: Soft = 0.478, Hard = 1, Iterations = 37
Тюнер достигает того же значения как ранее при осуществлении пассивности (трудное ограничение меньше чем 1). Проверьте, что это пассивно.
C2 = getBlockValue(CL2,'C');
passiveplot(-C2)
Улучшение по сравнению с LQG-оптимальным контроллером является самым видимым в годографе Найквиста.
nyquist(-CLQG,-C2) legend('LQG optimal','2nd-order passive LQG')
Наконец, сравните импульсные ответы от с.
T2 = getIOTransfer(CL2,'d','y'); impulse(T0,T2,5) title('Response to impulse disturbance d') legend('LQG optimal','2nd-order passive LQG')
Используя systune
, вы разработали пассивный контроллер второго порядка с почти оптимальной производительностью LQG.
TuningGoal.LQG
| TuningGoal.WeightedPassivity
| systune