/* * 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]); } }
sábado, 11 de octubre de 2014
Suscribirse a:
Comentarios de la entrada (Atom)
0 comments:
Publicar un comentario