⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fruzzycontrol(final).txt

📁 本文件是一个模糊控制的算法C程序 单水箱的模糊控制(例子+程序)
💻 TXT
字号:
#include "stdio.h"
float e[5][7];     /*输入量的隶属度表*/
float u[5][9];     /*输出量的隶属度表*/
float R[7][9];     /*控制规则总表*/
int uxl[9];      /*控制输出向量 */
int PB[7][9];    /*以下5个都是某一条规则的表*/
int PS[7][9];
int O[7][9];
int NS[7][9];
int NB[7][9];
float e[5][7]={{0,0,0,0,0,0.5,1},{0,0,0,0,1,0.5,0},{0,0,0.5,1,0.5,0,0},{0,0.5,1,0,0,0,0},{1,0.5,0,0,0,0,0}};
float u[5][9]={{0,0,0,0,0,0,0,0.5,1},{0,0,0,0,0,0.5,1,0.5,0},{0,0,0,0.5,1,0.5,0,0,0},{0,0.5,1,0.5,0,0,0,0,0},{1,0.5,0,0,0,0,0,0,0}};
/*float R[7][9]={{1,0.5,0,0,0,0,0,0,0},{0.5,0.5,0.5,0.5,0,0,0,0,0},{0,0.5,1,0.5,0.5,0.5,0,0,0},{0,0,0,0.5,1,0.5,0,0,0},{0,0,0,0.5,0.5,0.5,1,0.5,0},{0,0,0,0,0,0.5,0.5,0.5,0.5},{0,0,0,0,0,0,0,0.5,1}};*/

float ul;          /*最终输出量*/
float el;          /*输入量*/

void count_R(void);
void count(void);
int judge_e(void);
void count_uxl(void);
void count_u(void);


void main(void)
{
 count_R();    /*求R*/
 /*scanf("%f",&el);*/
 el=1;
 printf("Controller input:\n");
 while(el<=50)
 {
  printf("%f ",el);
  el=el+1;
 }
 printf("\nController output:\n");
 el=1;
 while(el<=50)
 {
  count();         /*求输出*/
  printf("%f ",ul);
  el=el+1;
 }
 printf("\n\n......... OK ...........\n");
 getch();
}

void count_R(void)    /*求规则表R*/
{
 int i;
 int j;
 for(i=0;i<=8;i++)         /*NBe交NBu*/
 {
  for(j=0;j<=6;j++)
  {
   if(e[0][j]<=u[0][i])

    NB[j][i]=e[0][j];
    else
     NB[j][i]=u[0][i];

  }
 }
 for(i=0;i<=8;i++)         /*NSe交NSu*/
 {
  for(j=0;j<=6;j++)
  {
   if(e[1][j]<=u[1][i])
    NS[j][i]=e[1][j];
    else
     NS[j][i]=u[1][i];
  }
 }
 for(i=0;i<=8;i++)       /*Oe交Ou*/
 {
  for(j=0;j<=6;j++)
  {
   if(e[2][j]<=u[2][i])
    O[j][i]=e[2][j];
    else
     O[j][i]=u[2][i];
  }
 }
 for(i=0;i<=8;i++)         /*PSb交PSu*/
 {
  for(j=0;j<=6;j++)
  {
   if(e[3][j]<=u[3][i])
    PS[j][i]=e[3][j];
    else
     PS[j][i]=u[3][i];
  }
 }
 for(i=0;i<=8;i++)         /*PBs交PBu*/
 {
  for(j=0;j<=6;j++)
  {
   if(e[4][j]<=u[4][i])
    PB[j][i]=e[4][j];
    else
     PB[j][i]=u[4][i];
  }
 }
 for(i=0;i<=8;i++)        /*NB到PB5个矩阵取并集*/
 {
  for(j=0;j<=6;j++)
  {
   if(NB[i][j]>=NS[i][j])
    R[i][j]=NB[i][j];
    else
     R[i][j]=NS[i][j];
   if(O[i][j]>=R[i][j])
   {
    R[i][j]=O[i][j];
   }
   if(PS[i][j]>=R[i][j])
   {
    R[i][j]=PS[i][j];
   }
   if(PB[i][j]>=R[i][j])
   {
    R[i][j]=PB[i][j];
   }
  }
 }
}
void count(void)  /*包含e的模糊化(在函数count_uxl中),u向量和u的求取*/
{
 count_uxl();     /*求输出向量u*/
 count_u();       /*u的反模糊化*/
}

int judge_e(void)  /*求e属于哪个模糊集合*/
{
 int a;    /*e属于的级别*/
 int b=0;   /*e属于的模糊集合的下标*/
 int i;
 if(el<=15)          /*这些if为了判断e所在的级别,存在a中*/
 {
  a=6;
 }
 if(el>15&&el<=20)
 {
  a=5;
 }
 if(el>20&&el<=24.5)
 {
  a=4;
 }
 if(el>24.5&&el<=25.5)
 {
  a=3;
 }
 if(el>25.5&&el<=30)
 {
  a=2;
 }
 if(el>30&&el<=35)
 {
  a=1;
 }
 if(el>=35)
 {
  a=0;
 }
 for(i=1;i<=4;i++)      /*判断e所在的模糊集合,存于b中(隶属度最大)*/
 {
  if(e[i][a]>=e[b][a])
   b=i;
   else b=b;
 }
 return(b);
}

void count_uxl(void) /*求u向量(u=e。R)*/
{
 int min;
 int max;
 int b=judge_e();   /*e属于的模糊集合的下标*/
 int i;
 int j;
 for(i=0;i<=8;i++)
 {
  max=0;
  for(j=0;j<=6;j++)
  {
   if(e[b][j]<=R[j][i])
    min=e[b][j];
    else
     min=R[j][i];
   if(min>=max)
   {
    max=min;
   }
  }
  uxl[i]=max;
 }
}

void count_u(void)  /*u的反模糊化*/
{
 int i;
 int d=0;
 for(i=1;i<=8;i++)      /*根据隶属度最大原则(所以这里主要是求隶属度最大的元素所对应的级别)*/
 {
  if(uxl[i]>=uxl[d])
  {
   d=i;
  }
 }
 ul=d-4;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -