📄 fuzzy.c
字号:
#include <stdio.h>
#include "Fuzzy.h"
/*将行向量转置成为列向量*/
void Trans(float a[13], float c[13][1])
{
int i;
for (i = 0 ; i < 13 ; i++)
c[i][0] = a[i];
}
/*求最大值*/
float Min(float a,float b)
{
float c;
c = a < b ? a : b;
return c;
}
/*求最大值*/
float Max(float a , float b)
{
float c ;
c = a > b ? a : b;
return c;
}
/*用求交法计算模糊蕴含关系*/
void Contain(float a[13][1], float b[13], float c[13][13])
{
int i , j ;
for (i = 0 ; i < 13 ; i++)
for (j = 0 ; j < 13 ; j++)
c[i][j] = Min(a[i][0],b[j]);
}
/*用最大最小法进行合成运算*/
void Combine(float a[13], float b[13][13], float c[13])
{
float d, temp ;
int i,j;
for(j = 0 ; j < 13 ; j++)
{
temp = 0 ;
for (i = 0 ; i < 13 ; i++)
{
d = Min(a[i],b[i][j]);
temp = Max(temp,d);
}
c[j] = temp;
}
}
/*用最小法计算模糊集合C*/
void cMemberShip(float a[13], float b[13], float c[13])
{
int i ;
for(i = 0 ; i < 13 ; i++)
c[i] = Min(a[i],b[i]) ;
}
/*用单点模糊进行模糊化运算*/
void Fuzzifier(int a, float b[13])
{
int i;
for(i = 0 ; i < 13 ; i++)
b[i] = 0;
b[a + 6] = 1;
}
/*用求并法计算输出量的模糊集合*/
void FuzzySet(float a[56][13],float b[13])
{
int i,j;
for(i = 0 ; i < 13 ; i++)
{
b[i] = 0 ;
for(j = 0 ; j < 56 ; j++)
b[i] = Max(b[i],a[j][i]);
}
}
/*用加权平均法计算实际的清晰控制量*/
float Defuzzifier(float a[13])
{
int i;
float result,den,num;
den=0;
num=0;
for(i = 0 ; i < 13 ; i++)
{
num = num + a[i] * (i - 6);
den = den + a[i];
}
result = num/den;
return result;
}
int main()
{
int i,j,x,y ;
float r1a[13][13],c1a[13],r1b[13][13],c1b[13],c[56][13];
float temp1[13][1] , temp2[13][1] , temp3[13] , temp4[13] , temp5[13];
float ControlTable[13][13];
for(x = -6 ; x <= 6 ; x++)
for(y = -6 ; y <= 6 ; y++)
{
for (i = 0 ; i < 56 ; i++)
{
Trans(xMemberShip[ControlRule[i][0]],temp1);
Trans(yzMemberShip[ControlRule[i][1]],temp2);
Contain(temp1,yzMemberShip[ControlRule[i][2]],r1a);
Fuzzifier(x,temp3);
Combine(temp3,r1a,c1a); //求A给定的条件下对应的模糊量c1a
Contain(temp2,yzMemberShip[ControlRule[i][2]],r1b);
Fuzzifier(y,temp4);
Combine(temp4,r1b,c1b); //求B给定的条件下对应的模糊量c1b
cMemberShip(c1a,c1b,c[i]); //求输出量C的隶属度
}
FuzzySet(c,temp5);
ControlTable[x + 6][y + 6] = Defuzzifier(temp5); //清晰化控制量
}
for(i = 0 ; i < 13 ; i++)
{
for(j = 0 ; j < 13 ; j++)
{
printf ("%6.2f", ControlTable[i][j]); //输出清晰化控制量表
}
printf("\n");
}
getchar();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -