sábado, 11 de octubre de 2014

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 disponibles\n");
 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("%.2f\n",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("%.2f\n",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("%.2f\n",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("%.2f\n",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("%.2f\n",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("%.2f\n",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("%.2f\n",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]);
 }
}

0 comments:

Publicar un comentario