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

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

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

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

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

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

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

open_system('rct_mass_spring_damper')

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

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

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

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

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

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

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

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

  • Коэффициент фильтра в ПИД-регуляторе не должен превышать 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)

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

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

Чтобы ответить на этот вопрос, используйте "функцию" замены блока slTuner создать неопределенную модель с обратной связью системы массового пружинного демпфера. Блокируйтесь замена позволяет вам задать линеаризацию конкретного блока в модели Simulink. Здесь мы используем это, чтобы заменить четкие значения неопределенными значениями 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 случайным образом выбранных значений в указанном диапазоне неопределенности. Наблюдайте значительное ухудшение производительности для некоторых комбинаций параметра с плохо ослабленными колебаниями и длинным временем урегулирования.

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

Чтобы улучшить робастность ПИД-регулятора, повторно настройте его с помощью неопределенной модели 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.39], Hard: [-Inf,-Inf], Iterations = 32
Soft: [1.04,1.04], Hard: [-Inf,-Inf], Iterations = 22
Final: Soft = 1.04, Hard = -Inf, Iterations = 98

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

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

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

clf
subplot(121), wcsigma(Tnom,{1e-2,1e2}), grid
set(gca,'YLim',[-20 10]), title('Nominal tuning')
subplot(122), wcsigma(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) как функция неопределенных параметров для номинального затухания. Используйте "различный параметр" функция slTuner создать массив моделей с обратной связью по сетке значений, покрывающих их области значений неопределенности.

% 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)')

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

writeBlockValue(UST)

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

Больше о