Устойчивая настройка системы Массового Демпфера Spring

В этом примере показано, как надежно настроить ПИД-регулятор для неопределенной системы массового пружинного демпфера, смоделированной в Simulink.

Модель Simulink системы Массового Демпфера Spring

Массовый пружинный демпфер, изображенный в рисунке 1, моделируется дифференциальным уравнением второго порядка

$$m \ddot{x} + c \dot{x} + k x = F$$

где$F$ к силе применяются масса и$x$ является горизонтальным положением массы.

Рисунок 1: система Массового Демпфера Spring.

Эта система моделируется в Simulink можно следующим образом:

open_system('rct_mass_spring_damper')

Мы можем использовать ПИД-регулятор, чтобы сгенерировать усилие$F$, должен был сменить положение$x$. Настройка этого ПИД-регулятора легка, когда физические параметры$m,c,k$ известны точно. Однако это редко имеет место на практике, из-за многих факторов включая неточные измерения, производственные допуски, изменения в условиях работы и износ. В этом примере показано, как принять такую неопределенность во внимание во время настройки, чтобы обеспечить высокую производительность в области значений ожидаемых значений для$m,c,k$.

Моделирование неопределенности

Модель Simulink использует "большинство вероятных" или "номинальных" значений$m,c,k$:

$$m =3 , \;\; c = 1 , \;\; k = 2 .$$

Используйте "сомнительный действительный" (ureal) возразите, чтобы смоделировать область значений значений, которые может принять каждый параметр. Здесь неопределенность задана как отклонение процента от номинальной стоимости.

um = ureal('m',3,'Percentage',40);
uc = ureal('c',1,'Percentage',20);
uk = ureal('k',2,'Percentage',30);

Номинальная настройка

Сначала настройте ПИД-регулятор для номинальных значений параметров. Здесь мы используем два простых конструктивных требований:

  • Положение$x$ должно отследить ступенчатое изменение с 1 вторым временем отклика

  • Коэффициент фильтра$N$ в ПИД-регуляторе не должен превышать 100.

Эти требования описываются как настраивающиеся цели:

Req1 = TuningGoal.Tracking('r','x',1);
Req2 = TuningGoal.ControllerPoles('Controller',0,0,100);

Создайте slTuner интерфейс для настройки блока "Controller" в модели Simulink и использования systune настроить коэффициенты ПИД и лучше всего удовлетворить эти два требования.

ST0 = slTuner('rct_mass_spring_damper','Controller');

ST = systune(ST0,[Req1 Req2]);
Final: Soft = 1.02, Hard = -Inf, Iterations = 44

Используйте getIOTransfer просмотреть переходной процесс с обратной связью.

Tnom = getIOTransfer(ST,'r','x');
step(Tnom)

Номинальный ответ удовлетворяет требование времени отклика и выглядит хорошим. Но насколько устойчивый это к изменениям$m,c,k$?

Анализ робастности

Чтобы ответить на этот вопрос, используйте "функцию" замены блока slTuner создать неопределенную модель с обратной связью системы массового пружинного демпфера. Блокируйтесь замена позволяет вам задать линеаризацию конкретного блока в модели Simulink. Здесь мы используем это, чтобы заменить четкие значения$m,c,k$ неопределенными значениями um,uc,uk заданный выше.

blocksubs(1).Name = 'rct_mass_spring_damper/Mass';
blocksubs(1).Value = 1/um;
blocksubs(2).Name = 'rct_mass_spring_damper/Damping';
blocksubs(2).Value = uc;
blocksubs(3).Name = 'rct_mass_spring_damper/Spring Stiffness';
blocksubs(3).Value = uk;
UST0 = slTuner('rct_mass_spring_damper','Controller',blocksubs);

Чтобы оценить робастность номинальной настройки, примените настроенные коэффициенты ПИД к (ненастроенной) неопределенной модели UST0 и симулируйте "неопределенный" ответ с обратной связью.

% Apply result of nominal tuning (ST) to uncertain closed-loop model UST0
setBlockValue(UST0,getBlockValue(ST));
Tnom = getIOTransfer(UST0,'r','x');
rng(0), step(Tnom,25), grid

step постройте показывает ответ с обратной связью с номинально настроенным ПИДом для 20 случайным образом выбранных значений$m,c,k$ в указанном диапазоне неопределенности. Наблюдайте значительное ухудшение эффективности для некоторых комбинаций параметра с плохо ослабленными колебаниями и длинным временем урегулирования.

