В этом примере показано, как надежно настроить ПИД-регулятор для неопределенной системы массового пружинного демпфера, смоделированной в Simulink.
Массовый пружинный демпфер, изображенный в рисунке 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)