📄 fruzzycontrol(final).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 + -