Создайте нечеткие системы в командной строке

Можно создать систему нечеткого вывода (FIS) в командной строке MATLAB ®. Этот метод является альтернативой интерактивной разработке FIS с помощью Fuzzy Logic Designer.

В этом примере показано, как создать систему нечеткого вывода Mamdani. В то время как вы создаете Mamdani FIS, используемые методы применяются и к созданию систем Sugeno.

Задача расчета чаевых в командной строке

Чтобы продемонстрировать функциональность командной строки для создания и просмотра систем нечеткого вывода, этот пример использует tipper FIS.

fis = readfis('tipper.fis');

Эта команда возвращает mamfis объект, который содержит свойства нечеткой системы. Для системы Sugeno эта команда возвращает sugfis объект.

Вы можете получить доступ к свойствам FIS с помощью записи через точку. Для примера просмотрите входы нечеткой системы.

fis.Inputs
ans = 
  1x2 fisvar array with properties:

    Name
    Range
    MembershipFunctions

  Details:
           Name        Range     MembershipFunctions
         _________    _______    ___________________

    1    "service"    0    10        {1x3 fismf}    
    2    "food"       0    10        {1x2 fismf}    

Чтобы задать свойства вашей нечеткой системы, используйте запись через точку. Для примера задайте имя FIS.

fis.Name = "gratuity";

Объект FIS

Вы представляете системы нечеткого вывода, используя mamfis и sugfis объекты. Эти объекты содержат всю информацию о системе нечеткого вывода, включая имена переменных, определения функций принадлежности и методы нечеткого вывода. Каждый FIS сам по себе является иерархией объектов. Следующие объекты используются в нечеткой системе:

  • fisvar объекты представляют как входную, так и выходную переменные.

  • fismf объекты представляют функции принадлежности в каждой входной и выходной переменной.

  • fisrule объекты представляют нечеткие правила, которые сопоставляют входы с выходами.

Просмотрите всю информацию для FIS, непосредственно указав его свойства.

fis
fis = 
  mamfis with properties:

                       Name: "gratuity"
                  AndMethod: "min"
                   OrMethod: "max"
          ImplicationMethod: "min"
          AggregationMethod: "max"
      DefuzzificationMethod: "centroid"
                     Inputs: [1x2 fisvar]
                    Outputs: [1x1 fisvar]
                      Rules: [1x3 fisrule]
    DisableStructuralChecks: 0

	See 'getTunableSettings' method for parameter optimization.

Вы можете просмотреть свойства объектов в объекте FIS с помощью записи через точку. Для примера просмотрите fisvar объект для первой входной переменной.

fis.Inputs(1)
ans = 
  fisvar with properties:

                   Name: "service"
                  Range: [0 10]
    MembershipFunctions: [1x3 fismf]

Кроме того, просмотрите функции принадлежности для этой переменной.

fis.Inputs(1).MembershipFunctions
ans = 
  1x3 fismf array with properties:

    Type
    Parameters
    Name

  Details:
            Name          Type       Parameters
         ___________    _________    __________

    1    "poor"         "gaussmf"    1.5      0
    2    "good"         "gaussmf"    1.5      5
    3    "excellent"    "gaussmf"    1.5     10

Функции отображения системы

Чтобы получить высокоуровневое представление вашей нечеткой системы из командной строки, используйте plotfis, plotmf, и gensurf функций. plotfis отображает всю систему как блок, как показано на Fuzzy Logic Designer.

plotfis(fis)

Figure contains 4 axes. Axes 1 contains 3 objects of type line. Axes 2 contains 2 objects of type line. Axes 3 contains 3 objects of type line. Axes 4 contains 3 objects of type text.

The plotmf графики функций всех функций принадлежности, сопоставленных с заданной переменной. Для примера просмотрите функции принадлежности для переменной первого входа.

plotmf(fis,'input',1)

Figure contains an axes. The axes contains 6 objects of type line, text.

