Этот пример показывает, как реализовать нечеткую систему вывода для нелинейного управления ПИДом с помощью 2D блока Lookup Table.
Нечеткая система вывода (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);
Вы также реализуете нечеткую систему вывода с помощью 2D интерполяционной таблицы, которая аппроксимирует поверхность управления и достигает той же производительности управления.
Нечеткий контроллер в этом примере находится в обратной связи и вычисляет подобные ИЗОДРОМНОМУ с предварением действия с помощью нечеткого вывода. Откройте модель 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
). Поэтому можно заменить нечеткую систему с помощью 2D интерполяционной таблицы.
Сгенерировать 2D интерполяционную таблицу от вашего 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
Просмотрите нечеткий ПИД-регулятор с помощью 2D интерполяционной таблицы.
open_system('sllookuptable/Fuzzy PID using Lookup Table')
Единственная разница по сравнению с Нечетким ПИД-регулятором - то, что блок Fuzzy Logic Controller заменяется 2D блоком Lookup Table.
Когда поверхность управления линейна, нечеткий ПИД-регулятор с помощью 2D интерполяционной таблицы приводит к тому же результату как одно использование блока 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%. Эти две кривые отклика от нелинейных нечетких диспетчеров почти накладываются, который указывает, что 2D интерполяционная таблица аппроксимирует нечеткую систему хорошо.
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.