Устойчивая настройка

Чтобы улучшить робастность ПИД-регулятора, повторно настройте его с помощью неопределенной модели UST0 с обратной связью вместо номинальной модели ST0 с обратной связью. Из-за присутствия ureal компоненты в модели, systune автоматически попытки максимизировать эффективность в целой области значений неопределенности. Это составляет минимизацию значения худшего случая "мягких" настраивающих целей Req1 и Req2.

UST0 = slTuner('rct_mass_spring_damper','Controller',blocksubs);

UST = systune(UST0,[Req1 Req2]);
Soft: [1.02,4.9], Hard: [-Inf,-Inf], Iterations = 44
Soft: [1.03,1.41], Hard: [-Inf,-Inf], Iterations = 32
Soft: [1.04,1.04], Hard: [-Inf,-Inf], Iterations = 21
Final: Soft = 1.04, Hard = -Inf, Iterations = 97

Устойчивая эффективность незначительно хуже, чем номинальная эффективность, но та же неопределенная симуляция с обратной связью показывает существенное улучшение по номинальному проекту.

Trob = getIOTransfer(UST,'r','x');
rng(0), step(Tnom,Trob,25), grid
legend('Nominal tuning','Robust tuning')

Это подтверждено путем графического вывода усиления худшего случая от$r$ к$x$ как функция частоты. Отметьте ослабленный резонанс около 1 рад/с.

clf
subplot(121), wcsigmaplot(Tnom,{1e-2,1e2}), grid
set(gca,'YLim',[-20 10]), title('Nominal tuning')
subplot(122), wcsigmaplot(Trob,{1e-2,1e2}), grid
set(gca,'YLim',[-20 10]), title('Robust tuning'), legend('off')

Сравнение этих двух ПИД-регуляторов показывает подобные поведения за исключением одного основного отличия. Номинально настроенный ПИД чрезмерно использует "отмену" (отмечающий) резонанс объекта, который не является устойчивой стратегией в присутствии неопределенности на резонансной частоте.

Cnom = getBlockValue(ST,'Controller');
Crob = getBlockValue(UST,'Controller');
clf, bode(Cnom,Crob), grid
legend('Nominal tuning','Robust tuning')

Для дальнейшего понимания постройте индекс эффективности (максимальное значение "мягких" настраивающих целей Req1,Req2) как функция неопределенных параметров$m,k$ для номинального затухания$c=1$. Используйте "различный параметр" функция slTuner создать массив моделей с обратной связью по сетке$m,k$ значений, покрывающих их области значений неопределенности.

% Specify a 6-by-6 grid of (m,k) values for linearization
ms = linspace(um.Range(1),um.Range(2),6);
ks = linspace(uk.Range(1),uk.Range(2),6);
[ms,ks] = ndgrid(ms,ks);
params(1).Name = 'm';
params(1).Value = ms;
params(2).Name = 'k';
params(2).Value = ks;
STP = slTuner('rct_mass_spring_damper','Controller',params);

% Evaluate performance index over (m,k) grid for nominally tuned PID
setBlockValue(STP,'Controller',Cnom)
[~,F1] = evalGoal(Req1,STP);
[~,F2] = evalGoal(Req2,STP);
Fnom = max(F1,F2);

% Evaluate performance index over (m,k) grid for robust PID
setBlockValue(STP,'Controller',Crob)
[~,F1] = evalGoal(Req1,STP);
[~,F2] = evalGoal(Req2,STP);
Frob = max(F1,F2);

% Compare the two performance surfaces
clf
subplot(211), surf(ms,ks,Fnom)
xlabel('m'), ylabel('k'), zlabel('Performance'), title('Nominal tuning (c=1)')
subplot(212), surf(ms,ks,Frob), set(gca,'ZLim',[1 2])
xlabel('m'), ylabel('k'), zlabel('Performance'), title('Robust tuning (c=1)')

Этот график показывает, что номинальная настройка очень чувствительна к изменениям в массовой$m$ или пружинной жесткости$k$, в то время как устойчивая настройка чрезвычайно нечувствительна к этим параметрам. Чтобы завершить проект, используйте writeBlockValue применять устойчивые коэффициенты ПИД к модели Simulink и возобновлять дальнейшую валидацию в Simulink.

writeBlockValue(UST)

Связанные примеры

Больше о