Реализуйте нечеткий ПИД-регулятор в Simulink Используя интерполяционную таблицу

В этом примере показано, как реализовать нечеткую систему вывода для нелинейного управления ПИДом с помощью блока двумерной интерполяционной таблицы.

Обзор

Нечеткая система вывода (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');

Задайте следующие нечеткие правила:

  1. Если E отрицательно и CE отрицательно, затем u -20.

  2. Если E отрицательно и CE нуль, затем u -10.

  3. Если E отрицательно и CE положительно затем u 0.

  4. Если E нуль и CE отрицательно, затем u -10.

  5. Если E нуль и CE нуль, затем u 0.

  6. Если E нуль и CE положительно, затем u 10.

  7. Если E положительно и CE отрицательно, затем u 0.

  8. Если E положительно и CE нуль, затем u 10.

  9. Если 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

Модель 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');

Задайте следующие правила:

  1. Если E отрицательно и CE отрицательно, затем u -20.

  2. Если E отрицательно и CE положительно, затем u 0.

  3. Если E положительно и CE отрицательно, затем u 0.

  4. Если 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.

Смотрите также

Блоки

Похожие темы