Этот пример показывает, как осуществить нечеткую систему вывода для нелинейного контроля за PID, используя 2-й блок Справочной таблицы.
Система нечеткого вывода (FIS) отображает заданные входы на выходы с использованием нечеткой логики. Например, типичное отображение контроллера нечеткости с двумя входами и одним выходом может быть изображено на графике 3-D. График часто называют графиком управляющей поверхности.

Для управляющих приложений типичными входами FIS являются ошибки (e(k)) и изменение погрешности (e(k)-e(k-1)), E и CE соответственно на графике управляющей поверхности. Выходной сигнал FIS представляет собой управляющее действие, выведенное из нечетких правил. u на графике поверхности. Fuzzy Logic Toolbox™ предоставляет команды и приложения для разработки FIS для требуемой поверхности управления. Затем можно смоделировать проектируемую FIS с помощью блока контроллера нечеткой логики в Simulink ®.
Часто нелинейные управляющие поверхности можно аппроксимировать с помощью таблиц поиска, чтобы упростить созданный код и повысить скорость выполнения. Например, можно заменить блок контроллера нечеткой логики в Simulink набором блоков таблицы поиска, по одной таблице для каждого вывода, определенного в FIS. Можно вычислить данные, используемые в таблице подстановки, с помощью evalfis команда.
В этом примере для завода Simulink создается нелинейный нечеткий PID-контроллер. Установка представляет собой систему с одним входом и одним выходом в дискретное время. Целью проектирования является достижение хорошей производительности отслеживания ссылок.
Ts = 0.1; Plant = c2d(zpk([],[-1 -3 -5],1),Ts);
Система нечеткого вывода также реализуется с помощью таблицы поиска 2-D, которая аппроксимирует поверхность управления и достигает той же производительности управления.
Нечеткий контроллер в этом примере находится в контуре обратной связи и вычисляет PID-подобные действия, используя нечеткий вывод. Откройте модель Simulink.
open_system('sllookuptable')

Контроллер нечеткого PID использует параллельную структуру, как показано в подсистеме нечеткого PID. Для получения дополнительной информации см. [1]. Контроллер представляет собой комбинацию нечеткого управления PI и нечеткого управления PD.
open_system('sllookuptable/Fuzzy PID')

Контроллер нечеткого PID использует изменение выходного сигнала -(y(k)-y(k-1)), вместо изменения ошибки e(k)-e(k-1), в качестве второго входного сигнала в FIS. Это предотвращает прямое инициирование производного действия ступенчатым изменением опорного сигнала. Два блока усиления, GCE и GCU, в прямом пути подачи от r кому u, убедитесь, что сигнал ошибки e используется в пропорциональном действии, когда контроллер нечеткого PID является линейным.
Обычный ПИД-контроллер в этом примере представляет собой ПИД-контроллер дискретного времени с числовым интегрированием обратного Эйлера как в интегральном, так и в производном действии. Коэффициент усиления контроллера: Kp, Ki, и Kd.
open_system('sllookuptable/Conventional PID')

Аналогично нечеткому PID-контроллеру, входной сигнал для действия производной равен -y(k), вместо e(k).
Можно настроить усиление контроллера PID вручную или с помощью формул настройки. В этом примере получите начальную конструкцию PID с помощью pidtune от Toolbox™ системы управления.
Определите структуру PID, настройте контроллер и извлеките прирост PID.
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 и выбора четырех коэффициентов масштабирования можно получить линейный нечеткий PID-контроллер, который воспроизводит управляющие характеристики обычного PID-контроллера.
Сначала настройте систему нечеткого вывода таким образом, чтобы она создавала линейную управляющую поверхность из входных данных. E и CE производить u. Настройки FIS основаны на вариантах конструкции, описанных в [2]:
Используйте систему нечеткого вывода в стиле Сугено с методами вывода по умолчанию.
Нормализуйте диапазоны обоих входов до [-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');
Определение входных данных 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 усиления обычным ПИД-контроллером. Сравнивая выражения традиционного PID и линейного нечеткого PID, переменные связаны следующим образом:
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). Поэтому нечеткую систему можно заменить с помощью таблицы поиска 2-D.
Чтобы сгенерировать таблицу поиска 2-D из 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
Просмотрите нечеткий PID-контроллер 2-D помощью таблицы подстановки.
open_system('sllookuptable/Fuzzy PID using Lookup Table')

Единственная разница по сравнению с Нечетким диспетчером PID - то, что Нечеткий Логический блок Диспетчера заменен 2-м блоком Справочной таблицы.
Когда поверхность управления является линейной, контроллер нечеткого PID, использующий таблицу поиска 2-D, дает тот же результат, что и контроллер нечеткого логического контроллера.
Модель Simulink моделирует три различные подсистемы контроллера, а именно обычный PID, нечеткий PID и нечеткий PID, используя таблицу поиска, для управления одной и той же установкой.
Запустите моделирование. Чтобы сравнить отклики замкнутого цикла с изменением ссылки на шаг, откройте область. Как и ожидалось, все три контроллера дают одинаковый результат.
sim('sllookuptable') open_system('sllookuptable/Scope')

После создания линейного контроллера с нечетким PID можно получить нелинейную управляющую поверхность путем настройки параметров FIS, таких как стиль, функции членства и база правил.
Для этого примера создайте крутую контрольную поверхность с использованием FIS типа Sugeno. Каждый входной набор имеет два члена (Positive и Negative), и количество правил сокращается до четырех.
Создайте FIS.
FIS = sugfis;
Определение входных данных 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');
Определение входных данных 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');
Определение выходных данных 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%. Две кривые отклика от нелинейных нечетких контроллеров почти перекрываются, что указывает на то, что таблица поиска 2-D хорошо аппроксимирует нечеткую систему.
bdclose('sllookuptable') % Closing model also clears its workspace variables.
Нелинейный нечеткий контроллер PID можно аппроксимировать с помощью таблицы подстановки. Заменяя блок контроллера нечеткой логики блоками таблицы поиска в Simulink, можно развернуть контроллер нечеткой логики с упрощенным генерируемым кодом и улучшенной скоростью выполнения.
[1] Xu, J. X., Hang, C. C., Liu, C. «Параллельная структура и настройка нечеткого PID-контроллера». Automatica, том 36, стр. 673-684. 2000.
[2] Янтцен, J. Tuning of Fuzzy PID Controllers, Технический отчет, отдел автоматизации, Технический университет Дании. 1999.