Этот пример показов, как надежно настроить ПИД-регулятор для неопределенной системы масса-пружина-демпфер, смоделированной в Simulink.
Масса-пружина-демпфер, изображенный на фигуре 1, моделируется дифференциальным уравнением второго порядка
где - сила, приложенная к массе, и горизонтальное положение массы.
Фигура 1: Система масса-пружина-демпфер.
Эта система моделируется в 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
The 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.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')
Это подтверждается построением графика усиления в худшем случае от до как функции частоты. Обратите внимание на ослабленный резонанс около 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
) как функция неопределенных параметров для номинального демпфирования. Используйте функцию «Переменный параметр» 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)