Устойчивая настройка системы масса-пружина-демпфер

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

Simulink Модель системы Масса-Пружина-Демпфер

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

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

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

Фигура 1: Система масса-пружина-демпфер.

Эта система моделируется в 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

The 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)

Похожие примеры

Подробнее о