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

📄 fuzzy.c

📁 模糊算法
💻 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 + -