Точно так же, чтобы просмотреть функции членства для первого выхода, введите:

plotmf(fis,'output',1)

Figure contains an axes. The axes contains 6 objects of type line, text.

plotmf не поддерживает просмотр выходных функций членства в системах Sugeno.

Чтобы просмотреть правила нечеткой системы, введите:

fis.Rules
ans = 
  1x3 fisrule array with properties:

    Description
    Antecedent
    Consequent
    Weight
    Connection

  Details:
                                Description                        
         __________________________________________________________

    1    "service==poor | food==rancid => tip=cheap (1)"           
    2    "service==good => tip=average (1)"                        
    3    "service==excellent | food==delicious => tip=generous (1)"

The gensurf графики функций выхода FIS для любой одной или двух входных переменных.

gensurf(fis)

Figure contains an axes. The axes contains an object of type surface.

Создайте систему нечеткого вывода

В качестве альтернативы использованию приложения Fuzzy Logic Designer можно создать FIS полностью из командной строки.

Сначала создайте Mamdani FIS, указав его имя.

fis = mamfis('Name',"tipper");

Добавьте первую входную переменную для качества сервиса используя addInput.

fis = addInput(fis,[0 10],'Name',"service");

Добавьте функции членства для каждого из уровней качества обслуживания с помощью addMF. В этом случае используйте функции Гауссова членства. Для получения дополнительной информации о свойствах функции Гауссова членства смотрите gaussmf.

fis = addMF(fis,"service","gaussmf",[1.5 0],'Name',"poor");
fis = addMF(fis,"service","gaussmf",[1.5 5],'Name',"good");
fis = addMF(fis,"service","gaussmf",[1.5 10],'Name',"excellent");

Добавьте вторую входную переменную для качества пищи и добавьте две трапециевидные функции принадлежности. Для получения информации о трапециевидных функциях членства смотрите trapmf.

fis = addInput(fis,[0 10],'Name',"food");
fis = addMF(fis,"food","trapmf",[-2 0 1 3],'Name',"rancid");
fis = addMF(fis,"food","trapmf",[7 9 10 12],'Name',"delicious");

Добавьте переменный выход для совета и три треугольные функции принадлежности. Для получения дополнительной информации о треугольной функции членства смотрите trimf.

fis = addOutput(fis,[0 30],'Name',"tip");
fis = addMF(fis,"tip","trimf",[0 5 10],'Name',"cheap");
fis = addMF(fis,"tip","trimf",[10 15 20],'Name',"average");
fis = addMF(fis,"tip","trimf",[20 25 30],'Name',"generous");

Задайте следующие три правила для FIS как числового массива:

  1. Если (сервис плох) или (еда - тухлая), то (советы малы).

  2. Если (сервис хорош), то (советы средние).

  3. Если (сервис превосходен) или (еда восхитительна), то (советы щедрые).

Каждая строка массива содержит одно правило в следующем формате.

  • Столбец 1 - Индекс функции принадлежности для первого входа

  • Столбец 2 - Индекс функции принадлежности для второго входа

  • Столбец 3 - Индекс функции принадлежности для выхода

  • Столбец 4 - Вес правила (от 0 на 1)

  • Столбец 5 - Нечеткий оператор (1 для И, 2 для OR)

Для индексов функции принадлежности укажите условие NOT, используя отрицательное значение. Для получения дополнительной информации о спецификации нечетких правил см. addRule.

ruleList = [1 1 1 1 2;
            2 0 2 1 1;
            3 2 3 1 2];

Добавьте правила к FIS.

fis = addRule(fis,ruleList);

Также можно создать систему нечеткого вывода с помощью комбинации записи через точку и fisvar, fismf, и fisrule объекты. Этот метод не является хорошей практикой для большинства приложений. Однако можно использовать этот подход, когда приложение требует большей гибкости при построении и изменении FIS.

Создайте систему нечеткого вывода.

