logo
Secciones

Entradas del blog


Sistema de control Takagi-Sugeno en C

Sin comentarios

/*
* 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("ntFunciones de Takgin-Sugenon");
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]);
}
}

Comentarios:

Conoce la red social linuxClick
Redes sociales
Accesos directos