В этом примере показано, как надежно настроить контроллер для уменьшения вибраций в гибкой балке. Этот пример адаптирован из «Control System Design» Г. Гудвина, С. Грейба и М. Сальгадо.
На фиг.1 показана система активного управления вибрациями для гибкой балки.

Рис. 1: Активное управление гибкой балкой
В этой установке датчик измеряет положение наконечника ), а исполнительный механизм представляет собой пьезоэлектрическую накладку, обеспечивающую усилие t). Мы можем смоделировать передаточную функцию от управляющего u к наконечника y с помощью конечно-элементного анализа. Сохраняя только первые шесть режимов, получаем растительную модель формы
=∑i=16αis2+2ζiωis+ωi2
при следующих номинальных значениях амплитуд и собственных частот :
0.0013 0.1199
Коэффициенты демпфирования, правило, плохо известны и, как предполагается, находятся в диапазоне от 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. Сигналы и n являются шумом процесса и измерения соответственно.

Рис. 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: Tunable 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 = 72 Soft: [6.13e-05,Inf], Hard: [-Inf,Inf], Iterations = 97 Soft: [6.47e-05,Inf], Hard: [-Inf,Inf], Iterations = 65 Soft: [7.76e-05,Inf], Hard: [-Inf,Inf], Iterations = 86 Soft: [7.76e-05,Inf], Hard: [-Inf,Inf], Iterations = 88 Soft: [7.76e-05,Inf], Hard: [-Inf,Inf], Iterations = 43 Soft: [7.77e-05,Inf], Hard: [-Inf,Inf], Iterations = 79 Soft: [7.8e-05,8.46e-05], Hard: [-Inf,-Inf], Iterations = 38 Soft: [8.02e-05,8.85e-05], Hard: [-Inf,-Inf], Iterations = 117 Soft: [8.22e-05,8.24e-05], Hard: [-Inf,-Inf], Iterations = 40 Soft: [8.22e-05,8.22e-05], Hard: [-Inf,-Inf], Iterations = 25 Final: Soft = 8.22e-05, Hard = -Inf, Iterations = 750
Сравните отклики Bode с разомкнутым и замкнутым контуром от до для 20 случайно выбранных значений неопределенных параметров. Обратите внимание, как контроллер обрезает первые три пика в ответе Боде.
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=10×1 struct array with fields:
w1
w2
w3
w4
w5
w6
zeta
Эти данные используются для построения графика импульсной реакции для двух наихудших сценариев.
impulse(usubs(Tdy,WCU),5)
title('Worst-case response to impulse disturbance d')