MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

Проектирование систем управления\Fuzzy Logic Toolbox

С.Д.Штовба "Введение в теорию нечетких множеств и нечеткую логику"

В оглавление книги \ К следующему разделу \ К предыдущему разделу

4. Прикладные нечеткие системы

4.7. Нечеткий вывод при нечетких исходных данных. Расширение Fuzzy Logic Toolbox.

В разделе рассматривается как расширить Fuzzy Logic Toolbox для выполнения нечеткого вывода при нечетких исходных данных. M-функции для такого расширения можно скачать здесь. Предполагается, что функции принадлежности нечетких исходных данных заданы гауссовской, колообразной или сигмоидной функциями принадлежности.

Для выполнения нечеткого вывода при нечетких данных необходимо уметь определять степени принадлежности входов к термам из базы знаний. Они рассчитывается по-разному при четких и нечетких входных значениях. При четких исходных данных они рассчитывается подстановкой текущего значения переменной в формулу функции принадлежности. При нечетких исходных данных необходимо определить степень принадлежности одного нечеткого множества значения входной переменной, к другому нечеткому множеству терму из базы знаний. Она равна высоте пересечения этих нечетких множеств (см. рис. 1).


Рис. 1. Расчет степени принадлежности нечеткого множества нечеткому множеству .

Расчет высоты пересечения двух нечетких множеств осуществляет функция fuzzy_input. Она вызывается в таком формате:

t=fuzzy_input(param1, param2, mftype)

где t - высота пересечения двух нечетких множеств;
param1 и param2 - параметры функций принадлежностей нечетких множеств;
mftype - тип функции принадлежности. Допустимые типы функций принадлежностей: 'gaussmf', 'sigmf' и 'gbellmf'.

Нечеткие множества заданы функциями принадлежности одного типа. Для 'gbellmf' коэффициенты крутизны функций принадлежности должны быть одинаковыми: param1(2)==param2(2).

При нечетком выводе с помощью функции evalfis нужно каким-то образом указать, что входные переменные заданы нечеткими числами. Для этого используется прием. Нечеткое значение входной переменной кодируется следующим образом:

Fuzzy_value=FUZZY_LABEL-10*A-B,
где A - номер переменной в нечеткой системе,
B - порядковый номер терма.

FUZZY_LABEL - признак нечеткого аргумента, задается отрицательным числом <=-100. Если FUZZY_LABEL=-1000, тогда аргументы x>=-1010 рассматриваются как четкие, а аргументы x<-1010 как нечеткие.

Например, если FUZZY_LABEL=-1000, тогда значение x=-1012 соответствует входному нечеткому множеству с функцией принадлежности второго терма первой входной переменной. Таким образом, все нечеткие значения исходных данных должны быть описаны в нечеткой системе (fis-cтруктуре). Эта fis-cтруктура а также значения FUZZY_LABEL должны быть доступны из m-функций, в которых в которых запрограммированы формулы функций принадлежности. Это реализуется через глобальные переменные FUZZY_LABEL и FISFI (нечеткая система).

Запрограммированы 3 функции принадлежности, аргументами которых могут быть как четкие, так и нечеткие числа. Это функции:

fsigmf - аналог сигмоидной функция принадлежности sigmf;
fgaussmf - аналог гауссовской функции принадлежности gaussmf;
fgbellmf - аналог колокообразной функции принадлежности gbellmf.

Чтобы нечеткие системы могли работать с нечеткими исходными данными необходимо в fis-файлах заменить имена функций принадлежностей входных переменных с sigmf на fsigmf, с gaussmf на fgaussmf, с gbellmf на fgbellmf. Если в Ваших системах функции принадлежности других типов, то необходимо написать аналогичные fgaussmf.m функции и вставить новую ветку case в файле fuzzy_input.m .

Перед вызовом функции нечеткого вывода evalfis необходимо объявить глобальные переменные FUZZY_LABEL и FISFI и присвоить им соответствующие значения. Значения FUZZY_LABEL устанавливается такое, чтобы оно было меньше левой границы диапазонов изменения входных переменных нечеткой системы FISFI.

В качестве примера приведем сценарий выполнения нечеткого вывода при x1=Low x2=Average и x3=Low для нечеткой системы 'sample_fuzzy.fis':

global FISFI
global FUZZY_LABEL
FISFI=readfis('sample_fuzzy');
FUZZY_LABEL=-1000;
evalfis([-1011 -1022 -1031], FISFI)

В результате получаем:

ans =     0.4006

Для входныx значений 1=Low x2=Average и x3=0.2 получаем:

evalfis([-1011 -1022 0.2], FISFI)
Warning: Some input values are outside of the specified input range.
> In C:\MATLAB6p5p1\toolbox\fuzzy\fuzzy\evalfis.m at line 73

ans =    0.5161

Для подавления предупреждения можно вместо функции evalfis использовать функцию evalfis_ww.

В оглавление книги \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика