Когда вы создаете нечеткую систему вывода, как описано в Нечетком Процессе Вывода, можно заменить встроенные функции принадлежности, функции вывода или обоих с пользовательскими функциями. В этом разделе вы изучаете, как создать нечеткую систему вывода с помощью пользовательских функций в приложении Fuzzy Logic Designer.
Создавать нечеткую систему вывода с помощью пользовательских функций в приложении Fuzzy Logic Designer:
Открытый Fuzzy Logic Designer. В командной строке MATLAB® введите:
fuzzyLogicDesigner
Задайте количество вводов и выводов нечеткой системы, как описано в Fuzzy Logic Designer.
Создайте пользовательские функции принадлежности и замените встроенные функции принадлежности на них, как описано в Задают Пользовательские Функции принадлежности.
Функции принадлежности задают, как каждая точка на входном пробеле сопоставлена со значением членства между 0 и 1.
Создайте правила с помощью Редактора Правила, как описано в Редакторе Правила.
Правила задают логическое отношение между входными параметрами и выходными параметрами.
Создайте пользовательские функции вывода и замените встроенные функции вывода на них, как описано в Задают Пользовательские Функции Вывода.
Методы вывода включают AND, OR, значение, агрегацию и defuzzification методы. Это действие генерирует выходные значения для нечеткой системы.
Следующие данные показывают проблемный пример добавления подсказки, где встроенный Implication, Aggregation и функции Defuzzification заменяются пользовательскими функциями, customimp
, customagg
и customdefuzz
, соответственно.
Выберите View> Surface , чтобы просмотреть вывод нечеткой системы вывода в Поверхностном Средстве просмотра, как описано в Поверхностном Средстве просмотра.
Можно создать пользовательские функции принадлежности и использовать их в нечетком процессе вывода. Значения этих функций должны находиться между 0 и 1. Для получения дополнительной информации о свойствах функций принадлежности смотрите Функции принадлежности.
Создать пользовательскую функцию принадлежности и заменить встроенную функцию принадлежности:
Создайте функцию MATLAB и сохраните ее в своей текущей рабочей папке.
Чтобы изучить, как создать функции MATLAB, см. Скрипты по сравнению с Функциями (MATLAB).
Следующий код является примером многоступенчатой пользовательской функции принадлежности, custmf1
, который зависит от восьми параметров между 0
и 10
.
% Function to generate a multi-step custom membership function % using 8 parameters for the input argument x function out = custmf1(x,params) for i = 1:length(x) if x(i) < params(1) y(i) = params(1); elseif x(i) < params(2) y(i) = params(2); elseif x(i) < params(3) y(i) = params(3); elseif x(i) < params(4) y(i) = params(4); elseif x(i) < params(5) y(i) = params(5); elseif x(i) < params(6) y(i) = params(6); elseif x(i) < params(7) y(i) = params(7); elseif x(i) < params(8) y(i) = params(8); else y(i) = 0; end end out = 0.1*y'; % Scale the output to lie between 0 and 1.
Откройте приложение Fuzzy Logic Designer.
fuzzyLogicDesigner
Fuzzy Logic Designer открывается именем FIS по умолчанию, Untitled
, и содержит вход того, input1, и один вывод, output1.
В Fuzzy Logic Designer выберите Edit> Membership Functions, чтобы открыть Редактор Функции принадлежности.
Три функции принадлежности треугольной формы для input1 отображены по умолчанию.
Заменять функцию принадлежности по умолчанию на пользовательскую функцию в Редакторе Функции принадлежности:
Выберите Edit> Remove All MFs, чтобы удалить функции принадлежности по умолчанию для input1.
Выберите Edit> Add Custom MF, чтобы открыть диалоговое окно Custom Membership Function.
Задавать пользовательскую функцию, в диалоговом окне Custom Membership Function:
В поле MF name задайте имя для пользовательской функции принадлежности.
При добавлении дополнительных пользовательских функций принадлежности задайте различный MF name для каждой функции.
В поле M-file function name задайте имя пользовательского файла функции принадлежности.
В Parameter list задайте вектор параметров.
Эти значения определяют форму и положение функции принадлежности, и функция выполнена с помощью этих значений параметров.
Длина вектора параметра должна быть больше, чем или равной количеству параметров в пользовательской функции принадлежности.
Используя пример custmf1
на шаге 1, диалоговое окно Custom Membership Function выглядит подобным следующей фигуре.
Нажмите OK, чтобы добавить пользовательскую функцию принадлежности.
Задайте и Range и Display Range, чтобы быть [0 10]
, чтобы совпадать с областью значений пользовательской функции принадлежности.
Редактор Функции принадлежности отображает пользовательский график функции принадлежности.
Это действие также добавляет пользовательскую функцию принадлежности в Средство просмотра Правила и делает его доступным для создания правил для нечеткого процесса вывода. Чтобы просмотреть пользовательскую функцию в Средстве просмотра Правила, выберите Edit> Rules или в Fuzzy Logic Designer или в Редакторе Функции принадлежности.
Чтобы добавить пользовательские функции принадлежности для output1, выберите его в Редакторе Функции принадлежности и повторных шагах 4 и 5.
Можно также добавить пользовательскую функцию принадлежности в FIS в командной строке MATLAB. Например, чтобы добавить custmf1
в первую входную переменную, input1
FIS, myFIS
, и назвать его customMF1
, вводит следующее:
myFIS = addMF(myFIS,"input1","custmf1",[0 1 2 4 6 8 9 10],'Name',"customMF1");
Можно заменить встроенный AND, OR, значение, агрегацию и методы вывода defuzzification с пользовательскими функциями. После того, как вы создаете пользовательскую функцию вывода, сохраняете ее в вашей текущей рабочей папке. Чтобы изучить, как создать нечеткие системы с помощью пользовательских функций вывода, смотрите раздел Build Fuzzy Inference Systems Using Custom Functions in Fuzzy Logic Designer.
Инструкции для создания и определения функций для создания нечетких систем вывода описаны в следующих разделах.
Пользовательский AND и функции вывода OR должны работать по столбцам с матрицей, таким же образом как функции MATLAB max
, min
или prod
.
Для строки или вектор-столбца x
, min(x)
возвращает минимальный элемент.
x = [1 2 3 4]; min(x)
ans = 1
Для матричного x
min(x)
возвращает вектор - строку, содержащий минимальный элемент из каждого столбца.
x = [1 2 3 4;5 6 7 8;9 10 11 12]; min(x)
ans = 1 2 3 4
min(x)
действует по первому неодноэлементному измерению. Функциональный min(x,y)
возвращает массив, который является тем же размером как x
и y
с минимальными элементами от x
или y
. Любой из входных параметров может быть скаляром. Функционирует, такие как max
, и prod
действует подобным образом.
В тулбоксе методы значения AND выполняют поэлементно операцию над матрицей, подобную функции MATLAB min(x,y)
.
a = [1 2; 3 4]; b = [2 2; 2 2]; min(a,b)
ans = 1 2 2 2
Методы значения OR выполняют поэлементно операцию над матрицей, подобную функции MATLAB max(x,y)
.
Пользовательские функции значения должны управлять таким же образом как функции MATLAB max
, min
или prod
. Вашей пользовательской функцией значения должен быть T - норма нечеткая перекрестная операция. Для получения дополнительной информации смотрите Дополнительные Нечеткие Операторы.
Функция значения должна поддержать или одни или два входных параметров, потому что программное обеспечение вызывает функцию двумя способами:
Вычислить выходные значения нечеткого множества с помощью силы увольнения всех правил и соответствующих выходных функций принадлежности. В этом случае программное обеспечение вызывает функцию значения использование двух входных параметров, подобных следующему примеру:
impvals = customimp(w,outputmf)
w
Запуская силу нескольких правил, заданных как nr-by-ns матрица. Здесь, nr является количеством правил, и ns является количеством выборок выходных функций принадлежности.
w(:,j) = w(:,1)
для всего j. w(i,1)
является силой увольнения i th правило.
outputmf
— Выведите значения функции принадлежности, заданные как nr-by-ns матрица. Здесь, nr является количеством правил, и ns является количеством выборок выходных функций принадлежности.
outputmf(i,:)
содержит данные i th выходная функция принадлежности.
Вычислить вывод нечеткое значение с помощью силы увольнения одного правила и соответствующей выходной функции принадлежности, для данной выборки. В этом случае программное обеспечение вызывает функцию значения использование входа того, подобного следующему примеру:
impval = customimp([w outputmf])
w
и outputmf
являются скалярными значениями, представляющими силу увольнения правила и соответствующего выходного значения функции принадлежности для данной выборки.
Следующее является примером ограниченного произведения пользовательская функция значения с бинарным отображением . [1]
function y = customimp(x1,x2) if nargin == 1 % x1 assumed to be non-empty column vector or matrix. minVal = zeros(1,size(x1,2)); y = ones(1,size(x1,2)); for i = 1:size(x1,1) y = max(minVal,sum([y;x1(i,:)])-1); end else % x1 and x2 assumed to be non-empty matrices. minVal = zeros(1,size(x1,2)); y = zeros(size(x1)); for i = 1:size(x1,1) y(i,:) = max(minVal,sum([x1(i,:);x2(i,:)])-1); end end
Пользовательские функции значения не поддерживаются для Sugeno-систем-типов.
Пользовательские функции агрегации должны управлять таким же образом как функции MATLAB max
, min
или prod
и должны иметь форму y = customagg(x)
. Вашей пользовательской функцией значения должен быть T-conorm (S - норма) нечеткая перекрестная операция. Для получения дополнительной информации смотрите Дополнительные Нечеткие Операторы.
x является nv-by-nr матрица, которая является списком усеченных выходных функций, возвращенных методом значения для каждого правила. nv является количеством выходных переменных, и nr является количеством правил. Вывод метода агрегации является одним нечетким множеством для каждой выходной переменной.
Следующее является примером ограниченной суммы пользовательская функция агрегации с бинарным отображением . [1]
function y = customagg(x) maxVal = ones(1,size(x,2)); y = zeros(1,size(x,2)); for i = 1:size(x,1) y = min(maxVal,sum([y;x(i,:)])); end
Пользовательские функции агрегации не поддерживаются для Sugeno-систем-типов.
Пользовательские функции defuzzification должны иметь форму y = customdefuzz(xmf,ymf)
, где (xmf,ymf) является конечным множеством значений функции принадлежности. xmf является вектором значений во входном диапазоне функции принадлежности. ymf является значением функции принадлежности при xmf.
Следующее является примером пользовательской функции defuzzification:
function defuzzfun = customdefuzz(xmf,ymf)
total_area = sum(ymf);
defuzzfun = sum(ymf.*xmf)/total_area;
Пользовательские функции defuzzification не поддерживаются для Sugeno-систем-типов.
После того, как вы создаете и сохраняете пользовательскую функцию вывода, задаете функцию в нечеткой системе вывода с помощью следующих шагов:
В нижней левой панели Fuzzy Logic Designer выберите Custom
из выпадающего меню, соответствующего методу вывода, для которого вы хотите задать пользовательскую функцию.
Выполнение так открывает диалоговое окно, где вы задаете имя пользовательской функции вывода.
В поле Method name задайте имя пользовательской функции вывода и нажмите ОК.
Пользовательская функция заменяет встроенную функцию при создании нечеткой системы вывода.
В порядке задать пользовательскую функцию вывода, необходимо сначала добавить по крайней мере одно правило в FIS.
Чтобы задать пользовательские функции для других методов вывода, повторите шаги 1 и 2.
Можно также задать пользовательские функции вывода для FIS в командной строке MATLAB. Например, чтобы добавить пользовательское:
Метод Defuzzification, ввести
myFIS.DefuzzificationMethod = "customdefuzz";
где customdefuzz
является именем пользовательской функции defuzzification.
Метод значения, ввести
myFIS.ImplicationMethod = "customimp";
где customimp
является именем пользовательской функции значения.
Метод агрегации, ввести
myFIS.AggregationMethod = "customagg";
где customagg
является именем пользовательской функции агрегации.
Можно использовать пользовательские функции в нечетких системах вывода, для которых вы генерируете код. Для получения дополнительной информации о генерации кода для нечетких систем смотрите, Развертывают Нечеткие Системы Вывода.
Если вы используете недвойной тип данных для своего сгенерированного кода, необходимо распространить тип данных от входных параметров пользовательской функции к выходному аргументу. Например, следующая пользовательская функция агрегации поддерживает тип данных x
в y
с помощью ones
и zeros
с аргументом 'like'
.
function y = customagg(x) maxVal = ones(1,size(x,2),'like',x); y = zeros(1,size(x,2),'like',x); for i = 1:size(x,1) y = min(maxVal,sum([y;x(i,:)])); end
Для получения дополнительной информации о записи функций, которые поддерживают генерацию кода C/C++, смотрите, что MATLAB Программирует для Генерации кода (MATLAB Coder).
[1] Mizumoto, M. "Графические Представления Нечетких Соединительных слов, Второй части: Случаи Компенсационных Операторов и Самодвойственных Операторов". Нечеткие множества и Системы. Издание 32, Номер 1., 1989, стр 45-79.