?? fruzzycontrol(final).txt
字號:
#include "stdio.h"
float e[5][7]; /*輸入量的隸屬度表*/
float u[5][9]; /*輸出量的隸屬度表*/
float R[7][9]; /*控制規(guī)則總表*/
int uxl[9]; /*控制輸出向量 */
int PB[7][9]; /*以下5個都是某一條規(guī)則的表*/
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) /*求規(guī)則表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的模糊化(在函數(shù)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++) /*根據(jù)隸屬度最大原則(所以這里主要是求隸屬度最大的元素所對應的級別)*/
{
if(uxl[i]>=uxl[d])
{
d=i;
}
}
ul=d-4;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -