Создайте нечеткие системы с помощью пользовательских функций

Создайте системы нечеткого вывода с помощью пользовательских функций в Fuzzy Logic Designer

Когда вы создаете систему нечеткого вывода, как описано в Процессе нечеткого вывода, можно заменить встроенные функции принадлежности, функции вывода или оба пользовательскими функциями. В этом разделе вы узнаете, как создать систему нечеткого вывода с помощью пользовательских функций в приложении Fuzzy Logic Designer.

Чтобы создать систему нечеткого вывода с помощью пользовательских функций в приложении Fuzzy Logic Designer:

  1. Откройте Fuzzy Logic Designer. В MATLAB® в командной строке введите следующую команду.

    fuzzyLogicDesigner
  2. Укажите количество входов и выходов нечеткой системы, как описано в Fuzzy Logic Designer.

  3. Создайте пользовательские функции членства и замените ими встроенные функции членства, как описано в разделе «Задание пользовательских функций членства».

    Функции принадлежности определяют, как каждая точка входного пространства сопоставляется со значением принадлежности от 0 до 1.

  4. Создайте правила с помощью редактора правил, как описано в редакторе правил.

    Правила определяют логическую связь между входами и выходами.

  5. Создайте пользовательские функции вывода и замените ими встроенные функции вывода, как описано в разделе «Задание пользовательских функций вывода».

    Методы вывода включают в себя методы И, ИЛИ, подразумеваемые, агрегация и дефаззификация. Это действие генерирует выходные значения для нечеткой системы.

    Следующий рисунок показывает пример задачи расчета чаевых, где встроенные Implication, Aggregation и Defuzzification функции заменены пользовательскими функциями customimp, customagg, и customdefuzz, соответственно.

    Fuzzy Logic Designer app with custom implication, aggregation, and defuzzification functions specified in the lower left corner.

  6. Выберите View > Surface , чтобы просмотреть выход системы нечеткого вывода в Средство Просмотра, как описано в The Средство Просмотра.

Задайте пользовательские функции членства

Можно создать пользовательские функции членства и использовать их в процессе нечеткого вывода. Значения этих функций должны лежать между 0 и 1. Дополнительные сведения о свойствах функций членства см. в разделе Функции членства.

Чтобы создать пользовательскую функцию членства и заменить встроенную функцию членства:

  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
  2. Откройте приложение Fuzzy Logic Designer.

    fuzzyLogicDesigner

    Fuzzy Logic Designer открывается с именем FIS по умолчанию, Untitled, и содержит один вход, input1 и один выход, output1.

  3. В Fuzzy Logic Designer выберите Edit > Membership Functions, чтобы открыть Membership Function Editor.

    По умолчанию отображаются три функции членства для input1 в треугольной форме.

    Membership Function Editor showing default triangular membership functions

  4. Чтобы заменить функцию членства по умолчанию пользовательской функцией в редакторе функций членства:

    1. Выберите Edit > Remove All MFs, чтобы удалить функции членства по умолчанию для input1.

    2. Выберите Edit > Add Custom MF, чтобы открыть диалоговое окно Пользовательская функция членства.

      Initially, the Custom Membership Function dialog box contains parameters for a default triangular membership function.

  5. Чтобы задать пользовательскую функцию, в диалоговом окне Custom Membership Function:

    1. В поле MF name укажите имя пользовательской функции членства. В данном примере используйте имя customMF1

      Примечание

      При добавлении дополнительных пользовательских функций членства задайте другое MF name для каждой функции.

    2. В поле M-file function name укажите имя пользовательского файла функции принадлежности.

    3. В Parameter list задайте вектор параметров. В данном примере используйте вектор [0 1 2 4 6 8 9 10].

      Эти значения определяют форму и положение функции принадлежности, и функция оценивается с помощью этих значений параметров.

      Примечание

      Длина вектора параметра должна быть больше или равной количеству параметров в пользовательской функции принадлежности.

      Использование custmf1 пример на шаге 1, диалоговое окно Custom Membership Function выглядит подобно следующему рисунку.

      Custom membership function dialog box showing the specified name, custom function, and parameters

    4. Щелкните OK, чтобы добавить пользовательскую функцию членства.

    5. Задайте и Range, и Display Range, которые будут [0 10] для соответствия области значений пользовательской функции членства.

    Редактор функций членства отображает пользовательский график функций членства.

    The custom membership function shows a stepwise increase in membership value from left to right with steps occurring at points indicated by the custom MF parameters.

    Это действие также добавляет пользовательскую функцию принадлежности в Средство Просмотра и делает ее доступной для создания правил для процесса нечеткого вывода. Чтобы просмотреть пользовательскую функцию в средстве просмотра, выберите Edit > Rules в Fuzzy Logic Designer или редакторе функций принадлежности.

    Rule Editor showing customMF1 in the input membership function selection list on the left

  6. Чтобы добавить пользовательские функции членства для 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

Пользовательские функции 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
Для N-D массивов, 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).

Создайте пользовательские функции Implication

Пользовательские функции выражения должны работать так же, как и функции 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 являются скалярными значениями, представляющими силу срабатывания правила и соответствующий выход значение функции принадлежности для заданной выборки.

Ниже приведен пример пользовательской функции выражения ограниченного продукта с двоичным отображением T(a,b)=max{0,a+b1}. [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 - количество правил. Выходы метода агрегации являются одним нечетким множеством для каждой выходной переменной.

Ниже приведен пример пользовательской функции агрегации ограниченной суммы с двоичным отображением S(a,b)=min{a+b,1}. [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.

  1. На левой нижней панели Fuzzy Logic Designer выберите Custom из раскрывающегося меню, соответствующего методу вывода, для которого необходимо задать пользовательскую функцию.

    In Fuzzy Logic Designer, the Implication drop-down list is open with a cursor over the Custom selection.

    Это открывает диалоговое окно, в котором вы задаете имя пользовательской функции вывода.

  2. В поле Method name укажите имя пользовательской функции вывода и нажмите OK.

    The custom implication method is specified as the customimp function

    Пользовательская функция заменяет встроенную функцию при построении системы нечеткого вывода.

  3. Чтобы задать пользовательские функции для других методов вывода, повторите шаги 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.

См. также

Похожие темы