Можно создать систему нечеткого вывода (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";
Вы представляете системы нечеткого вывода, используя 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
отображает всю систему как блок, как показано на Fuzzy Logic Designer.
plotfis(fis)
The 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)"
The gensurf
графики функций выхода FIS для любой одной или двух входных переменных.
gensurf(fis)
В качестве альтернативы использованию приложения 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 - Индекс функции принадлежности для выхода
Столбец 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
evalfis
| gensurf
| mamfis
| plotfis
| plotmf
| sugfis