Mostrando las entradas con la etiqueta control. Mostrar todas las entradas
Mostrando las entradas con la etiqueta control. Mostrar todas las entradas

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]);
 }
}