exponenta event banner

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

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

В этом примере показано, как создать систему нечеткого вывода Mamdani. При создании FIS Mamdani используемые методы применяются и к созданию систем 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 отображает всю систему в виде блок-схемы, как показано в конструкторе нечеткой логики.

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.

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)"

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

gensurf(fis)

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

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

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

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

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 для ИЛИ)

Для индексов членских функций укажите условие 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 и добавьте их в нечеткую систему.

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

См. также

| | | | |

Связанные темы