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

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

Обзор

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

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

  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 заключается в том, что блок Fuzzy Logic Controller заменяется блоком двумерная интерполяционная таблица.

Когда поверхность управления линейна, нечеткий ПИД-регулятор, использующая двумерную интерполяционную таблицу, приводит к тому же результату, что и поверхность, использующая блок Fuzzy Logic Контроллера.

Симулируйте реакцию замкнутой системы в Simulink

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');

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

  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] 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.

См. также

Блоки

Похожие темы