Logo Studenta

IA17 - TP2 EVAL FUZZY

¡Este material tiene más páginas!

Vista previa del material en texto

FACULTAD DE INGENIERÍA - UNJu
	Burgos Luis Jesús 
Nombre 1
	36850852
DNI 1
	
	CÁTEDRA DE INTELIGENCIA ARTIFICIAL
	Copa Flavia Ayelen 
Nombre 2
	37635195
DNI 2
	TP2 - EVALUATORIO - 2017
	Guanca Jorge Daniel Antonio
Nombre 3
	37094295
DNI 3
	LÓGICA FUZZY Y SISTEMAS DE INFERENCIA
	LA LIGA DE LA JUSTICIA
Grupo
	21/05/2017
Fecha de entrega
1. Interfaz para sistema FIS genérico (3 puntos).
Un sistema de inferencia fuzzy genérico contiene tres variables, dos de entrada (x, y) y una de salida (z). Las variables (x, y, z) toman valores en el intervalo [0,10], y sus funciones de pertenencia son:
µlow = trapmf(-5,0,3,8)		µhigh = trapmf(4,6,10,12)
La base de conocimiento está formada por las siguientes reglas:
regla 1: if x is low and y is low then z is high
regla 2: if x is low and y is high then z is low
regla 3: if x is high and y is low then z is low
regla 4: if x is high and y is high then z is high
Este sistema FIS utiliza una implicación tipo Mamdani y una defuzzificación por centroide. 
a) Crear una interfaz de usuario e implementar sobre ella el sistema FIS descripto. 
Orientación: Utilizar el generador de interfaces GUIDE (Ver Corcuera J., Creación de interfaces de usuario con Matlab – GUIDE).
b) Comprobar el funcionamiento de la interfaz, con las siguientes entradas al sistema:
b1) (x ; y) = (0 ; 3.2) ; b2) (x ; y) = (5.5 ; 1.3)
c) Mostrar el trazado de la superficie de inferencia.
Resolución
Para empezar vamos a realizar el sistema FIS usando el toolbox de matlab quedando de la siguiente forma
Siendo las funciones de pertenencia de las variables x,y,z:
Y las reglas del sistema:
1. a) La interfaz de usuario es la siguiente:
La interfaz se diseñó usando la herramienta GUI proporcionada por matlab.
Para implementar el sistema FIS se creó una variable global ‘sistema’ a la que se le asigna el sistema creado anteriormente con la interfaz fuzzy
function FIS_OpeningFcn(hObject, eventdata, handles, varargin)
 
