Этот пример показывает, как настроить контроллер для уменьшения вибраций в гибком луче.
Фигура изображает активную систему регулирования вибрации для гибкого луча.
Фигура 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
Это подтверждается наблюдением, что Годограф Найквиста of положительно реально.
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 = 38
Оптимизатор нашел контроллер второго порядка с. Сравните с оптимальным значением для 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')
Мы использовали приблизительную модель луча, чтобы спроектировать эти два контроллеров. Априори, нет гарантии, что эти контроллеры будут хорошо работать на реальном луче. Однако мы знаем, что луч является пассивной физической системой и что отрицательное соединение с обратной связью пассивных систем всегда стабильно. Так что, если это пассивно, мы можем быть уверены, что система с обратной связью будет стабильной.
Оптимальный контроллер не пассивен. На самом деле, его относительный пассивный индекс бесконечен, потому что это даже не минимальная фаза.
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 = 71
Тюнер достигает того же значения, что и ранее, при обеспечении пассивности (жесткое ограничение менее 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.
systune
| TuningGoal.LQG
| TuningGoal.WeightedPassivity