fis = mamfis('Name','tipper');

Добавьте и сконфигурируйте первую входную переменную. В этом случае создайте fisvar по умолчанию объект и задайте его свойства с помощью записи через точку.

fis.Inputs(1) = fisvar;
fis.Inputs(1).Name = "service";
fis.Inputs(1).Range = [0 10];

Определите функции принадлежности для первой входной переменной. Для каждого MF создайте fismf Объекту и установите свойства с помощью записи через точку.

fis.Inputs(1).MembershipFunctions(1) = fismf;
fis.Inputs(1).MembershipFunctions(1).Name = "poor";
fis.Inputs(1).MembershipFunctions(1).Type = "gaussmf";
fis.Inputs(1).MembershipFunctions(1).Parameters = [1.5 0];
fis.Inputs(1).MembershipFunctions(2) = fismf;
fis.Inputs(1).MembershipFunctions(2).Name = "good";
fis.Inputs(1).MembershipFunctions(2).Type = "gaussmf";
fis.Inputs(1).MembershipFunctions(2).Parameters = [1.5 5];
fis.Inputs(1).MembershipFunctions(3) = fismf;
fis.Inputs(1).MembershipFunctions(3).Name = "excellent";
fis.Inputs(1).MembershipFunctions(3).Type = "gaussmf";
fis.Inputs(1).MembershipFunctions(3).Parameters = [1.5 10];

Добавьте и сконфигурируйте вторую входную переменную. Для этой переменной задайте имя и область значений при создании fisvar объект.

fis.Inputs(2) = fisvar([0 10],'Name',"food");

Укажите функции членства для второго входа. Для каждого MF задайте имя, тип и параметры при создании fismf объект.

fis.Inputs(2).MembershipFunctions(1) = fismf("trapmf",[-2 0 1 3],...
                                             'Name',"rancid");
fis.Inputs(2).MembershipFunctions(2) = fismf("trapmf",[7 9 10 12],...
                                             'Name',"delicious");

Точно так же добавьте и сконфигурируйте переменный выход и ее функции членства.

fis.Outputs(1) = fisvar([0 30],'Name',"tip");

В этом случае задайте выходные функции принадлежности с помощью вектора fismf объекты.

mf1 = fismf("trimf",[0 5 10],'Name',"cheap");
mf2 = fismf("trimf",[10 15 20],'Name',"average");
mf3 = fismf("trimf",[20 25 30],'Name',"generous");
fis.Outputs(1).MembershipFunctions = [mf1 mf2 mf3];

Создайте правила для нечеткой системы. Для каждого правила создайте fisrule объект. Затем задайте правила с помощью вектора этих объектов. При создании fisrule Объект использовании числовых значений необходимо задать количество переменных входов.

rule1 = fisrule([1 1 1 1 2],2);
rule2 = fisrule([2 0 2 1 1],2);
rule3 = fisrule([3 2 3 1 2],2);
rules = [rule1 rule2 rule3];

Перед добавлением правил в нечеткую систему необходимо обновить их с помощью данных в объекте FIS. Обновляйте правила с помощью update function, и добавить им нечеткую систему.

rules = update(rules,fis);
fis.Rules = rules;

При построении нечеткой системы можно также задать пользовательские функции принадлежности и функции вывода. Для получения дополнительной информации см. «Создание нечетких систем с использованием пользовательских функций».

Вычислите систему нечеткого вывода

Чтобы вычислить выход нечеткой системы для заданной входной комбинации, используйте evalfis команда. Для примера оцените fis использование входа значений переменных 1 и 2.

evalfis(fis,[1 2])
ans = 5.5586

Можно также вычислить несколько входных комбинаций с помощью массива, где каждая строка представляет одну входную комбинацию.

inputs = [3 5;
          2 7;
          3 1];
evalfis(fis,inputs)
ans = 3×1

   12.2184
    7.7885
    8.9547

См. также

| | | | |

Похожие темы