Funciones de membresía en c logíca difusa


/*
* Autor: A. L. I. Fernando Merino
* Nombre del archivo: funcionesMembresia.c
* Descripción: Grafica en gnuplot los puntos ordeandos e inicializados
* en los arreglos (valoresX, valoresY)
* 10-octubre-2014*/

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>

#define NUM_PUNTOS 11
#define NUM_COMANDOS 4

void seleccionHombroIzquierdo();
void seleccionHombroDerecho();
void seleccionTriangular();
void seleccionSimoidal();
void seleccionTrapezoidal();
void seleccionGaussiana();
void seleccionCampana();

void graficarPuntosDesdeArchivo(char *cad);
double hombroIzquierdo(double a, double b, double x);
double hombroDerecho(double a, double b, double x);
double triangular(double a, double b, double c, double x);
double simoidal(double a, double c, double x);
double trapezoidal(double a, double b, double c, double d, double x);
double campana(double a, double b, double c, double x);
double valorAbsoluto(double x, double c, double gama);
double gaussiana(double c, double gama, double x);

int main(){
int opc;
//while(1){
system("clear");
printf("n Funciones de membresía disponiblesn");
printf("n 1: Hombro izquiero");
printf("n 2: Hombro derecho");
printf("n 3: Triangular");
printf("n 4: Trapezoidal");
printf("n 5: Simoidal");
printf("n 6: Gaussiana");
printf("n 7: Campana");
printf("n 8: Salir");
printf("n Ingresa tu opción: ");
scanf("%d",&opc);
switch(opc){
case 1:
seleccionHombroIzquierdo();
break;
case 2:
seleccionHombroDerecho();
break;
case 3:
seleccionTriangular();
break;
case 4:
seleccionTrapezoidal();
break;
case 5:
seleccionSimoidal();
break;
case 6:
seleccionGaussiana();
break;
case 7:
seleccionCampana();
break;
case 8:
exit(0);
}
//}
return 0;
}
void seleccionHombroIzquierdo(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa b: ");
scanf("%lf",&b);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = hombroIzquierdo(a,b,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Hombro izquierdo"");
}

void seleccionHombroDerecho(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa b: ");
scanf("%lf",&b);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = hombroDerecho(4,5,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Hombro derecho"");
}

void seleccionTriangular(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,c,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa b: ");
scanf("%lf",&b);
printf("n Ingresa c: ");
scanf("%lf",&c);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = triangular( a, b, c,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Triangular"");
}

void seleccionTrapezoidal(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,c,d,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa b: ");
scanf("%lf",&b);
printf("n Ingresa c: ");
scanf("%lf",&c);
printf("n Ingresa d: ");
scanf("%lf",&d);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = trapezoidal(a,b,c,d,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Trapezoidal"");
}

void seleccionGaussiana(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa ancho: ");
scanf("%lf",&b);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = gaussiana(a,b,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Gaussiana"");
}

void seleccionCampana(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,c,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa b: ");
scanf("%lf",&b);
printf("n Ingresa c: ");
scanf("%lf",&c);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = campana(a,b,c,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Campana"");
}


void seleccionSimoidal(){
FILE * archivoPuntos = fopen("puntosGraficar.txt", "w");
double x,a,b,inicio, fin;
double ux=0;
/*datos que se pueden configurar:
* muestreo [0,20]
* las variables a y b se pueden leer desde teclado, a tiene que ser menor a b
* opcionalmente también se puede especificar el perido de muestreo*/
printf("n Inicio de la muestra: ");
scanf("%lf",&inicio);
printf("n Fin de la muestra: ");
scanf("%lf",&fin);
printf("n Ingresa a: ");
scanf("%lf",&a);
printf("n Ingresa b: ");
scanf("%lf",&b);
for(x=inicio;x<=fin;x+=0.01){
printf("%.2fn",x);
ux = simoidal(a,b,x);
fprintf(archivoPuntos, "%lf %lf n", x, ux);
}
fclose(archivoPuntos);
graficarPuntosDesdeArchivo("set title "Graficando funcion de membresía - Simoidal"");
}

/*funciones finales de membresia*/
double gaussiana(double c, double gama, double x){
double ux = 0, expo=0;
expo = pow((x-c)/gama,2);
ux = pow(2.7182818284,-0.5*expo);
return ux;
}

double campana(double a, double b, double c, double x){
double ux=0;
double abs = valorAbsoluto(x, c, a);
ux = 1 / (1 + pow(abs,2*b));
return ux;
}

double valorAbsoluto(double x, double c, double gama){
double abs=0;
abs = (x - c) / gama;
if(abs < 1){
abs = abs * -1;
}
return abs;
}

double simoidal(double a, double c, double x){
double ux=0;
ux = 1/(1+(pow(2.7182,-a*(x-c))));
return ux;
}

double trapezoidal(double a, double b, double c, double d, double x){
double ux=0;
if(x<=a){
ux=0;
}
if(x>a && x<b){
ux=(x-a)/(b-a);
}
if(x>=b && x<=c){
ux=1;
}
if(x>c && x<d){
ux = (d-x)/(d-c);
}
if(x>d){
ux=0;
}
return ux;
}

double hombroIzquierdo(double a, double b, double x){
double ux=0.0;
if(x<=a){
ux=1;
}
if(x>a && x<b){
ux=(b-x)/(b-a);
}
if(x>b){
ux=0;
}
return ux;
}

double hombroDerecho(double a, double b, double x){
double ux=0;
if(x<=a){
ux=0;
}
if(x>a && x<b){
ux=(x-a)/(b-a);
}
if(x>b){
ux=1;
}
return ux;
}

double triangular(double a, double b, double c, double x){
double ux=0;
if(x<=a){
ux=0;
}
if(x>a && x<b){
ux=(x-a)/(b-a);
}
if(x==b){
ux=1;
}
if(x>b && x<c){
ux = (c-x)/(c-b);
}
return ux;
}

void graficarPuntosDesdeArchivo(char *cad){
int i;
/*lista de comandos para ejecutar y configurar la visualización que tendrán
* los puntos en la gráfica con gnuplot*/
char * configGnuplot[] = {cad,
"set ylabel "----grado de membresía--->"",
"set xlabel "----Universo X--->"",
"plot "puntosGraficar.txt" using 1:2 with lines"
};

/*Se crea una archivo de tipo popen, es una tebería IPC que se usa, para
* ejecutar gnuplot y enviarle el archivo a graficar*/
//FILE * ventanaGnuplot = popen("gnuplot -persist", "w");
FILE * ventanaGnuplot = popen("gnuplot -persist", "w");
// Executing gnuplot commands one by one
for (i=0;i<NUM_COMANDOS;i+ +){
fprintf(ventanaGnuplot, "%s n", configGnuplot[i]);
}
}

Comentarios:

@