В этом примере показано, как реализовать нечеткую систему вывода для нелинейного управления ПИДом с помощью блока двумерной интерполяционной таблицы.
Нечеткая система вывода (FIS) сопоставляет данные входные параметры с выходными параметрами с помощью нечеткой логики. Например, типичное отображение 2D входа, нечеткий контроллер с одним выходом может быть изображен в 3-D графике. График часто упоминается как объемная поверхностная диаграмма управления.
Для приложений управления типичные входные параметры FIS являются ошибкой (e(k)
) и изменение ошибки (e(k)-e(k-1)
E
и CE
соответственно в объемной поверхностной диаграмме управления. FIS выход является действием управления, выведенным из нечетких правил, u
в объемной поверхностной диаграмме. Fuzzy Logic Toolbox™ обеспечивает команды и приложения для разработки FIS для желаемой поверхности управления. Можно затем симулировать спроектированный FIS использование блока Fuzzy Logic Controller в Simulink®.
Можно часто аппроксимировать нелинейные поверхности управления с помощью интерполяционных таблиц, чтобы упростить сгенерированный код и улучшить скорость выполнения. Например, можно заменить блок Fuzzy Logic Controller в Simulink с набором блоков Интерполяционной таблицы, одной таблицы для каждого выхода, заданного в FIS. Можно вычислить данные, используемые в интерполяционной таблице с помощью evalfis
команда.
В данном примере вы проектируете нелинейный нечеткий ПИД-регулятор для объекта в Simulink. Объект является одно входом, системой одно выхода в дискретное время. Цель проекта состоит в том, чтобы достигнуть хорошей эффективности отслеживания уставки.
Ts = 0.1; Plant = c2d(zpk([],[-1 -3 -5],1),Ts);
Вы также реализуете нечеткую систему вывода с помощью двумерной интерполяционной таблицы, которая аппроксимирует поверхность управления и достигает той же эффективности управления.
Нечеткий контроллер в этом примере находится в обратной связи и вычисляет подобные ИЗОДРОМНОМУ с предварением действия с помощью нечеткого вывода. Откройте модель Simulink.
open_system('sllookuptable')
Нечеткий ПИД-регулятор использует параллельную структуру как показано в Нечеткой подсистеме ПИДа. Для получения дополнительной информации см. [1]. Контроллер является комбинацией нечеткого управления PI и нечеткого управления PD.
open_system('sllookuptable/Fuzzy PID')
Нечеткий ПИД-регулятор использует изменение выхода -(y(k)-y(k-1))
, вместо изменения ошибки e(k)-e(k-1)
, как второй входной сигнал к FIS. Выполнение так предотвращает ступенчатое изменение в опорном сигнале от прямого инициирования производного действия. Два блока усиления, GCE
и GCU
, в канале передают путь от r
к u
, гарантируйте что сигнал ошибки e
используется в пропорциональном действии, когда нечеткий ПИД-регулятор линеен.
Обычный ПИД-регулятор в этом примере является ПИД-регулятором в дискретном времени с Обратным Эйлеровым численным интегрированием и в интегральных и в производных действиях. Усилениями контроллера является Kp
, Ki
, и Kd
.
open_system('sllookuptable/Conventional PID')
Подобно нечеткому ПИД-регулятору входным сигналом к производному действию является -y(k)
, вместо e(k)
.
Можно настроить усиления ПИД-регулятора вручную или использующий настраивающиеся формулы. В этом примере получите первоначальный проект ПИДа с помощью pidtune
команда от Control System Toolbox™.
Задайте структуру ПИДа, настройте контроллер и извлеките коэффициенты ПИД.
C0 = pid(1,1,1,'Ts',Ts,'IF','B','DF','B'); C = pidtune(Plant,C0) [Kp,Ki,Kd] = piddata(C);
C = Ts*z z-1 Kp + Ki * ------ + Kd * ------ z-1 Ts*z with Kp = 30.6, Ki = 25.2, Kd = 9.02, Ts = 0.1 Sample time: 0.1 seconds Discrete-time PID controller in parallel form.
Путем конфигурирования FIS и выбора этих четырех масштабных коэффициентов, можно получить линейный нечеткий ПИД-регулятор, который воспроизводит эффективность управления обычного ПИД-регулятора.
Во-первых, сконфигурируйте нечеткую систему вывода так, чтобы она создала линейную поверхность управления от входных параметров E
и CE
к выходу u
. Настройки FIS основаны на проектных решениях, описанных в [2]:
Используйте нечеткую систему вывода стиля Sugeno с методами вывода по умолчанию.
Нормируйте области значений обоих входных параметров к [-10 10].
Используйте треугольные входные функции принадлежности, которые перекрывают их соседние функции в значении членства 0,5.
Используйте выходную область значений [-20 20].
Используйте постоянные выходные функции принадлежности.
Создайте нечеткую систему вывода.
FIS = sugfis;
Задайте входную переменную E
.
FIS = addInput(FIS,[-10 10],'Name','E'); FIS = addMF(FIS,'E','trimf',[-20 -10 0],'Name','Negative'); FIS = addMF(FIS,'E','trimf',[-10 0 10],'Name','Zero'); FIS = addMF(FIS,'E','trimf',[0 10 20],'Name','Positive');
Вход Define CE
.
FIS = addInput(FIS,[-10 10],'Name','CE'); FIS = addMF(FIS,'CE','trimf',[-20 -10 0],'Name','Negative'); FIS = addMF(FIS,'CE','trimf',[-10 0 10],'Name','Zero'); FIS = addMF(FIS,'CE','trimf',[0 10 20],'Name','Positive');
Задайте выходную переменную u
с constant
функции принадлежности.
FIS = addOutput(FIS,[-20 20],'Name','u'); FIS = addMF(FIS,'u','constant',-20,'Name','LargeNegative'); FIS = addMF(FIS,'u','constant',-10,'Name','SmallNegative'); FIS = addMF(FIS,'u','constant',0,'Name','Zero'); FIS = addMF(FIS,'u','constant',10,'Name','SmallPositive'); FIS = addMF(FIS,'u','constant',20,'Name','LargePositive');
Задайте следующие нечеткие правила:
Если E
отрицательно и CE
отрицательно, затем u
-20
.
Если E
отрицательно и CE
нуль, затем u
-10
.
Если E
отрицательно и CE
положительно затем u
0
.
Если E
нуль и CE
отрицательно, затем u
-10
.
Если E
нуль и CE
нуль, затем u
0
.
Если E
нуль и CE
положительно, затем u
10
.
Если E
положительно и CE
отрицательно, затем u
0
.
Если E
положительно и CE
нуль, затем u
10
.
Если E
положительно и CE
положительно, затем u
20
.
ruleList = [1 1 1 1 1; % Rule 1 1 2 2 1 1; % Rule 2 1 3 3 1 1; % Rule 3 2 1 2 1 1; % Rule 4 2 2 3 1 1; % Rule 5 2 3 4 1 1; % Rule 6 3 1 3 1 1; % Rule 7 3 2 4 1 1; % Rule 8 3 3 5 1 1]; % Rule 9 FIS = addRule(FIS,ruleList);
В то время как вы реализуете свой FIS из командной строки в этом примере, можно альтернативно создать FIS использование приложения Fuzzy Logic Designer.
Постройте линейную поверхность управления.
gensurf(FIS)
Определите масштабные коэффициенты GE
, GCE
, GCU
, и GU
от Kp
, Ki
, и Kd
усиления обычным ПИД-регулятором. Сравнивая выражения традиционного ПИДа и линейного нечеткого ПИДа, переменные связаны можно следующим образом:
Kp
= GCU
* GCE
+ GU
* GE
Ki
= GCU
* GE
Kd
= GU
* GCE
Примите, что максимальным ссылочным шагом является 1
, и таким образом максимальная погрешность e
1
. Начиная с входного диапазона E
[-10 10], установите GE
к 10
. Можно затем решить для GCE
, GCU
, и GU
.
GE = 10; GCE = GE*(Kp-sqrt(Kp^2-4*Ki*Kd))/2/Ki; GCU = Ki/GE; GU = Kd/GCE;
Нечеткий блок контроллера имеет два входных параметров (E
и CE
) и один выход (u
). Поэтому можно заменить нечеткую систему с помощью двумерной интерполяционной таблицы.
Сгенерировать двумерную интерполяционную таблицу от вашего FIS, цикла через входную вселенную, и вычислить соответствующие выходные значения с помощью evalfis
. Поскольку поверхность управления линейна, можно использовать несколько точек выборки для каждой входной переменной.
Step = 10; E = -10:Step:10; CE = -10:Step:10; N = length(E); LookUpTableData = zeros(N); for i=1:N for j=1:N % Compute output u for each combination of sample points. LookUpTableData(i,j) = evalfis(FIS,[E(i) CE(j)]); end end
Просмотрите нечеткий ПИД-регулятор с помощью двумерной интерполяционной таблицы.
open_system('sllookuptable/Fuzzy PID using Lookup Table')
Единственная разница по сравнению с Нечетким ПИД-регулятором - то, что блок Fuzzy Logic Controller заменяется блоком двумерной интерполяционной таблицы.
Когда поверхность управления линейна, нечеткий ПИД-регулятор с помощью двумерной интерполяционной таблицы приводит к тому же результату как одно использование блока Fuzzy Logic Controller.
Модель Simulink симулирует три различных подсистемы контроллера, а именно, Обычный ПИД, Нечеткий ПИД, и Нечеткий ПИД с помощью Интерполяционной таблицы, чтобы управлять тем же объектом.
Запустите симуляцию. Чтобы сравнить ответы с обратной связью на изменение ссылки шага, откройте осциллограф. Как ожидалось все три контроллера приводят к тому же результату.
sim('sllookuptable') open_system('sllookuptable/Scope')
Если у вас есть линейный нечеткий ПИД-регулятор, можно получить нелинейную поверхность управления путем корректировки настроек FIS, таких как его стиль, функции принадлежности, и управлять основой.
В данном примере спроектируйте крутую поверхность управления использование Sugeno-типа FIS. Каждый входной набор имеет два условия (Positive
и Negative
), и количество правил сокращено к четыре.
Создайте FIS.
FIS = sugfis;
Вход Define E
.
FIS = addInput(FIS,[-10 10],'Name','E'); FIS = addMF(FIS,'E','gaussmf',[7 -10],'Name','Negative'); FIS = addMF(FIS,'E','gaussmf',[7 10],'Name','Positive');
Вход Define CE
.
FIS = addInput(FIS,[-10 10],'Name','CE'); FIS = addMF(FIS,'CE','gaussmf',[7 -10],'Name','Negative'); FIS = addMF(FIS,'CE','gaussmf',[7 10],'Name','Positive');
Выход Define u
.
FIS = addOutput(FIS,[-20 20],'Name','u'); FIS = addMF(FIS,'u','constant',-20,'Name','Min'); FIS = addMF(FIS,'u','constant',0,'Name','Zero'); FIS = addMF(FIS,'u','constant',20,'Name','Max');
Задайте следующие правила:
Если E
отрицательно и CE
отрицательно, затем u
-20
.
Если E
отрицательно и CE
положительно, затем u
0
.
Если E
положительно и CE
отрицательно, затем u
0
.
Если E
положительно и CE
положительно, затем u
20
.
ruleList = [1 1 1 1 1;... % Rule 1 1 2 2 1 1;... % Rule 2 2 1 2 1 1;... % Rule 3 2 2 3 1 1]; % Rule 4 FIS = addRule(FIS,ruleList);
Просмотрите 3-D нелинейную поверхность управления. Эта поверхность имеет более высокое усиление около центра E
и CE
плоскость, чем линейная поверхность имеет, который помогает уменьшать ошибку более быстро, когда ошибка мала. Когда ошибка является большой, контроллер становится менее агрессивным, чтобы избежать возможного насыщения.
gensurf(FIS)
Прежде, чем запустить симуляцию, обновите интерполяционную таблицу с новыми данными о поверхности управления. Поскольку поверхность нелинейна, чтобы получить достаточное приближение, добавить более точки выборки.
Step = 1; E = -10:Step:10; CE = -10:Step:10; N = length(E); LookUpTableData = zeros(N); for i=1:N for j=1:N % Compute output u for each combination of sample points. LookUpTableData(i,j) = evalfis(FIS,[E(i) CE(j)]); end end
Запустите симуляцию.
sim('sllookuptable')
По сравнению с традиционным линейным ПИД-регулятором (кривая отклика с большим перерегулированием), нелинейный нечеткий ПИД-регулятор уменьшает перерегулирование на 50%. Эти две кривые отклика от нелинейных нечетких диспетчеров почти перекрываются, который указывает, что двумерная интерполяционная таблица аппроксимирует нечеткую систему хорошо.
bdclose('sllookuptable') % Closing model also clears its workspace variables.
Можно аппроксимировать нелинейный нечеткий ПИД-регулятор с помощью интерполяционной таблицы. Заменяя блок Fuzzy Logic Controller на Интерполяционную таблицу блокируется в Simulink, можно развернуть нечеткий контроллер с упрощенным сгенерированным кодом и улучшенной скоростью выполнения.
[1] Сюй, J. X., Висите, C. C. Лю, C. "Параллельная структура и настройка нечеткого ПИД-регулятора". Automatica, Издание 36, стр 673-684. 2000.
[2] Jantzen, J. Настраиваясь нечетких ПИД-регуляторов, технического отчета, отдела автоматизации, Датского технического университета. 1999.