Этот пример сравнивает нечеткий ПИД-регулятор типа 2 как с нечетким ПИД-регулятором типа 1, так и с обычным ПИД-регулятором. Этот пример адаптирован к [1].
Этот пример использует следующую структуру нечеткого логического контроллера (FLC), как описано в [1]. Значение выхода контроллера () обнаруживается с помощью ошибки () и производную ошибки (). Использование коэффициентов масштабирования и , входы и нормированы к и , соответственно. Нормированные области значений для обоих входов находятся в области значений [-1,1]. Нечеткий логический контроллер также выдает нормированный выход в области значений [-1,1]. Дополнительные коэффициенты масштабирования и сопоставить нечеткую логику контроллер выхода в .
Этот пример использует систему первого порядка с задержкой как модель объекта управления.
Вот, , , и являются коэффициентом усиления, временной задержкой и постоянной времени, соответственно.
Коэффициенты масштабирования , , и определяются следующим образом, где является временной константой замкнутого контура.
Входной коэффициент масштабирования является:
где и являются значениями ссылки и системных выходов в то время . Эти значения соответствуют номинальной рабочей точке системы.
Этот пример сравнивает эффективность систем нечеткого вывода (FIS) типа 1 и типа 2 Sugeno с использованием блока Fuzzy Logic Controller Simulink ®.
Создайте FIS типа 1 с помощью sugfis
.
fis1 = sugfis;
Добавьте входные переменные к FIS.
fis1 = addInput(fis1,[-1 1],'Name','E'); fis1 = addInput(fis1,[-1 1],'Name','delE');
Добавьте три равномерно распределенных перекрывающихся треугольных функции принадлежности (MFs) к каждому входу. Имена MF обозначаются как отрицательные (N
), нуль (Z
), и положительный (P
).
fis1 = addMF(fis1,'E','trimf',[-2 -1 0],'Name','N'); fis1 = addMF(fis1,'E','trimf',[-1 0 1],'Name','Z'); fis1 = addMF(fis1,'E','trimf',[0 1 2],'Name','P'); fis1 = addMF(fis1,'delE','trimf',[-2 -1 0],'Name','N'); fis1 = addMF(fis1,'delE','trimf',[-1 0 1],'Name','Z'); fis1 = addMF(fis1,'delE','trimf',[0 1 2],'Name','P');
Постройте график входа функций принадлежности.
figure subplot(1,2,1) plotmf(fis1,'input',1) title('Input 1') subplot(1,2,2) plotmf(fis1,'input',2) title('Input 2')
Добавьте выходную переменную к FIS.
fis1 = addOutput(fis1,[-1 1],'Name','U');
Добавьте равномерно распределенные constant
функций к выходу. Имена MF обозначаются как отрицательные большие (NB
), отрицательная среда (NM
), нуль (Z
), положительная среда (PM
), и положительный большой (PB
).
fis1 = addMF(fis1,'U','constant',-1,'Name','NB'); fis1 = addMF(fis1,'U','constant',-0.5,'Name','NM'); fis1 = addMF(fis1,'U','constant',0,'Name','Z'); fis1 = addMF(fis1,'U','constant',0.5,'Name','PM'); fis1 = addMF(fis1,'U','constant',1,'Name','PB');
Добавьте правила к FIS. Эти правила создают пропорциональную управляющую поверхность.
rules = [... "E==N & delE==N => U=NB"; ... "E==Z & delE==N => U=NM"; ... "E==P & delE==N => U=Z"; ... "E==N & delE==Z => U=NM"; ... "E==Z & delE==Z => U=Z"; ... "E==P & delE==Z => U=PM"; ... "E==N & delE==P => U=Z"; ... "E==Z & delE==P => U=PM"; ... "E==P & delE==P => U=PB" ... ]; fis1 = addRule(fis1,rules);
Постройте график поверхности управления.
figure
gensurf(fis1)
title('Control surface of type-1 FIS')
Преобразуйте FIS типа 1, fis1
, к FIS типа 2.
fis2 = convertToType2(fis1);
Система Sugeno 2 типа fis2
, использует функции принадлежности типа 2 для входных переменных и функции принадлежности типа 1 для выходных переменных.
Определите площадь неопределенности (FOU) для входа MF, как определено в [1]. Для этого установите более низкий коэффициент масштабирования MF для каждого MF. В данном примере установите более низкие значения задержки MF равными 0
.
scale = [0.2 0.9 0.2;0.3 0.9 0.3]; for i = 1:length(fis2.Inputs) for j = 1:length(fis2.Inputs(i).MembershipFunctions) fis2.Inputs(i).MembershipFunctions(j).LowerLag = 0; fis2.Inputs(i).MembershipFunctions(j).LowerScale = scale(i,j); end end
Постройте график входных функций типа 2.
figure subplot(1,2,1) plotmf(fis2,'input',1) title('Input 1') subplot(1,2,2) plotmf(fis2,'input',2) title('Input 2')
FOU добавляет FIS дополнительную неопределенность и создает нелинейную поверхность управления.
figure
gensurf(fis2)
title('Control surface of type-2 FIS')
Этот пример сравнивает эффективность нечеткого логического контроллера с контроллерами следующих обычных ПИД-регуляторов.
Вот, - пропорциональная составляющая, - коэффициент усиления интегратора, является производным усилением, и - производная временная константа фильтра.
Определите номинальную модель объекта управления.
C = 0.5;
L = 0.5;
T = 0.5;
G = tf(C,[T 1],'Outputdelay',L);
Сгенерируйте параметры обычного ПИД-регулятора, используя pidtune
.
pidController = pidtune(G,'pidf');
В этом примере ссылка ( является шаговым сигналом и , что приводит к следующим образом.
=1.
Ce = 1;
Чтобы сконфигурировать симуляцию, используйте следующие номинальные параметры контроллера.
tauC = 0.2; Cd = min(T,L/2)*Ce; C0 = 1/(C*Ce*(tauC+L/2)); C1 = max(T,L/2)*C0;
Чтобы симулировать контроллеры, используйте comparepidcontrollers
Модель Simulink.
model = 'comparepidcontrollers';
load_system(model)
Моделируйте модель в номинальных рабочих условиях.
out1 = sim(model);
Постройте график переходной характеристики системы для всех трех контроллеров.
plotOutput(out1,['Nominal: C=' num2str(C) ', L=' num2str(L) ', T=' num2str(T)])
Получите характеристики переходной характеристики системы для каждого контроллера.
stepResponseTable(out1)
ans=3×4 table
Rise Time (sec) Overshoot (%) Settling Time (sec) Integral of Absolute Error
_______________ _____________ ___________________ __________________________
PID 0.62412 11.234 4.5564 1.04
Type-1 FLC 1.4267 0 4.1023 1.1522
Type-2 FLC 1.8662 0 5.129 1.282
Для номинального процесса:
Как нечеткие логические контроллеры типа 1, так и типа 2 превосходят обычные ПИД-регуляторы с точки зрения перерегулирования.
Обычный ПИД-регулятор работает лучше в отношении времени нарастания и интеграла абсолютной ошибки (IAE).
FLC типа 1 работает лучше, чем FLC типа 2, с точки зрения времени нарастания, времени урегулирования и IAE.
Измените модель объекта управления путем увеличения коэффициента усиления, временной задержки и значений временных констант по сравнению с номинальным процессом.
C = 0.85;
L = 0.6;
T = 0.6;
G = tf(C,[T 1],'Outputdelay',L);
Моделируйте модель с помощью обновленных параметров объекта управления.
out2 = sim(model);
Постройте график переходной характеристики системы для всех трех контроллеров.
plotOutput(out2,['Modified 1: C=' num2str(C) ',L=' num2str(L) ',T=' num2str(T)])
Получите характеристики переходной характеристики системы для каждого контроллера.
stepResponseTable(out2)
ans=3×4 table
Rise Time (sec) Overshoot (%) Settling Time (sec) Integral of Absolute Error
_______________ _____________ ___________________ __________________________
PID 0.38464 80.641 29.452 4.7486
Type-1 FLC 0.47262 24.877 4.6788 1.1137
Type-2 FLC 0.47262 22.787 3.4561 1.076
Для этого измененного процесса:
Обычный ПИД-регулятор показывает значительное перерегулирование, большие времена урегулирования и более высокую IAE по сравнению с нечеткими логическими контроллерами
Для всех показателей эффективности FLC типа 2 обеспечивает то же или наилучшее решение по сравнению с FLC типа 1.
В целом FLC типа 1 обеспечивает наилучшее решение для номинального объекта по сравнению с обычным ПИД-регулятором. FLC типа 2 показывает более устойчивую эффективность для модифицированного объекта.
Робастность обычных ПИД-регуляторов может быть улучшена с помощью различных способов, таких как предсказание или несколько ПИД-регулятор строений. С другой стороны, эффективность FLC 2 типа может быть улучшена при использовании другого:
Основа правил
Количество правил
FOU
Для примера можно создать FLC типа 2, который задает FOU с помощью как нижнего коэффициента масштабирования MF, так и более низкой задержки MF.
Для fis2
установите нижнюю шкалу MF и значения задержки равными 0.7
и 0.1
, соответственно для всех входных функций членства.
for i = 1:length(fis2.Inputs) for j = 1:length(fis2.Inputs(i).MembershipFunctions) fis2.Inputs(i).MembershipFunctions(j).LowerScale = 0.7; fis2.Inputs(i).MembershipFunctions(j).LowerLag = 0.1; end end
Постройте график обновленных функций членства.
figure subplot(1,2,1) plotmf(fis2,'input',1) title('Input 1') subplot(1,2,2) plotmf(fis2,'input',2) title('Input 2')
Симулируйте модель с помощью номинального объекта управления и постройте график переходных характеристик для контроллеров.
C = 0.5; L = 0.5; T = 0.5; G = tf(C,[T 1],'Outputdelay',L); out4 = sim(model); close_system(model,0) plotOutput(out4,['Nominal: C=' num2str(C) ', L=' num2str(L) ', T=' num2str(T)])
Получите характеристики переходной характеристики системы для каждого контроллера.
stepResponseTable(out4)
ans=3×4 table
Rise Time (sec) Overshoot (%) Settling Time (sec) Integral of Absolute Error
_______________ _____________ ___________________ __________________________
PID 0.62412 11.234 4.5564 1.04
Type-1 FLC 1.4267 0 4.1023 1.1522
Type-2 FLC 1.2179 0 3.8746 1.1087
В этом случае обновленный FOU FLC типа 2 улучшает время нарастания реакции шага.
Однако более низкие значения задержки MF также увеличивают перерегулирование в случае модифицированного объекта.
C = 0.85; L = 0.6; T = 0.6; G = tf(C,[T 1],'Outputdelay',L); out5 = sim(model); plotOutput(out5,['Nominal: C=' num2str(C) ', L=' num2str(L) ', T=' num2str(T)])
stepResponseTable(out5)
ans=3×4 table
Rise Time (sec) Overshoot (%) Settling Time (sec) Integral of Absolute Error
_______________ _____________ ___________________ __________________________
PID 0.38464 80.641 29.452 4.7486
Type-1 FLC 0.47262 24.877 4.6788 1.1137
Type-2 FLC 0.47262 26.699 4.6812 1.1278
Поэтому для получения желаемых характеристик переходной характеристики можно варьировать более низкие значения шкалы MF и задержки, чтобы найти подходящую комбинацию.
Можно дополнительно улучшить нечеткую логику контроллер выходов используя FIS типа Mamdani, поскольку он также обеспечивает более низкую шкалу MF и параметры задержки для функций выхода принадлежности. Однако FLC типа 2 Mamdani вводит дополнительную вычислительную задержку из-за дорогостоящего процесса сокращения типа.
[1] Мендель, Дж. М., Неопределенные нечеткие системы на основе правил: Введение и новые направления, Второе издание, Springer, 2017, pp. 229-234, 600-608.
function plotOutput(out,plotTitle) figure plot([0 20],[1 1]) hold on plot(out.yout{1}.Values) plot(out.yout{2}.Values) plot(out.yout{3}.Values) hold off grid minor xlabel('Time (sec)') ylabel('Output') title(plotTitle) legend(["Reference","PID","Type-1 FLC","Type-2 FLC"],'Location',"best") end
function t = stepResponseTable(out) s = stepinfo(out.yout{1}.Values.Data,out.yout{1}.Values.Time); stepResponseInfo(1).RiseTime = s.RiseTime; stepResponseInfo(1).Overshoot = s.Overshoot; stepResponseInfo(1).SettlingTime = s.SettlingTime; stepResponseInfo(1).IAE = out.yout{4}.Values.Data(end); s = stepinfo(out.yout{2}.Values.Data,out.yout{2}.Values.Time); stepResponseInfo(2).RiseTime = s.RiseTime; stepResponseInfo(2).Overshoot = s.Overshoot; stepResponseInfo(2).SettlingTime = s.SettlingTime; stepResponseInfo(2).IAE = out.yout{5}.Values.Data(end); s = stepinfo(out.yout{3}.Values.Data,out.yout{3}.Values.Time); stepResponseInfo(3).RiseTime = s.RiseTime; stepResponseInfo(3).Overshoot = s.Overshoot; stepResponseInfo(3).SettlingTime = s.SettlingTime; stepResponseInfo(3).IAE = out.yout{6}.Values.Data(end); t = struct2table(stepResponseInfo,"RowNames",["PID" "Type-1 FLC" "Type-2 FLC"]); t.Properties.VariableNames{1} = 'Rise Time (sec)'; t.Properties.VariableNames{2} = [t.Properties.VariableNames{2} ' (%)']; t.Properties.VariableNames{3} = 'Settling Time (sec)'; t.Properties.VariableNames{4} = 'Integral of Absolute Error'; end