В командной строке 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";Вы представляете нечеткие системы вывода с помощью mamfis и sugfis объекты. Эти объекты содержат всю информацию о системе нечеткого вывода, включая имена переменных, определения функций членства и методы нечеткого вывода. Каждый FIS сам по себе является иерархией объектов. В нечеткой системе используются следующие объекты:
Просмотр всей информации для 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)

plotmf функция отображает все функции членства, связанные с данной переменной. Например, просмотрите функции членства для первой входной переменной.
plotmf(fis,'input',1)
Аналогично, чтобы просмотреть функции членства для первого вывода, введите:
plotmf(fis,'output',1)
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)

В качестве альтернативы приложению 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 - Индекс функции членства для вывода
Столбец 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
evalfis | gensurf | mamfis | plotfis | plotmf | sugfis