{"id":1821,"date":"2014-10-11T16:42:00","date_gmt":"2014-10-11T21:42:00","guid":{"rendered":"http:\/\/linuxitos.com\/main\/funciones-de-membresia-en-c-logica-difusa\/"},"modified":"2014-10-11T16:42:00","modified_gmt":"2014-10-11T21:42:00","slug":"funciones-de-membresia-en-c-logica-difusa","status":"publish","type":"post","link":"https:\/\/linuxitos.com\/main\/funciones-de-membresia-en-c-logica-difusa\/","title":{"rendered":"Funciones de membres\u00eda en c log\u00edca difusa"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left;\">\n<pre>\/*<br \/> * Autor: A. L. I. Fernando Merino<br \/> * Nombre del archivo: funcionesMembresia.c<br \/> * Descripci\u00f3n: Grafica en gnuplot los puntos ordeandos e inicializados <br \/> * en los arreglos (valoresX, valoresY)<br \/> * 10-octubre-2014*\/<br \/><br \/>#include &lt;stdlib.h&gt;<br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;unistd.h&gt;<br \/>#include &lt;math.h&gt;<br \/><br \/>#define NUM_PUNTOS 11<br \/>#define NUM_COMANDOS 4<br \/><br \/>void seleccionHombroIzquierdo();<br \/>void seleccionHombroDerecho();<br \/>void seleccionTriangular();<br \/>void seleccionSimoidal();<br \/>void seleccionTrapezoidal();<br \/>void seleccionGaussiana();<br \/>void seleccionCampana();<br \/><br \/>void graficarPuntosDesdeArchivo(char *cad);<br \/>double hombroIzquierdo(double a, double b, double x);<br \/>double hombroDerecho(double a, double b, double x);<br \/>double triangular(double a, double b, double c, double x);<br \/>double simoidal(double a, double c, double x);<br \/>double trapezoidal(double a, double b, double c, double d, double x);<br \/>double campana(double a, double b, double c, double x);<br \/>double valorAbsoluto(double x, double c, double gama);<br \/>double gaussiana(double c, double gama, double x);<br \/><br \/>int main(){<br \/> int opc;<br \/> \/\/while(1){<br \/> system(\"clear\");<br \/> printf(\"n Funciones de membres\u00eda disponiblesn\");<br \/> printf(\"n 1: Hombro izquiero\");<br \/> printf(\"n 2: Hombro derecho\");<br \/> printf(\"n 3: Triangular\");<br \/> printf(\"n 4: Trapezoidal\");<br \/> printf(\"n 5: Simoidal\");<br \/> printf(\"n 6: Gaussiana\");<br \/> printf(\"n 7: Campana\");<br \/> printf(\"n 8: Salir\");<br \/> printf(\"n Ingresa tu opci\u00f3n: \");<br \/> scanf(\"%d\",&amp;opc);<br \/> switch(opc){<br \/>  case 1:<br \/>   seleccionHombroIzquierdo();<br \/>   break;<br \/>  case 2:<br \/>   seleccionHombroDerecho();<br \/>   break;<br \/>  case 3:<br \/>   seleccionTriangular();<br \/>   break;<br \/>  case 4:<br \/>   seleccionTrapezoidal();<br \/>   break;<br \/>  case 5:<br \/>   seleccionSimoidal();<br \/>   break;<br \/>  case 6:<br \/>   seleccionGaussiana();<br \/>   break;<br \/>  case 7:<br \/>   seleccionCampana();<br \/>   break;<br \/>  case 8:<br \/>   exit(0);<br \/> }<br \/> \/\/}<br \/>    return 0;<br \/>}<br \/>void seleccionHombroIzquierdo(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa b: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = hombroIzquierdo(a,b,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Hombro izquierdo\"\");<br \/>}<br \/><br \/>void seleccionHombroDerecho(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa b: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = hombroDerecho(4,5,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Hombro derecho\"\");<br \/>}<br \/><br \/>void seleccionTriangular(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,c,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa b: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> printf(\"n Ingresa c: \");<br \/> scanf(\"%lf\",&amp;c);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = triangular( a, b, c,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Triangular\"\");<br \/>}<br \/><br \/>void seleccionTrapezoidal(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,c,d,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa b: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> printf(\"n Ingresa c: \");<br \/> scanf(\"%lf\",&amp;c);<br \/> printf(\"n Ingresa d: \");<br \/> scanf(\"%lf\",&amp;d);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = trapezoidal(a,b,c,d,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Trapezoidal\"\");<br \/>}<br \/><br \/>void seleccionGaussiana(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa ancho: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = gaussiana(a,b,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Gaussiana\"\");<br \/>}<br \/><br \/>void seleccionCampana(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,c,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa b: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> printf(\"n Ingresa c: \");<br \/> scanf(\"%lf\",&amp;c);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = campana(a,b,c,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Campana\"\");<br \/>}<br \/><br \/><br \/>void seleccionSimoidal(){<br \/> FILE * archivoPuntos = fopen(\"puntosGraficar.txt\", \"w\");<br \/> double x,a,b,inicio, fin;<br \/> double ux=0;<br \/> \/*datos que se pueden configurar:<br \/>  * muestreo [0,20]<br \/>  * las variables a y b se pueden leer desde teclado, a tiene que ser menor a b<br \/>  * opcionalmente tambi\u00e9n se puede especificar el perido de muestreo*\/<br \/> printf(\"n Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"n Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"n Ingresa a: \");<br \/> scanf(\"%lf\",&amp;a);<br \/> printf(\"n Ingresa b: \");<br \/> scanf(\"%lf\",&amp;b);<br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  printf(\"%.2fn\",x);<br \/>  ux = simoidal(a,b,x);<br \/>  fprintf(archivoPuntos, \"%lf %lf n\", x, ux);<br \/> }<br \/> fclose(archivoPuntos);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funcion de membres\u00eda - Simoidal\"\");<br \/>}<br \/><br \/>\/*funciones finales de membresia*\/<br \/>double gaussiana(double c, double gama, double x){<br \/> double ux = 0, expo=0;<br \/> expo = pow((x-c)\/gama,2);<br \/> ux = pow(2.7182818284,-0.5*expo);<br \/> return ux;<br \/>}<br \/><br \/>double campana(double a, double b, double c, double x){<br \/> double ux=0;<br \/> double abs = valorAbsoluto(x, c, a);<br \/> ux = 1 \/ (1 + pow(abs,2*b));<br \/> return ux;<br \/>}<br \/><br \/>double valorAbsoluto(double x, double c, double gama){<br \/> double abs=0;<br \/> abs = (x - c) \/ gama;<br \/> if(abs &lt; 1){<br \/>  abs = abs * -1;<br \/> }<br \/> return abs;<br \/>}<br \/><br \/>double simoidal(double a, double c, double x){<br \/> double ux=0;<br \/> ux = 1\/(1+(pow(2.7182,-a*(x-c))));<br \/> return ux;<br \/>}<br \/><br \/>double trapezoidal(double a, double b, double c, double d, double x){<br \/> double ux=0;<br \/> if(x&lt;=a){<br \/>  ux=0;<br \/> }<br \/> if(x&gt;a &amp;&amp; x&lt;b){<br \/>  ux=(x-a)\/(b-a);<br \/> }<br \/> if(x&gt;=b &amp;&amp; x&lt;=c){<br \/>  ux=1;<br \/> }<br \/> if(x&gt;c &amp;&amp; x&lt;d){<br \/>  ux = (d-x)\/(d-c);<br \/> }<br \/> if(x&gt;d){<br \/>  ux=0;<br \/> }<br \/> return ux;<br \/>}<br \/><br \/>double hombroIzquierdo(double a, double b, double x){<br \/> double ux=0.0;<br \/> if(x&lt;=a){<br \/>  ux=1;<br \/> }<br \/> if(x&gt;a &amp;&amp; x&lt;b){<br \/>  ux=(b-x)\/(b-a);<br \/> }<br \/> if(x&gt;b){<br \/>  ux=0;<br \/> }<br \/> return ux;<br \/>}<br \/><br \/>double hombroDerecho(double a, double b, double x){<br \/> double ux=0;<br \/> if(x&lt;=a){<br \/>  ux=0;<br \/> }<br \/> if(x&gt;a &amp;&amp; x&lt;b){<br \/>  ux=(x-a)\/(b-a);<br \/> }<br \/> if(x&gt;b){<br \/>  ux=1;<br \/> }<br \/> return ux;<br \/>}<br \/><br \/>double triangular(double a, double b, double c, double x){<br \/> double ux=0;<br \/> if(x&lt;=a){<br \/>  ux=0;<br \/> }<br \/> if(x&gt;a &amp;&amp; x&lt;b){<br \/>  ux=(x-a)\/(b-a);<br \/> }<br \/> if(x==b){<br \/>  ux=1;<br \/> }<br \/> if(x&gt;b &amp;&amp; x&lt;c){<br \/>  ux = (c-x)\/(c-b);<br \/> }<br \/> return ux;<br \/>}<br \/><br \/>void graficarPuntosDesdeArchivo(char *cad){<br \/> int i;<br \/> \/*lista de comandos para ejecutar y configurar la visualizaci\u00f3n que tendr\u00e1n<br \/>     * los puntos en la gr\u00e1fica con gnuplot*\/<br \/>    char * configGnuplot[] = {cad, <br \/>                                \"set ylabel \"----grado de membres\u00eda---&gt;\"\",<br \/>                                \"set xlabel \"----Universo X---&gt;\"\",<br \/>                                \"plot \"puntosGraficar.txt\" using 1:2 with lines\"<br \/>                               };<br \/><br \/>    \/*Se crea una archivo de tipo popen, es una teber\u00eda IPC que se usa, para<br \/>     * ejecutar gnuplot y enviarle el archivo a graficar*\/<br \/>    \/\/FILE * ventanaGnuplot = popen(\"gnuplot -persist\", \"w\");<br \/>    FILE * ventanaGnuplot = popen(\"gnuplot -persist\", \"w\");<br \/>    \/\/ Executing gnuplot commands one by one<br \/>    for (i=0;i&lt;NUM_COMANDOS;i+ +){<br \/>  fprintf(ventanaGnuplot, \"%s n\", configGnuplot[i]);<br \/> }<br \/>}<br \/><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\/* * Autor: A. L. I. Fernando Merino * Nombre del archivo: funcionesMembresia.c * Descripci\u00f3n: Grafica en gnuplot los puntos ordeandos e inicializados * en los arreglos (valoresX, valoresY) * 10-octubre-2014*\/#include &lt;stdlib.h&gt;#include &lt;stdio.h&gt;#include &lt;unistd.h&gt;#include &lt;math.h&gt;#define NUM_PUNTOS 11#define NUM_COMANDOS 4void 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 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1448,1446,1451,1450,1444,1447,1445,1452,1449],"tags":[],"class_list":["post-1821","post","type-post","status-publish","format-standard","hentry","category-c-program","category-codigos","category-funcion-de-membresia","category-fuzzi","category-gnuplot","category-graficar-funciones","category-logica-difusa","category-membresia","category-programa-en-c"],"_links":{"self":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/1821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/comments?post=1821"}],"version-history":[{"count":0,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/1821\/revisions"}],"wp:attachment":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media?parent=1821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/categories?post=1821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/tags?post=1821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}