В этом примере показано, как настроить контроллер для сокращения колебаний в гибком луче.
Рисунок 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 = 36
Тюнер достигает того же значения как ранее при осуществлении пассивности (трудное ограничение меньше чем 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