%%%%%%%%%%%% Aca se le asigna a la variable sistema el FIS
global sistema
sistema = readfis('FISgenericoSISTEMA.fis');
En la parte superior se muestran las reglas del sistema FIS usado.
En la parte inferior de la GUI se encuentran 2 campos en los que se introduce los valores de las variables X e Y y un tercer campo no editable en el que se muestra el valor resultante de la defuzzificacion aplicando el método del centroide,
El botón limpiar cumpla función de borrar cualquier valor que tengan los campos del valor X y del valor Y, su código es el siguiente:
function limpiarbtn_Callback(hObject, eventdata, handles)
% hObject handle to limpiarbtn (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
 
set(handles.valorxtxt,'String','');
set(handles.valorytxt,'String','');
set(handles.resultadotxt,'String','');
El boton ‘Resolver’ toma los valores de los campos ‘valorX’ y ‘valorY’ y los asigna como valor de entrada para las variables X e Y respectivamente, luego con estas variables realiza la deffuzyficacion y muestra el resultado de la deffuzyficacion por el campo ‘Resultado’.
Si los campos ‘valorX’ y ‘valorY’ no tienen nada escrito el botón no realiza ninguna operación.
El código correspondiente al botón es que se muestra a continacion:
function resolverbtn_Callback(hObject, eventdata, handles)
% hObject handle to resolverbtn (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
 
%Se coloca la variable global sistema pues esta tiene el sistema FIS
global sistema
 
%En estas lineas se saca el contenido de los campos se los convierte a
%numeros y se lo asigna a unas variables
valorx = str2num(get(handles.valorxtxt,'String'));
valory = str2num(get(handles.valorytxt,'String'));
 
%En esta seccion nos fijamos si los campos no estan vacios y si es asi
%realizamos la evaluacion con el sistema FIS pasandole como variables de
%entrada las variables anteriormente asignadas, luego mostramos el
%resultado en el campo 'resultado'
if ~isempty(valorx) && ~isempty(valory)
 
 resultado = evalfis([valorx valory], sistema);
 set(handles.resultadotxt,'String',resultado);
end
Por ultimo el botón graficar superficie nos muestra el grafico de la superficie correspondiente al sistema fuzzy. Para ello se crea una nueva ventana la cual contendrá el grafico y desde el botón ‘Graficar Superficie’ esa ventana es invocada como se muestra en su código:
function graficarbtn_Callback(hObject, eventdata, handles)
 
%La otra ventana se llama superficie
superficie
Y el código correspondiente a la ventana ‘superficie’ es:
function superficie_OpeningFcn(hObject, eventdata, handles, varargin)
 
 
%Se asigna el sistema FIS a la variable 'sistema' para luego generar la
%superficie correspondiente al sistema
 
global sistema
sistema = readfis('FISgenericoSISTEMA.fis');
gensurf(sistema)
Para iniciar la GUI simplemente escribimos su nombre en la línea de comandos, el nombre de esta GUI es ‘FIS’:
1 b)
· Comprobamos el funcionamiento con los valores (x ; y) = (0 ; 3.2) y obtenemos:
Podemos ver que el resultado es el correcto comparándolo con viewer rule del matlab
· Comprobamos el funcionamiento con los valores (x ; y) = (5.5 ; 1.3) y obtenemos:
Como en el anterior comparamos con el rule viewer
Vemos que en ambos casos el resultado es el correcto
1 c) Para mostrar la superficie de inferencia simplemente hacemos click en el boton de ‘Graficar Superficie’ de nuestra GUI y obtenemos el grafico
Ahora lo comparamos con el ofrecido por el surface viewer de matlab y demostramos que es exactamente el mismo
2. Sistema de predicción fuzzy (3 puntos).
Un sistema FIS se puede configurar para desempeñarse como un sistema de predicción. Utilizando la GUI fuzzy, configurar un sistema de predicción para el valor del dólar, bajo las siguientes consideraciones:
a) Los datos que se proponen están contenidos en una , serie histórica de variación diaria del valor del dólarpara la compra y la venta (del banco) en el periodo 03-01-2012 al 03-05-2013.
b) La serie se dispone en un archivo (dolar.csv) que puede ser leído directamente por Matlab o con Excel (archivo de base de datos con formato de texto).
c) La variable de salida debe ser “venta(t+1)”. La variable de entrada puede ser “venta(t)”, “venta(t-1)”…, “venta(t-n)”, combinando cualquier conjunto de valores pasados de la serie, según criterio experto. 
d) Adicionalmente, para mejorar la predicción se puede involucrar como segunda variable de entrada, la serie “compra” con valores pasados de la serie, desde t hasta t-1, según criterio experto.
e) Las variables de entrada y salida se deben particionar como mínimo con tres particiones, por ejemplo: “BAJO”, “ESTABLE” y “ALTO”. Pueden utilizarse más particiones a criterio del experto. Establecer los alcances de acuerdo a los valores de las series.
f) Elegir convenientemente las funciones de pertenencia. 
g) El paso de predicción debe ser de 1 día, es decir, si se considera que el momento actual es t = 4/abr/2013, la predicción será para t+1 = 5/abr/2013.
h) Crear una base de reglas (mínimo 5 reglas) de predicción utilizando la asistencia de un experto en finanzas/dólar. Como ejemplo se muestran las siguientes reglas:
SI variación en últimos 10 días fue ‘alta’ Y ayer el valor fue ‘estable’ ENTONCES mañana el valor será ‘bajo’.
SI valor 1 año atrás fue ‘bajo’ Y valor 6 meses atrás fue ‘medio’ ENTONCES mañana el valor será ‘alto’.
Como prueba del sistema se requiere:
a) Comprobar el funcionamiento del predictor fuzzy con tres instancias diferentes, una al principio de la serie, otra a mitad de la serie y otra en alguno de los valores finales.
b) Calcular el error de predicción en cada caso.
c) Escribir conclusiones respecto de los resultados y funcionamiento del sistema.
Resolución 
Se planteó un sistema FIS con tres variables de entrada:
· Precio de venta del dólar del día anterior.
· Precio de venta del dólar del día actual.
· Preciode venta del dólar de hace 30 días.
Y una variable de salida:
· Valor del dólar
Tanto las variables de entradas y como la variable de salida se particionaron en tres particiones: 
· “BAJO”: valores que van desde 2 a 5.99
· “ESTABLE”: valores comprendidos entre 6 y 7.99
· “ALTO: valores comprendidos entre 8 y 12
Entradas: 
· Precio de venta del dólar del día anterior.
· Precio de venta del dólar del día actual.
· Precio de venta del dólar de hace 30 días.
Salida:
· Valor del dólar
Reglas genaradas:
· SI el precio de venta de ayer fue ‘alto’ Y el precio de venta de hoy es ‘estable’ ENTONCES mañana el valor será ‘estable’.
· SI el precio de venta de ayer no fue ‘estable’ Y el precio de venta hoy es ‘alto’ Y el precio de venta hace 30 días era ‘alto’ ENTONCES mañana el valor será ‘alto’.
· SI el precio de venta de ayer fue ‘bajo’ Y el precio de venta hoy no es ‘estable’ Y el precio de venta hace 30 días no era ‘alto’ ENTONCES mañana el valor será ‘bajo’.
· SI el precio de venta de ayer fue ‘alto’ Y el precio de venta hoy es ‘bajo’ ENTONCES mañana el valor será ‘estable’.
· SI el precio de venta hoy es ‘alto’ Y el precio de venta hace 30 días era ‘estable’ ENTONCES mañana el valor será ‘estable’.
Prueba del sistema:
a) Funcionamiento del predictor fuzzy.
Primera instancia: 
02-02-2012 Valor a predecir “4.7750" 
· Precio de venta del dólar del día anterior: 4.7900 (31-01-2012)
· Precio de venta del dólar del día actual: 4.7750 (01-02-2012)
· Precio de venta del dólar de hace 30 días: 4.745 (03-01-2012)
Segunda instancia: 
22-01-2013 Valor a predecir “7.4300" 
· Precio de venta del dólar del día anterior: 7.4800 (18-01-2013)
· Precio de venta del dólar del día actual: 7.4400 (21-01-2013)
· Precio de venta del dólar de hace 30 días: 6.6100 (21-12-2012)
Tercera instancia: 
03-05-2013 Valor a predecir “9.8800" 
· Precio de venta del dólar del día anterior: 9.400 (30-04-2013)
· Precio de venta del dólar del día actual: 9.6300 (02-05-2013)
· Precio de venta del dólar de hace 30 días: 8.3000 (03-04-2013)
b) Calculo del error de predicción: 
Primera instancia: 
Valor real: 4.7750 
Valor obtenido por predicción: 3.9000 (Bajo)
Segunda instancia: 
Valor real: 7.4300
Valor obtenido por predicción: 7.6600 (Estable)
Tercera instancia: 
Valor real: 9.8800
Valor obtenido por predicción: 9.9300 (Alto)
c) Conclusión respecto de los resultados y funcionamiento del sistema
Si bien los resultados obtenidos generan errores un poco grandes, se podría afirmar que la predicción es buena, ya que los resultados obtenidos en cada caso están dentro de las particiones correspondientes a donde pertenecen.
Con respecto al funcionamiento del sistema, se planteó el sistema solamente teniendo en cuenta el valor del dólar para la venta de la serie histórica de variación diaria del valor del dólar. Según los valores ingresados en sistema a través de las reglas propuestas lo que hace es predecir un valor cercano al que queremos predecir, más que nada tratando de que ese valor quede dentro de su partición correspondiente. 
3. Controlador fuzzy en Simulink (4 puntos).
La figura siguiente representa un mezclador de agua con dos corrientes:
a) Corriente fría a temperatura TF = 25ºC y caudal FF = 100 L/seg.
b) Corriente caliente a temperatura TC = 70ºC y caudal FC = 100 L/seg.
Las entradas x_fria y x_caliente representan a las válvulas que dejan pasar el caudal de cada corriente, según el valor que reciben que puede estar entre 0 (cerrada) y 1 (abierta). Las salidas Temperatura y Caudal, representan los valores de la corriente mezcla, según las posiciones de las válvulas, y los valores resultantes se observan en los bloques “Display”. Se puede hacer funcionar el mezclador “manualmente” dando valores a las entradas (archivo mezclador_block.mdl).
Fig. 1. Modelo de mezclador de caudales.
Para el modelo se requiere:
a) Implementar un controlador fuzzy tipo PD, solamente para una de las variables controladas (temperatura o caudal de salida), dejando la otra con una referencia fija (ver Fig. 7 y Fig. 10 del paper “Control fuzzy MIMO”).
b) Utilizar las tablas de MacVicar-Whelan, correspondiente a tres particiones.
c) Configurar el controlador creado (guardado en la memoria de trabajo) como un bloque de Simulink, utilizando el bloque “Fuzzy Logic Controller” contenido en la librería Fuzzy Logic Toolbox de Simulink.
d) Abrir el modelo sobre Simulink.
e) Acoplar el bloque controlador sobre el modelo (Ver Fig. 10 del paper Control fuzzy MIMO”).
f) Comprobar el modelo completo con un referencia fija (Librería Simulink/ sources/Constant), con una referencia escalón (Librería Simulink/sources/Step),y con una referencia rampa (Librería Simulink/sources/Ramp).
g) Acoplar a las salidas un bloque “display” para ver el desarrollo del sistema.
h) Generar conclusiones respecto de los resultados y del funcionamiento del sistema.
Resolución
a) Para implementar el fuzzy PD optamos por controlar la variable de salida ‘Caudal’ para hacerlo utilizamos la interfaz fuzzy del sistema a la que se accede escribiendo el comando fuzzy. El controlador esta nombrado como fuzzyPD, definimos 2 variables de entradas: el error, y la variación de error. Ambas con un rango de [-1,1] y sus funciones de pertenencia son las siguientes donde N es negativo Z es cero y P positivo:
Las variables de salida son XF y XC que representan cuan abierta están las válvulas de agua fría y cerrada respectivamente. Para poder minimizar el error obtenido en los resultados finales decidimos usar 2 funciones hombro y una triangulo, que representan cerrado, medio y abierto con un rango [-1 2] como se muestra a continuación
b) Para la base de reglas utilizamos la tabla de MacVicar-Whelan correspondiente a tres particiones. Las reglas son:
c) Este es el controlador fuzzy abierto en un bloque en simulink:
d) e) f) g)Basándonos en el modelo del paper acoplamos nuestro controlador de la siguiente forma, (se mostrara el sistema en 2 partes debido al tamaño de este) (TAMBIEN SE ADJUNTA UN PDF CON LA IMAGEN DEL MISMO)
Figura 1/3
Figura 2/3
Figura 3/3
Cada salida posee un display y se incluyó switchs para poder elegir entre usar rampa, escalón o el set point la ejecución de cada uno brindo resultados aproximados a los deseados.
h)
El sistema fuzzy que realizamos presenta muy buenos resultados una vez implementado y acoplado al mezclador en el simulink este solo presenta un error del 0,83% para todo caudal entre el 0 y 100 Litros que es el rango de salida del caudal. Para poder llegar a este valor se tuvieron que realizar muchas modificaciones en el controlador fuzzy al usar funciones de pertenencias del tipo triangulo y un rango entre el [0 1] para la variable de salida se obtenían buenos resultados para los valores entre el 60 y 80 Litros del caudal pero al alejarse de esos valores el error aumentaba demasiado hasta un 15% en los valores más alejados por lo que procedimos a intentar disminuir este error. Al observar las distintas salidas del controlador a través del rule viewer pudimos detectar que por el método de defuzzyficacion centroide nunca se llegaba a los extremos del rango para la variable de salida es decir que nunca se obtenía un valor de válvula totalmente cerrada o abierta cuando era necesario por lo que modificamos el rango y experimentamos con diferentes funciones de pertenencia para buscar aquella que tenga el menor error y así llegamos a las utilizar 2 funciones hombros (cerrado,abierto) y una triangulo (medio) para la variable de salida con un rango entre -1 y 2 de esta forma al defuzzyficar si se obtendrían valores entre 0 y 1 pero esto también provocaba que hayan posibilidades de que se obtengan valores entre -1 y 0 , 2 1 y 2 asi que estas cuestiones se abordaron en el simulink
En el simulink utilizamos varios bloques para poder ajustar los valores que entraban como variables de entrada tanto al controlador fuzzy como al mezclador. Los principales bloques usados fueron los limitadores estos los ajustamos según elrango que era necesario y permitido por el controlador fuzzy y el mezclador, lo que hacen básicamente es si reciben un valor mayor o menor al rango el bloque les asigna el valor más próximo dentro del rango por ejemplo si un limitador admite un rango entre 0 y 1, y recibe un 2 este bloque envía como salida el valor 1
También usamos unos bloques de ganancias para poder ajustar los valores, estos multiplican el valor entrante por el valor que tengan asignado. Generalmente lo usamos para pasar los valores enteros a decimales como por ejemplo un 70 lo representábamos como 0,7 básicamente una división por 100
Los bloques de delay son obligatorios para un controlador del tipo proporcional derivativo ya que es necesario en todo momento comparar el valor de salida actual con el valor de salida de la iteración anterior resultado de la realimentación.
El sistema acoplado funciona seleccionando uno de los valores deseados ya sea usando el bloque pasos, rampa, o el colocar un valor de referencia (este es el más aconsejado para probar distintos valores y ver el funcionamiento del sistema siempre entre el rango [0 100])
Una vez elegido la forma de ejecución simplemente se presiona el botón de ejecución para que este muestre la salida deseada más aproximada.
El sistema realiza una secuencia de restas entre el valor de referencia deseado y el valor de salida obtenido para obtener el error y también otra resta con el error anterior para obtener su variación.
Estos dos valores son pasados por un limitador para adecuar su rango y luego entran al controlador fuzzy y al defuzzyficar se obtienen dos salidas una que corresponde a la posición de la válvula de agua fría y otra que corresponde a la de agua caliente. Estos valores son nuevamente ajustados con los bloques ganancias y sumados a los obtenido anteriormente pasando antes por un limitador y luego son enviados al mezclador.
Luego de realizar sus operaciones el mezclador devuelve a la salida la temperatura y caudal del agua obtenida. Como la variable controlada es el caudal la salida de estas es realimentada para compararla si coincide, es menor, o es mayor que el valor deseado (valor de referencia) calculando el error de la salida y repitiendo el proceso en torno al valor deseado.
Como ya mencionamos los resultados obtenidos son bastante aceptables solo presentan un error del 0,83% para todo valor entre 0 y 100.
Por ejemplo si establecemos en el sistema como valor de referencia 60 y ejecutamos a la salida obtenemos el valor 60,83 como se muestra a continuación:
ENTRADA
SALIDA
Ahora introducimos el valor 20:
ENTRADA
SALIDA
También podemos observar cómo va evolucionando la salida de acuerdo a los valores de referencia en la siguiente imagen
En amarillo el valor deseado, y en violeta el valor obtenido a la salida con una diferencia de 0.83
█
IA 2017 – TP2EVAL - #17

Continuar navegando