viernes, 24 de octubre de 2014

Sistema de control Takagi-Sugeno en C

/*
 * 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&gtc){
  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---&gt\"",
                                "set xlabel \"----Universo X---&gt\"",
                                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]);
 }
}

0 comments:

Publicar un comentario