Funciones de Membresía MATLAB Control Inteligente González Moreno Antonio de Jesús - March 10, 2016
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
1
Introduction La Lógica Difusa proporciona un mecanismo de inferencia que permite simular los procedimientos de razonamiento humano en sistemas basa- dos en el conocimiento. La teoría de la lógica difusa proporciona un marco matemático que permite modelar la incertidumbre de los procesos cognitivos humanos de forma que pueda ser tratable por un computador. En este primer capítulo se describirán los fundamentos y características de este mecanismo de representación de la incertidumbre. Lógica Difusa
Básicamente la Lógica Difusa es una lógica multivaluada que per- mite representar matemáticamente la incertidumbre y la vaguedad, proporcionando herramientas formales para su tratamiento. En ocaciones podemos llegar a tener problemas cuando nos encontrarnos con algo como: “Cuando aumenta la complejidad, los enunciados precisos pierden su significado y los enunciados útiles pierden precisión.”, que puede resumirse como que “los árboles no te dejan ver el bosque”. Básicamente, cualquier problema del mundo puede resolverse como dado un conjunto de variables de entrada (espacio de entrada), obtener un valor adecuado de variables de salida (espacio de salida). La lógica difusa permite establecer este mapeo de una forma adecua- da, atendiendo a criterios de significado (y no de precisión). El término Lógica Difusa fue utilizado por primera vez en 1974. Actualmente se utiliza en un amplio sentido, agrupando la teoría de con- junto difusos, reglas si-entonces, aritmética difusa, cuantificadores, etc. En este curso emplearemos este significado extenso el término.
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
2
Funciones de Membresía
Función Triangular
Función Trapezoidal
Función Gaussiana
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
3
Función Gaussiana
Función Sigmoidal
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
4
Objetivos Generales
Desarrollar un programa en MATLAB que muestre las principales Funciones de Membresía. Objetivos Particulares -
Desarrollar un script para cada función de membresía.
-
Crear un programa en MATLAB utilizando las Funciones de Membresía definidas anteriormente que muestre gráficamente una función univaluada en un universo de discurso dado, así como en un punto definido.
-
Elaborar un entorno GUI para el programa anterior con una ventana interactiva en la cual el usuario pueda ingresar los datos y observar el resultante en un entorno visual.
Desarrollo
Funciones de Membresía (Script)
Triangular function y = triangular(x, params) if nargin ~= 2 error('Dos argumentos son requeridos por la FM Triangular.'); elseif length(params) < 3 error('La FM Triangular requiere por lo menos 3 parametros.'); end a = params(1); b = params(2); c = params(3); % Para calcular la funci?n triangular existen dos m?todos ?tiles: % - Evaluacion de sus puntos cr?ticos y pendientes % - Maximos y minimos de los valores ingresados mediante una evaluaci?n % de los valores con respecto a ?0? (find, zeros, ones) % Puntos criticos y evaluaci?n parametrica de la funci?n %if x <= a, % y = 0; %elseif (a <= x & b >= x), % y = (x - a) / (b - a); %elseif (b <= x & c >= x), % y = (c - x) / (c - b); %elseif c <= x, % y = 0;
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
5
%end % Maximos y Minimos if a > b, error('Condicion parametrica invalida: a > b'); elseif b > c, error('Condicion parametrica invalida: b > c'); elseif a > c, error('Condicion parametrica invalida: a > c'); end y = zeros(size(x)); % Shoulders izquierdo y derecho(y = 0) index = find(x <= a | c <= x); y(index) = zeros(size(index)); % Pendiente Izquierda if (a ~= b) index = find(a < x & x < b); y(index) = (x(index)-a)/(b-a); end % Pendiente Derecha if (b ~= c) index = find(b < x & x < c); y(index) = (c-x(index))/(c-b); end % Centro (y = 1) index = find(x == b); y(index) = ones(size(index));
Trapezoidal function y = trapezoidal(x, params) if nargin ~= 2 error('Dos argumentos son requeridos por la FM Trapezoidal.'); elseif length(params) < 4 error('La FM Trapezoidal requiere por lo menos 4 parametros.'); end a = params(1); b = params(2); c = params(3); d = params(4); % Para calcular la funci?n trapezoidal existen dos m?todos ?tiles: % - Evaluacion de sus puntos cr?ticos y pendientes % - Maximos y minimos de los valores ingresados mediante una evaluaci?n % de los valores con respecto a ?0? (find, zeros, ones) % Puntos criticos y evaluaci?n parametrica de la funci?n %if x <= a, % y = 0; %elseif (a <= x & b >= x), % y = (x - a) / (b - a); %elseif (b <= x & c >= x), % y = 1; %elseif (b <= x & c >= x), % y = (d - x) / (d - c); %elseif d <= x,
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
6
% y = 0; %end if a > b, error('Condicion parametrica invalida: a > b'); elseif c > d, error('Condicion parametrica invalida: c > d'); end y1 = zeros(size(x)); y2 = zeros(size(x)); % y1 index = find(x >= b); if ~isempty(index), y1(index) = ones(size(index)); end index = find(x < a); if ~isempty(index), y1(index) = zeros(size(index)); end index = find(a <= x & x < b); if ~isempty(index) & a ~= b, y1(index) = (x(index)-a)/(b-a); end % y2 index = find(x <= c); if ~isempty(index), y2(index) = ones(size(index)); end index = find(x > d); if ~isempty(index), y2(index) = zeros(size(index)); end index = find(c < x & x <= d); if ~isempty(index) & c ~= d, y2(index) = (d-x(index))/(d-c); end %y y = min(y1, y2);
Gaussiana function y = campanagauss(x, params) if nargin ~= 2 error('Se requieren dos argumentos por la FM Campana de Gauss.'); elseif length(params) < 2 error('La FM de Gauss necesita por lo menos dos parametros.'); elseif params(1) == 0, error('La FM de Gauss necesita un valor diferente de cero para Sigma.'); end sigma = params(1); c = params(2); y = exp(-(x - c).^2/(2*sigma^2));
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
7
Gaussiana Generalizada function y = gaussbellgeneralized(x, params) % GAUSSBELLGENERALIZED(X, [A, B, C]) = 1./((1+ABS((X-C)/A))^(2*B)); if nargin ~= 2 error('Dos argumentos son requeridos por la FM Gauss Generalizada.'); elseif length(params) < 3 error('La FM Campana Generalizada necesita por lo menos 3 parametros.'); elseif params(1) == 0, error('Parametro inv?lido en gaussbellgeneralized() --> a == 0'); end a = params(1); b = params(2); c = params(3); tmp = ((x - c)/a).^2; if (tmp == 0 & b == 0) y = 0.5; elseif (tmp == 0 & b < 0) y = 0; else tmp = tmp.^b; y = 1./(1 + tmp); end
Sigmoidal function y = sigmf(x, params) % SIGMOIDAL(X, [A, C]) = 1./(1 + EXP(-A*(X-C))) if nargin ~= 2 error('Dos argumentos son requeridos por la FM sigmoidal.'); elseif length(params) < 2 error('La FM sigmoidal requiere al menos dos parametros.'); end a = params(1); c = params(2); y = 1./(1 + exp(-a*(x-c)));
Script General (Entorno GUI) function varargout = MembershipFunctions(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @MembershipFunctions_OpeningFcn, ... 'gui_OutputFcn', @MembershipFunctions_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
8
function MembershipFunctions_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = MembershipFunctions_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; axes(handles.axes1) imshow(imread('ESIME-Logo.png')); axes(handles.axes2) imshow(imread('IPN-Logo1.png')); function popupmenu1_Callback(hObject, eventdata, handles) contenido = get(hObject,'String'); MemberFunction = get(hObject,'Value'); function popupmenu1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit1_Callback(hObject, eventdata, handles) vector = get(handles.edit1,'String'); x = str2num(vector); function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function pushbutton1_Callback(hObject, eventdata, handles) MemberFunction = get(handles.popupmenu1,'Value') x = sort(str2num(get(handles.edit1,'String'))); %f = find(x == str2num(get(handles.edit2,'String'))); %x1 = x(f); x1 = str2num(get(handles.edit2,'String')); switch MemberFunction case 1 % Triangular % a = Izquierda % b = Centro % c = Derecha prompta = 'Ingrese el valor de a: '; a = input(prompta); promptb = 'Ingrese el valor de b: '; b = input(promptb); promptc = 'Ingrese el valor de c: '; c = input(promptc); promptizq = 'Ingrese el rango inferior: '; izq = input(promptizq); promptder = 'Ingrese el rango superior: '; der = input(promptder); y = triangular(x,[a b c]); set(handles.text2,'String',num2str(y')); y1 = triangular(x1,[a b c]);
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
9
axes(handles.axes3) plot(x,y,x1,y1,'c*') grid on xlabel('Funcion de Membresia') xlim([izq der]) case 2 % Trapezoidal % a = Izquierda % b = MaxSubida % c = MaxBajada % d = Derecha prompta = 'Ingrese el valor de a: '; a = input(prompta); promptb = 'Ingrese el valor de b: '; b = input(promptb); promptc = 'Ingrese el valor de c: '; c = input(promptc); promptd = 'Ingrese el valor de d: '; d = input(promptd); promptizq = 'Ingrese el rango inferior: '; izq = input(promptizq); promptder = 'Ingrese el rango superior: '; der = input(promptder); y = trapezoidal(x,[a,b,c,d]); set(handles.text2,'String',num2str(y')); y1 = trapezoidal(x1,[a,b,c,d]); axes(handles.axes3) plot(x,y,x1,y1,'c*') %plot(x,y) grid on xlabel('Funcion de Membresia') ylim([-0.05 1.05]), xlim([izq der]) case 3 % Gausiana % Sigma = Ancho % x0 = Centro promptsigma = 'Ingrese el valor de sigma: '; sigma = input(promptsigma); promptx0 = 'Ingrese el valor de x0: '; x0 = input(promptx0); promptizq = 'Ingrese el rango inferior: '; izq = input(promptizq); promptder = 'Ingrese el rango superior: '; der = input(promptder); y = campanagauss(x,[sigma x0]); set(handles.text2,'String',num2str(y')); y1 = campanagauss(x1,[sigma x0]); axes(handles.axes3) plot(x,y,x1,y1,'c*') %plot(x,y) grid on xlabel('Funcion de Membresia') ylim([-0.05 1.05]), xlim([izq der]) case 4 % Campana Generalizada % a = Ancho % b = Pendiente % x0 = Centro prompta = 'Ingrese el valor de a: '; a = input(prompta); promptb = 'Ingrese el valor de b: '; b = input(promptb); promptx0 = 'Ingrese el valor de x0: '; x0 = input(promptx0);
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
10
promptizq = 'Ingrese el rango inferior: '; izq = input(promptizq); promptder = 'Ingrese el rango superior: '; der = input(promptder); y = gaussbellgeneralized(x,[a b x0]); set(handles.text2,'String',num2str(y')); y1 = gaussbellgeneralized(x1,[a b x0]); axes(handles.axes3) plot(x,y,x1,y1,'c*') %plot(x,y) grid on xlabel('Funcion de Membresia') ylim([-0.05 1.05]), xlim([izq der]) case 5 % Sigmoidal % a = Pendiente % a > 0 Abre por la derecha % a < 0 Abre por la Izquierda % x0 = Cruce prompta = 'Ingrese el valor de a: '; a = input(prompta); promptx0 = 'Ingrese el valor de x0: '; x0 = input(promptx0); promptizq = 'Ingrese el rango inferior: '; izq = input(promptizq); promptder = 'Ingrese el rango superior: '; der = input(promptder); y = sigmoidal(x,[a x0]); set(handles.text2,'String',num2str(y')); y1 = sigmoidal(x1,[a x0]); axes(handles.axes3) plot(x,y,x1,y1,'c*') %plot(x,y) grid on xlabel('Funcion de Membresia') ylim([-0.05 1.05]), xlim([izq der]) otherwise warning('Funcion no encontrada.') end function edit2_Callback(hObject, eventdata, handles) function edit2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
11
Uso de la Aplicación (GUI) 1 .- Escoger la Función de Membresía. 2 .- Ingresar el “Universo de Discurso” con los valores deseados. 3 .- Ingresar el “Valor de Membresía” particular que se desea visualizar.
Figura 1. Ingreso de Valores. 4 .- Ingresar en la ventana de comandos los valores requeridos para definir la función en los puntos deseados. 5 .- Ingresar el rango minimo y máximo de la gráfica.
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
12
Figura 2. Ingreso de Parámetros de Evaluación. 6 .- El resultado de la operación se muestra a continuación en la Figura 3.
Figura 3. Resultado final de la operación.
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
13
Nota: El “Valor de Membresía” que se ingrese debe estar contenido dentro de los valores del “Universo de Discurso”. Este es definido con fines visuales y demostrativos para comprobar el punto evaluado con los parámetros de entrada establecidos por el usuario, el asterisco de color azul muestra el “Valor de Membresía”, mientras que la figura en color azul representa el “Universo de Discurso” utilizado para visualizar gráficamente la evaluación del “Valor de Membresía” dentro de la misma función. El “Valor del vector y” indica el valor numérico de la evaluación del “Valor de Membresía”.
Conclusiones
Los controladores difusos son una manera de obtener un control basado en variables lingüísticas bastante acertivo y tan aproximado y eficiente como lo sea la definición de sus elementos en los cuales se desarrollan operaciones lógicas basadas en un conjunto de funciones llamadas Funciones de Membresía las cuales nos sirven para definir un universo de discurso en el cual realizaremos un análisis cualitativo de las variables de entrada para obtener una o más variables de salida que establezcan un manejo eficiente de la información de salida, ya sea en términos basados en ingeniería así como en otra clase de contextos como lo es la economía, la psicología, etc.
Bibliografía
Morillas Raya, A. (2006): Introducción al análisis de datos difusos.
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
14
Indice
Portada ………….……………………………………………………….………… 1 Introducción ………….…………………………………………………………… 2 Objetivos Generales ……………………………………………………………… 5 Objetivos Particulares ….………………………………………………………… 5 Desarrollo………….………………………….…………………………………… 5 Uso de la aplicación (GUI) …..…………………………………………… 12 Conclusiones ………….……………………………………………………..…… 14 Bibliografía ………….……………………………………………………………. 14
FUNCIONES DE MEMBRESÍA - CONTROL INTELIGENTE
15