Когда вы создаете систему нечеткого вывода, как описано в Процессе нечеткого вывода, можно заменить встроенные функции принадлежности, функции вывода или оба пользовательскими функциями. В этом разделе вы узнаете, как создать систему нечеткого вывода с помощью пользовательских функций в приложении Fuzzy Logic Designer.
Чтобы создать систему нечеткого вывода с помощью пользовательских функций в приложении Fuzzy Logic Designer:
Откройте Fuzzy Logic Designer. В MATLAB® в командной строке введите следующую команду.
fuzzyLogicDesigner
Укажите количество входов и выходов нечеткой системы, как описано в Fuzzy Logic Designer.
Создайте пользовательские функции членства и замените ими встроенные функции членства, как описано в разделе «Задание пользовательских функций членства».
Функции принадлежности определяют, как каждая точка входного пространства сопоставляется со значением принадлежности от 0 до 1.
Создайте правила с помощью редактора правил, как описано в редакторе правил.
Правила определяют логическую связь между входами и выходами.
Создайте пользовательские функции вывода и замените ими встроенные функции вывода, как описано в разделе «Задание пользовательских функций вывода».
Методы вывода включают в себя методы И, ИЛИ, подразумеваемые, агрегация и дефаззификация. Это действие генерирует выходные значения для нечеткой системы.
Следующий рисунок показывает пример задачи расчета чаевых, где встроенные Implication, Aggregation и Defuzzification функции заменены пользовательскими функциями customimp
, customagg
, и customdefuzz
, соответственно.
Выберите View > Surface , чтобы просмотреть выход системы нечеткого вывода в Средство Просмотра, как описано в The Средство Просмотра.
Можно создать пользовательские функции членства и использовать их в процессе нечеткого вывода. Значения этих функций должны лежать между 0 и 1. Дополнительные сведения о свойствах функций членства см. в разделе Функции членства.
Чтобы создать пользовательскую функцию членства и заменить встроенную функцию членства:
Создайте функцию 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. end
Откройте приложение Fuzzy Logic Designer.
fuzzyLogicDesigner
Fuzzy Logic Designer открывается с именем FIS по умолчанию, Untitled
, и содержит один вход, input1 и один выход, output1.
В Fuzzy Logic Designer выберите Edit > Membership Functions, чтобы открыть Membership Function Editor.
По умолчанию отображаются три функции членства для input1 в треугольной форме.
Чтобы заменить функцию членства по умолчанию пользовательской функцией в редакторе функций членства:
Выберите Edit > Remove All MFs, чтобы удалить функции членства по умолчанию для input1.
Выберите Edit > Add Custom MF, чтобы открыть диалоговое окно Пользовательская функция членства.
Чтобы задать пользовательскую функцию, в диалоговом окне Custom Membership Function:
В поле MF name укажите имя пользовательской функции членства. В данном примере используйте имя customMF1
Примечание
При добавлении дополнительных пользовательских функций членства задайте другое MF name для каждой функции.
В поле M-file function name укажите имя пользовательского файла функции принадлежности.
В Parameter list задайте вектор параметров. В данном примере используйте вектор [0 1 2 4 6 8 9 10]
.
Эти значения определяют форму и положение функции принадлежности, и функция оценивается с помощью этих значений параметров.
Примечание
Длина вектора параметра должна быть больше или равной количеству параметров в пользовательской функции принадлежности.
Использование 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, implication, aggregation и дефаззификация на пользовательские функции. После создания пользовательской функции вывода сохраните ее в текущей рабочей папке. Чтобы узнать, как создать нечеткие системы с помощью пользовательских функций вывода, смотрите раздел «Создание систем нечеткого вывода с использованием пользовательских функций» в 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
работать подобным образом.
В тулбоксе implication методы 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 операцией нечеткого пересечения -norm. Для получения дополнительной информации см. Раздел «Дополнительные операторы»
Импликационная функция должна поддерживать один или два входа, потому что программное обеспечение вызывает функцию двумя способами:
Чтобы вычислить выходные значения нечеткого набора с помощью силы срабатывания всех правил и соответствующих функций выходного членства. В этом случае программное обеспечение вызывает функцию implication с помощью двух входов, аналогичных следующему примеру:
impvals = customimp(w,outputmf)
w
- Сила запуска нескольких правил, заданная как nr -by - ns матрица. Здесь nr количество правил, а ns количество выборок функций выходного членства.
w(:,j) = w(:,1)
для всех j. w(i,1)
- сила стрельбы ith правило.
outputmf
- Выходные значения функции принадлежности, заданные как nr -by- ns матрица. Здесь nr количество правил, а ns количество выборок функций выходного членства.
outputmf(i,:)
содержит данные ith выход членства.
Чтобы вычислить выход нечеткое значение с помощью силы срабатывания одного правила и соответствующей функции принадлежности к выходу, для заданной выборки. В этом случае программное обеспечение вызывает функцию implication с помощью одного входа, аналогичного следующему примеру:
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 end
Примечание
Пользовательские функции подразумевания не поддерживаются для систем Sugeno-type.
Пользовательские функции агрегации должны работать так же, как и функции MATLAB max
, min
, или prod
и должна иметь форму y = customagg(x)
. Ваша пользовательская функция подразумевания должна быть T операцией нечеткого пересечения -conorm (S -norm). Для получения дополнительной информации см. Раздел «Дополнительные операторы»
x - nv матрица nr, которая является списком усеченных выходных функций, возвращенных методом implication для каждого правила. 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 end
Примечание
Пользовательские функции агрегации не поддерживаются для систем Sugeno-type.
Пользовательские функции дефаззификации должны иметь вид y = customdefuzz(x,ymf)
, где x
- вектор значений в членстве входного параметра функции области значений и ymf
содержит значения функции членства для каждого x
значение.
Следующий пример пользовательской функции дефаззификации:
function defuzzfun = customdefuzz(x,ymf) total_area = sum(ymf); defuzzfun = sum(ymf.*x)/total_area; end
Примечание
Пользовательские функции дефаззификации не поддерживаются для систем типа Sugeno.
После создания и сохранения пользовательской функции вывода можно задать функцию в системе нечеткого вывода в командной строке или с помощью Fuzzy Logic Designer.
Чтобы задать пользовательские функции вывода в Fuzzy Logic Designer, выполните следующие шаги.
Примечание
Для порядка пользовательской функции вывода в Fuzzy Logic Designer необходимо сначала добавить по крайней мере одно правило к FIS.
На левой нижней панели Fuzzy Logic Designer выберите Custom
из раскрывающегося меню, соответствующего методу вывода, для которого необходимо задать пользовательскую функцию.
Это открывает диалоговое окно, в котором вы задаете имя пользовательской функции вывода.
В поле Method name укажите имя пользовательской функции вывода и нажмите OK.
Пользовательская функция заменяет встроенную функцию при построении системы нечеткого вывода.
Чтобы задать пользовательские функции для других методов вывода, повторите шаги 1 и 2.
Чтобы задать пользовательские функции вывода для FIS (myFIS
) в командной строке MATLAB установите соответствующее свойство объекта FIS в имя функции вывода. Для примера, чтобы добавить пользовательский:
Метод дефаззификации, тип
myFIS.DefuzzificationMethod = "customdefuzz";
где customdefuzz
- имя пользовательской функции дефаззификации.
Метод выражения, тип
myFIS.ImplicationMethod = "customimp";
где customimp
- имя пользовательской функции импликации.
Метод агрегации, тип
myFIS.AggregationMethod = "customagg";
где customagg
- имя пользовательской функции агрегации.
Для систем нечеткого вывода типа 2 можно задать пользовательскую функцию сокращения типа. Эта функция должна иметь вид y = customtr(x,umf,lmf)
, где x
- вектор значений в членском входном параметре функции области значений. umf
и lmf
являются ли соответствующие значения верхней и нижней функции членства для каждого x
значение. Область выхода y
- двухэлементный вектор-строка центроидов [cL, cR].
Для получения дополнительной информации о сокращении типа см. Type-2 систем нечеткого вывода.
По умолчанию системы Sugeno типа 2 поддерживают только средневзвешенную форму сокращения типа. Следующая пользовательская функция сокращения типа реализует взвешенную форму сокращения типа для системы Sugeno.
function y = customtr(x,umf,ymf) y = zeros(1,2); y(1) = sum(x.*umf); y(2) = sum(x.*lmf); end
Чтобы задать пользовательскую функцию сокращения типа для FIS (myFIS
) в командной строке MATLAB введите
myFIS.DTypeReductionMethod = "customtr";
где customtr
- имя пользовательской функции дефаззификации.
Можно использовать пользовательские функции в системах нечеткого вывода, для которых вы генерируете код. Для получения дополнительной информации о генерации кода для нечетких систем смотрите Развертывание систем нечеткого вывода.
Если вы используете тип данных nondouble для вашего сгенерированного кода, необходимо перенести тип данных из входных параметров вашей пользовательской функции в выходной аргумент. Например, следующая пользовательская функция агрегации поддерживает тип данных 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 end
Для получения дополнительной информации о записи функций, поддерживающих генерацию кода C/C + +, смотрите MATLAB Programming for Code Generation (MATLAB Coder).
[1] Mizumoto, Masaharu. «Живописные представления нечетких коннективов, часть II: Случаи компенсационных операторов и двойных операторов». Нечеткие наборы и системы 32, № 1 (август 1989): 45-79. https://doi.org/10.1016/0165-0114 (89) 90087-0.