/* * Autor: A. L. I. Fernando Merino * Nombre del archivo: sistemaTakgi.c * Descripción: Simula un sistema difuso, usando el método de Takgi-Sugeno * genera un archivo con los puntos en pares (x,y) para graficar en gnuplot, * si desean graficar adicionalmente los puntos que estén utilizando generen * un archivo extra con los puntos y grafiquenlos, para comparar resultados * 24-octubre-2014*/ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <math.h> /*define el total de comandos que se enviará a gnuplot*/ #define NUM_COMANDOS 5 void seleccionGaussiana(); double gaussiana(double c, double gama, double x); double gaussDerecha(double c, double gama, double x); double gaussIzquierda(double c, double gama, double x); void graficarPuntosDesdeArchivo(char *cad, char *archivo, char *archivo1, char *archivo2); int main(){ printf("\n\tFunciones de Takgin-Sugeno\n"); seleccionGaussiana(); return 0; } void seleccionGaussiana(){ FILE * puntGI = fopen("gaussIzquierda.txt", "w"); FILE * puntGD = fopen("takagiSugeno.txt", "w"); FILE * archivoPuntos = fopen("gaussiana.txt", "w"); double x,cenGaus,anchoGaus,inicio, fin; double cenIzq,anchoIzq,cenDer,anchoDer; double ug=0,ugi=0,ugd=0,y1=0,y2=0,y3=0,y; /*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("Ingrese los siguientes datos:\n"); printf("Inicio de la muestra: "); scanf("%lf",&inicio); printf("Fin de la muestra: "); scanf("%lf",&fin); printf("\nConfigure la Gaussiana Izquierda:"); printf("\nIngresa el centro: "); scanf("%lf",&cenIzq); printf("Ingresa ancho a los lados del centro: "); scanf("%lf",&anchoIzq); printf("\nConfigure la Gaussiana central:"); printf("\nIngresa el centro: "); scanf("%lf",&cenGaus); printf("Ingresa ancho a los lados del centro: "); scanf("%lf",&anchoGaus); printf("\nConfigure la Gaussiana derecha:"); printf("\nIngresa el centro: "); scanf("%lf",&cenDer); printf("Ingresa ancho a los lados del centro: "); scanf("%lf",&anchoDer); for(x=inicio;x<=fin;x+=0.01){ /*obtiene el valor de las membresías de cada valor de x*/ ugi = gaussIzquierda(cenIzq,anchoIzq,x); ug = gaussiana(cenGaus,anchoGaus,x); ugd = gaussDerecha(cenDer,anchoDer,x); /*obtiene las y*/ y1=0.214285714*x+2.642857143; y2=-0.416666667*x+0.75; y3=0.342857143*x-1.528571429; /*se susitituye en la fórmula final*/ y=((ugi*y1)+(ug*y2)+(ugd*y3))/(ugi+ug+ugd); /*se guarda en un arhivo de texto con los puntos (x,y)*/ fprintf(puntGD, "%lf %lf \n", x, y); } fclose(archivoPuntos); fclose(puntGD); fclose(puntGI); graficarPuntosDesdeArchivo("set title \"Graficando funciones\"", "plot \"takagiSugeno.txt\" using 1:2 with lines", "replot \"puntosAnalizar.txt\" using 1:2 with lines", "replot \"gaussIzquierda.txt\" using 1:2 with lines"); } /*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 gaussIzquierda(double c, double gama, double x){ double ux = 0, expo=0; expo = pow((x-c)/gama,2); ux = pow(2.7182818284,-0.5*expo); if(x<=c){ ux=1; } return ux; } double gaussDerecha(double c, double gama, double x){ double ux = 0, expo=0; expo = pow((x-c)/gama,2); ux = pow(2.7182818284,-0.5*expo); if(x>c){ ux=1; } return ux; } void graficarPuntosDesdeArchivo(char *cad, char *archivo, char *archivo1, char *archivo2){ 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--->\"", archivo, archivo1, archivo2 }; /*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]); } }
viernes, 24 de octubre de 2014
Suscribirse a:
Comentarios de la entrada (Atom)
0 comments:
Publicar un comentario