/* * 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]); } }
Mostrando las entradas con la etiqueta logica difusa. Mostrar todas las entradas
Mostrando las entradas con la etiqueta logica difusa. Mostrar todas las entradas
sábado, 11 de octubre de 2014
Suscribirse a:
Entradas (Atom)