Можно создать нечеткую систему вывода (FIS) в командной строке MATLAB®. Этот метод является альтернативой интерактивной разработке вашего FIS использование Fuzzy Logic Designer.
Этот пример показывает вам, как создать Mamdani нечеткая система вывода. В то время как вы создаете Mamdani FIS, используемые методы применяются к созданию систем Sugeno также.
Чтобы продемонстрировать функциональность командной строки для создания и просмотра нечетких систем вывода, этот пример использует самосвал 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)
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 полностью из командной строки.
Во-первых, создайте 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
для AND, 2
для OR)
Для индексов функции принадлежности укажите на НЕ условие с помощью отрицательной величины. Для получения дополнительной информации о нечеткой спецификации правила смотрите 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