{"id":1818,"date":"2014-10-24T22:39:00","date_gmt":"2014-10-25T03:39:00","guid":{"rendered":"http:\/\/linuxitos.com\/main\/sistema-de-control-takagi-sugeno-en-c\/"},"modified":"2014-10-24T22:39:00","modified_gmt":"2014-10-25T03:39:00","slug":"sistema-de-control-takagi-sugeno-en-c","status":"publish","type":"post","link":"https:\/\/linuxitos.com\/main\/sistema-de-control-takagi-sugeno-en-c\/","title":{"rendered":"Sistema de control Takagi-Sugeno en C"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left;\">\n<pre>\/*<br \/> * Autor: A. L. I. Fernando Merino<br \/> * Nombre del archivo: sistemaTakgi.c<br \/> * Descripci\u00f3n: Simula un sistema difuso, usando el m\u00e9todo de Takgi-Sugeno<br \/> * genera un archivo con los  puntos en pares (x,y) para graficar en gnuplot,<br \/> * si desean graficar adicionalmente los puntos que est\u00e9n utilizando generen<br \/> * un archivo extra con los puntos y grafiquenlos, para comparar resultados<br \/> * 24-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 el total de comandos que se enviar\u00e1 a gnuplot*\/<br \/>#define NUM_COMANDOS 5<br \/><br \/>void seleccionGaussiana();<br \/>double gaussiana(double c, double gama, double x);<br \/>double gaussDerecha(double c, double gama, double x);<br \/>double gaussIzquierda(double c, double gama, double x);<br \/>void graficarPuntosDesdeArchivo(char *cad, char *archivo, char *archivo1, char *archivo2);<br \/><br \/>int main(){<br \/> printf(\"ntFunciones de Takgin-Sugenon\");<br \/> seleccionGaussiana();<br \/>    return 0;<br \/>}<br \/><br \/>void seleccionGaussiana(){<br \/> FILE * puntGI = fopen(\"gaussIzquierda.txt\", \"w\");<br \/> FILE * puntGD = fopen(\"takagiSugeno.txt\", \"w\");<br \/> FILE * archivoPuntos = fopen(\"gaussiana.txt\", \"w\");<br \/> double x,cenGaus,anchoGaus,inicio, fin;<br \/> double cenIzq,anchoIzq,cenDer,anchoDer;<br \/> double ug=0,ugi=0,ugd=0,y1=0,y2=0,y3=0,y;<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(\"Ingrese los siguientes datos:n\");<br \/> printf(\"Inicio de la muestra: \");<br \/> scanf(\"%lf\",&amp;inicio);<br \/> printf(\"Fin de la muestra: \");<br \/> scanf(\"%lf\",&amp;fin);<br \/> printf(\"nConfigure la Gaussiana Izquierda:\");<br \/> printf(\"nIngresa el centro: \");<br \/> scanf(\"%lf\",&amp;cenIzq);<br \/> printf(\"Ingresa ancho a los lados del centro: \");<br \/> scanf(\"%lf\",&amp;anchoIzq);<br \/> <br \/> printf(\"nConfigure la Gaussiana central:\");<br \/> printf(\"nIngresa el centro: \");<br \/> scanf(\"%lf\",&amp;cenGaus);<br \/> printf(\"Ingresa ancho a los lados del centro: \");<br \/> scanf(\"%lf\",&amp;anchoGaus);<br \/> <br \/> printf(\"nConfigure la Gaussiana derecha:\");<br \/> printf(\"nIngresa el centro: \");<br \/> scanf(\"%lf\",&amp;cenDer);<br \/> printf(\"Ingresa ancho a los lados del centro: \");<br \/> scanf(\"%lf\",&amp;anchoDer);<br \/> <br \/> for(x=inicio;x&lt;=fin;x+=0.01){<br \/>  \/*obtiene el valor de las membres\u00edas de cada valor de x*\/<br \/>  ugi = gaussIzquierda(cenIzq,anchoIzq,x);<br \/>  ug = gaussiana(cenGaus,anchoGaus,x);<br \/>  ugd = gaussDerecha(cenDer,anchoDer,x);<br \/>  \/*obtiene las y*\/<br \/>  y1=0.214285714*x+2.642857143;<br \/>  y2=-0.416666667*x+0.75;<br \/>  y3=0.342857143*x-1.528571429;<br \/>  \/*se susitituye en la f\u00f3rmula final*\/<br \/>  y=((ugi*y1)+(ug*y2)+(ugd*y3))\/(ugi+ug+ugd);<br \/>  \/*se guarda en un arhivo de texto con los puntos (x,y)*\/<br \/>  fprintf(puntGD, \"%lf %lf n\", x, y);<br \/> }<br \/> fclose(archivoPuntos);<br \/> fclose(puntGD);<br \/> fclose(puntGI);<br \/> graficarPuntosDesdeArchivo(\"set title \"Graficando funciones\"\",<br \/>        \"plot \"takagiSugeno.txt\" using 1:2 with lines\",<br \/>        \"replot \"puntosAnalizar.txt\" using 1:2 with lines\",<br \/>        \"replot \"gaussIzquierda.txt\" using 1:2 with lines\");<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 gaussIzquierda(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 \/> if(x&lt;=c){<br \/>  ux=1;<br \/> }<br \/> return ux;<br \/>}<br \/><br \/>double gaussDerecha(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 \/> if(x&amp;gtc){<br \/>  ux=1;<br \/> }<br \/> return ux;<br \/>}<br \/><br \/>void graficarPuntosDesdeArchivo(char *cad, char *archivo, char *archivo1, char *archivo2){<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---&amp;gt\"\",<br \/>                                \"set xlabel \"----Universo X---&amp;gt\"\",<br \/>                                archivo,<br \/>                                archivo1,<br \/>                                archivo2<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: sistemaTakgi.c * Descripci\u00f3n: Simula un sistema difuso, usando el m\u00e9todo 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\u00e9n utilizando generen * un archivo extra con los [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[76,1436,1437,1435,4,1438,1439],"tags":[],"class_list":["post-1818","post","type-post","status-publish","format-standard","hentry","category-c","category-code-c-takagi-sugeno","category-control","category-difuso","category-linux","category-sugeno","category-takagi"],"_links":{"self":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/1818","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=1818"}],"version-history":[{"count":0,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/1818\/revisions"}],"wp:attachment":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media?parent=1818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/categories?post=1818"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/tags?post=1818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}