Этот пример показов, как реализовать систему нечеткого вывода для нелинейного управления ПИД с помощью блока двумерной интерполяционной таблицы.
Система нечеткого вывода (FIS) преобразует заданные входы в выходы с помощью нечеткой логики. Для примера типичное отображение нечеткого контроллера с двумя входами, с одним выходом может быть изображено на 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')
Нечеткий ПИД-регулятор использует параллельную структуру, как показано на подсистеме Fuzzy PID. Для получения дополнительной информации см. раздел [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');
Задайте входные 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 заключается в том, что блок Fuzzy Logic Controller заменяется блоком двумерная интерполяционная таблица.
Когда поверхность управления линейна, нечеткий ПИД-регулятор, использующая двумерную интерполяционную таблицу, приводит к тому же результату, что и поверхность, использующая блок Fuzzy Logic Контроллера.
Simulink моделирует три различные подсистемы контроллера, а именно Обычный ПИД, Нечеткий ПИД и Нечеткий ПИД, используя Интерполяционную таблицу, чтобы управлять тем же объектом.
Запустите симуляцию. Чтобы сравнить отклики замкнутого цикла с изменением ссылки шага, откройте возможности. Как и ожидалось, все три контроллера дают одинаковый результат.
sim('sllookuptable') open_system('sllookuptable/Scope')
Если у вас есть линейный нечеткий ПИД-регулятор, можно получить нелинейную управляющую поверхность, скорректировав настройки 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%. Две кривые отклика от нелинейных нечетких контроллеров почти перекрываются, что указывает на то, что двумерная интерполяционная таблица хорошо аппроксимирует нечеткую систему.
bdclose('sllookuptable') % Closing model also clears its workspace variables.
Можно аппроксимировать нелинейный нечеткий ПИД-регулятор с помощью интерполяционной таблицы. Заменив блок Fuzzy Logic Controller на блоки Интерполяционная таблица в Simulink, можно развернуть нечеткий контроллер с упрощенным сгенерированным кодом и улучшенной скоростью выполнения.
[1] Xu, J. X., Hang, C. C., Liu, C. «Параллельная структура и настройка нечеткого ПИД-регулятора». Automatica, Vol. 36, pp. 673-684. 2000.
[2] Jantzen, J. Tuning of Fuzzy PID Controllers, Technical Report, Dept. Of Automation, Technical University of Danmark. 1999.