Этот пример показывает, как надежно настроить контроллер для сокращения колебаний в гибком луче. Этот пример адаптируется из "Проекта Системы управления" Г. Гудвина, С. Грэеба и М. Сальгадо.
Рисунок 1 изображает активную систему управления вибрации для гибкого луча.
Рисунок 1: Активное управление гибкого луча
В этой настройке датчик измеряет положение совета и привод является пьезоэлектрической закрашенной фигурой, обеспечивающей силу . Мы можем смоделировать передаточную функцию от входа управления снабжать подсказкой положение использование анализа конечных элементов. Сохраняя только первые шесть режимов, мы получаем модель объекта управления формы
со следующей номинальной стоимостью для амплитуд :
Факторы затухания часто малоизвестны и приняты, чтобы расположиться между 0,0002 и 0.02. Точно так же собственные частоты только приблизительно известны, и мы принимаем 20%-ю неуверенность на их местоположении. Чтобы создать неопределенную модель гибкого луча, используйте объект ureal
задать область значений неуверенности для затухания и собственных частот. Чтобы упростить, мы принимаем, что все режимы имеют тот же фактор затухания .
% Damping factor zeta = ureal('zeta',0.002,'Range',[0.0002,0.02]); % Natural frequencies w1 = ureal('w1',18.95,'Percent',20); w2 = ureal('w2',118.76,'Percent',20); w3 = ureal('w3',332.54,'Percent',20); w4 = ureal('w4',651.66,'Percent',20); w5 = ureal('w5',1077.2,'Percent',20); w6 = ureal('w6',1609.2,'Percent',20);
Затем объедините эти неопределенные коэффициенты в выражение для .
alpha = [9.72e-4 0.0122 0.0012 -0.0583 -0.0013 0.1199]; G = tf(alpha(1),[1 2*zeta*w1 w1^2]) + tf(alpha(2),[1 2*zeta*w2 w2^2]) + ... tf(alpha(3),[1 2*zeta*w3 w3^2]) + tf(alpha(4),[1 2*zeta*w4 w4^2]) + ... tf(alpha(5),[1 2*zeta*w5 w5^2]) + tf(alpha(6),[1 2*zeta*w6 w6^2]); G.InputName = 'uG'; G.OutputName = 'y';
Визуализируйте влияние неуверенности на передаточной функции от к . Функция bode
автоматически показывает ответы для 20 случайным образом выбранных значений неопределенных параметров.
rng(0), bode(G,{1e0,1e4}), grid
title('Uncertain beam model')
Управление LQG является естественной формулировкой для активного управления вибрацией. С systune
вы не ограничиваетесь полным порядком оптимальный контроллер LQG и можете настроить контроллеры любого порядка. Здесь, например, давайте настроим контроллер пространства состояний 6-го порядка (половина порядка объекта).
C = tunableSS('C',6,1,1);
Настройка управления LQG изображена в рисунке 2. Сигналы и шум процесса и измерения, соответственно.
Рисунок 2: управляющая структура LQG
Создайте модель с обратной связью блок-схемы в рисунке 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'});
Обратите внимание на то, что CL0
зависит и от настраиваемого контроллера C
и от неопределенного затухания и собственных частот.
CL0
CL0 = Generalized continuous-time state-space model with 2 outputs, 2 inputs, 18 states, and the following blocks: C: Parametric 1x1 state-space model, 6 states, 1 occurrences. w1: Uncertain real, nominal = 18.9, variability = [-20,20]%, 3 occurrences w2: Uncertain real, nominal = 119, variability = [-20,20]%, 3 occurrences w3: Uncertain real, nominal = 333, variability = [-20,20]%, 3 occurrences w4: Uncertain real, nominal = 652, variability = [-20,20]%, 3 occurrences w5: Uncertain real, nominal = 1.08e+03, variability = [-20,20]%, 3 occurrences w6: Uncertain real, nominal = 1.61e+03, variability = [-20,20]%, 3 occurrences zeta: Uncertain real, nominal = 0.002, range = [0.0002,0.02], 6 occurrences Type "ss(CL0)" to see the current value, "get(CL0)" to see all properties, and "CL0.Blocks" to interact with the blocks.
Используйте критерий LQG в качестве цели управления. Эта настраивающая цель позволяет вам задать шумовые ковариации и веса на переменных производительности.
R = TuningGoal.LQG({'d','n'},{'y','u'},diag([1,1e-10]),diag([1 1e-12]));
Теперь настройте контроллер C
, чтобы минимизировать стоимость LQG в целой области значений неуверенности.
[CL,fSoft,~,Info] = systune(CL0,R);
Soft: [5.63e-05,Inf], Hard: [-Inf,Inf], Iterations = 80 Soft: [6.14e-05,Inf], Hard: [-Inf,Inf], Iterations = 129 Soft: [6.22e-05,9.17e-05], Hard: [-Inf,-Inf], Iterations = 43 Soft: [7.21e-05,7.21e-05], Hard: [-Inf,-Inf], Iterations = 47 Final: Soft = 7.21e-05, Hard = -Inf, Iterations = 299
Сравните открытое - и с обратной связью Предвещают ответы от к для 20 случайным образом выбранных значений неопределенных параметров. Отметьте, как контроллер отсекает первые три peaks в Предвещать ответе.
Tdy = getIOTransfer(CL,'d','y'); bode(G,Tdy,{1e0,1e4}) title('Transfer from disturbance to tip position') legend('Open loop','Closed loop')
Затем постройте открытое - и ответы с обратной связью на импульсное воздействие . Для удобочитаемости ответ разомкнутого цикла построен только для номинального объекта.
impulse(getNominal(G),Tdy,5) title('Response to impulse disturbance d') legend('Open loop','Closed loop')
Наконец, systune
также обеспечивает понимание комбинаций худшего случая значений собственной частоты и затухания. Эта информация доступна в выходном аргументе Info
.
WCU = Info.wcPert
WCU = 3x1 struct array with fields:
w1
w2
w3
w4
w5
w6
zeta
Используйте эти данные, чтобы построить импульсный ответ для этих двух худших вариантов.
impulse(usubs(Tdy,WCU),5)
title('Worst-case response to impulse disturbance d')