Устойчивая настройка системы Массового Демпфера 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.41], Hard: [-Inf,-Inf], Iterations = 44
Soft: [1.03,1.4], Hard: [-Inf,-Inf], Iterations = 31
Soft: [1.04,1.04], Hard: [-Inf,-Inf], Iterations = 21
Final: Soft = 1.04, Hard = -Inf, Iterations = 96

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

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)

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

Больше о