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

📄 fuzzy_main.c

📁 模糊控制是一种新的无模型的控制方式
💻 C
字号:
//fuzzy controller
//Membership function is triangular
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

//需要用到的全局变量
double er,er0;     //er 当前误差 , er0 前一个误差
double d_er;       //误差变化率
double output_value;   //这是被控对象的输出值;output_value 是对输出量的A/D采样值;即反馈数据,用于计算误差和误差变化率
double output_expect ;   //期望输出值
double output_mu;         // 解模糊后的输出值
unsigned int er_memb;
unsigned int der_memb;
unsigned int mu_memb;

int er_left,er_right,er_middle;
int der_left,der_right,der_middle;
int mu_left,mu_right,mu_middle;
double high_er,high_der;      //一条规则在 er d_er 上的纵坐标值,
double mu;
double u_upper[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};   //u_upper和u_bottom是经过模糊推理后的了生成(输出)模糊集
unsigned int u_bottom[13]={-60,-50,-40,-30,-20,-10,0,10,20,30,40,50,60};
double s[7];           //解模糊后各部分的面积
unsigned int middle;    //标示需要修改的u_upper[13]的位置

#define NB -3
#define NM -2 
#define NS -1
#define ZO 0
#define PS 1 
#define PM 2 
#define PB 3

#define w 40

void fuzzification();   //将输入变量进行模糊化,本例中输入变量是:误差 er  误差变化率 d_er
void fuzzy_engine();    //模糊控制器的具体实现部分
void defuzzify();       //解模糊,通过一个(er d_er)数据激活规则,对输出隶属度函数进行截取,然后用重心法解出具体值来送给执行机构

main()
{
	printf("           欢迎进入模糊控制器\n");
    fuzzification();
	printf("现在是输入变量进行模糊化时间\n");	
    fuzzy_engine();
	printf("现在是模糊控制器的具体实现时间\n");	
    defuzzify();
	printf("现在是解模糊时间\n");	
}

//将输入变量进行模糊化,本例中输入变量是:误差 er  误差变化率 d_er
void fuzzification()
{
	er=output_value - output_expect;
	d_er = er-er0;

	if(er<-50)  er_memb=NB;
	if((er>-60)&(er<-30)) er_memb=NM;
	if((er>-40)&(er<-10)) er_memb=NS;
	if((er>-20)&(er<20)) er_memb=ZO;
	if((er>10)&(er<40)) er_memb=PS;
	if((er>30)&(er<60)) er_memb=PM;
	if(er>50) er_memb=PB;
	
	if(d_er<-100) der_memb=NB;
	if((d_er>-120)&(d_er<-60))  der_memb=NM;
	if((d_er>-80)&(d_er<-20))  der_memb=NS;
	if((d_er>-40)&(d_er<40))  der_memb=ZO;
	if((d_er>20)&(d_er<80))  der_memb=PS;
	if((d_er>60)&(d_er<120))  der_memb=PM;
	if(d_er>100)  der_memb=PB;

	er0 = er;
}

void fuzzy_engine()
{
	//unsigned int i;

	//规则判断
	if((er<-50)&(d_er<-100))       //规则一: if((er==NB)&(d_er==NB)) mu=PB;
	{
        mu_memb=PB;

		//er_left=;
		er_middle=-70;
		er_right=-50;
		//der_left=;
		der_middle=-140;
		der_right=-100;
		mu_left=100;
		mu_middle=130;
		//mu_right=;
		if(er<-70)
			high_er=1;
	    //if(er<er_middle)
		//	high_er=(1/(er_middle-er_left))*(er-er_left);
		else if(er>er_middle)
		{
			high_er=(1/(er_middle-er_right))*(er-er_right);
		}
		if(er<-70)
			high_der=1;
	    //if(er<er_middle)
		//	high_er=(1/(er_middle-er_left))*(er-er_left);
		else if(er>er_middle)
		{
			high_der=(1/(der_middle-der_right))*(d_er-der_right);
		}
		if(high_er<=high_der)        //最大最小法进行模糊推理
			mu=high_er;
		else 
			mu=high_der;
		middle=6;
		s[middle/2+1]=w*(mu-mu*mu/2);
		if(u_upper[middle]<=mu)               //更新u_upper[13]的值
			u_upper[middle]=mu;

	}
	if(((er>-60)&(er<-30))&(d_er<-100))    //if((er==NM)&(d_er==NB)) mu=PB;
	{
	}
	if(((er>-40)&(er<-10))&(d_er<-100))    //if((er==NS)&(d_er==NB)) mu=PB;
	{
	}
	if(((er>-20)&(er<20))&(d_er<-100))    //	if((er==0)&(d_er==NB)) mu=PB;
	{
	}
	if(((er>10)&(er<40))&(d_er<-100))    //	if((er==PS)&(d_er==NB)) mu=PM;
	{
	}
	if(((er>30)&(er<60))&(d_er<-100))    //	if((er==PM)&(d_er==NB)) mu=0;
	{
	}
	if((er>50)&(d_er<-100))    //if((er==PB)&(d_er==NB)) mu=0;
	{
	}
	//1*7

	if((er<-50)&((d_er>-120)&(d_er<-60)))    //	if((er==NB)&(d_er==NM)) mu=PB;
	{
	}
	if(((er>-60)&(er<-30))&((d_er>-120)&(d_er<-60)))    //	if((er==NM)&(d_er==NM)) mu=PB;
	{
	}
	if(((er>-40)&(er<-10))&((d_er>-120)&(d_er<-60)))    //	if((er==NS)&(d_er==NM)) mu=PB;
	{
	}
	if(((er>-20)&(er<20))&((d_er>-120)&(d_er<-60)))    //	if((er==0)&(d_er==NM)) mu=PB;
	{
	}
	if(((er>10)&(er<40))&((d_er>-120)&(d_er<-60)))    //	if((er==PS)&(d_er==NM)) mu=PM;
	{
	}
	if(((er>30)&(er<60))&((d_er>-120)&(d_er<-60)))    //	if((er==PM)&(d_er==NM)) mu=0;
	{
	}
	if((er>50)&((d_er>-120)&(d_er<-60)))    //	if((er==PB)&(d_er==NM)) mu=0;
	{
	}	
	//2*7

	if((er<-50)&((d_er>-80)&(d_er<-20)))   //	if((er==NB)&(d_er==NS)) mu=PM;
	{
	}
	if(((er>-60)&(er<-30))&((d_er>-80)&(d_er<-20)))   //	if((er==NM)&(d_er==NS)) mu=PM;
	{
	}
	if(((er>-40)&(er<-10))&((d_er>-80)&(d_er<-20)))   //	if((er==NS)&(d_er==NS)) mu=PM;
	{
	}
	if(((er>-20)&(er<20))&((d_er>-80)&(d_er<-20)))   //	if((er==0)&(d_er==NS)) mu=PM;
	{
	}
	if(((er>10)&(er<40))&((d_er>-80)&(d_er<-20)))   //	if((er==PS)&(d_er==NS)) mu=0;
	{
	}
	if(((er>30)&(er<60))&((d_er>-80)&(d_er<-20)))   //	if((er==PM)&(d_er==NS)) mu=NS;
	{
	}
	if((er>50)&((d_er>-80)&(d_er<-20)))   //	if((er==PB)&(d_er==NS)) mu=NS;
	{
	}
	//3*7

    if((er<-50)&((d_er>-40)&(d_er<40)))  //	if((er==NB)&(d_er==0)) mu=PM;
	{
	}
    if(((er>-60)&(er<-30))&((d_er>-40)&(d_er<40)))  //	if((er==NM)&(d_er==0)) mu=PM;
	{
	}
    if(((er>-40)&(er<-10))&((d_er>-40)&(d_er<40)))  //	if((er==NS)&(d_er==0)) mu=PS;
	{
	}
    if(((er>-20)&(er<20))&((d_er>-40)&(d_er<40)))  //	if((er==0)&(d_er==0)) mu=0;
	{
	}
    if(((er>10)&(er<40))&((d_er>-40)&(d_er<40)))  //	if((er==PS)&(d_er==0)) mu=NS;
	{
	}
    if(((er>30)&(er<60))&((d_er>-40)&(d_er<40)))  //	if((er==PM)&(d_er==0)) mu=NM;
	{
	}
    if((er>50)&((d_er>-40)&(d_er<40)))  //	if((er==PB)&(d_er==0)) mu=NM;
	{
	}
	//4*7

    if((er<-50)&((d_er>20)&(d_er<80)))   //	if((er==NB)&(d_er==PS)) mu=PS;
	{
	}
    if(((er>-60)&(er<-30))&((d_er>20)&(d_er<80)))   //	if((er==NM)&(d_er==PS)) mu=PS;
	{
	}
    if(((er>-40)&(er<-10))&((d_er>20)&(d_er<80)))   //	if((er==NS)&(d_er==PS)) mu=0;
	{
	}
    if(((er>-20)&(er<20))&((d_er>20)&(d_er<80)))   //	if((er==0)&(d_er==PS)) mu=NM;
	{
	}
    if(((er>10)&(er<40))&((d_er>20)&(d_er<80)))   //	if((er==PS)&(d_er==PS)) mu=NM;
	{
	}
    if(((er>30)&(er<60))&((d_er>20)&(d_er<80)))   //	if((er==PM)&(d_er==PS)) mu=NM;
	{
	}
    if((er>50)&((d_er>20)&(d_er<80)))   //	if((er==PB)&(d_er==PS)) mu=NM;
	{
	}
	//5*7

    if((er<-50)&((d_er>60)&(d_er<120)))    //	if((er==NB)&(d_er==PM)) mu=0;
	{
	}
    if(((er>-60)&(er<-30))&((d_er>60)&(d_er<120)))    //	if((er==NM)&(d_er==PM)) mu=0;
	{
	}
    if(((er>-40)&(er<-10))&((d_er>60)&(d_er<120)))    //	if((er==NS)&(d_er==PM)) mu=NM;
	{
	}
    if(((er>-20)&(er<20))&((d_er>60)&(d_er<120)))    //	if((er==0)&(d_er==PM)) mu=NM;
	{
	}
    if(((er>10)&(er<40))&((d_er>60)&(d_er<120)))    //	if((er==PS)&(d_er==PM)) mu=NB;
	{
	}
    if(((er>30)&(er<60))&((d_er>60)&(d_er<120)))    //	if((er==PM)&(d_er==PM)) mu=NB;
	{
	}
    if((er>50)&((d_er>60)&(d_er<120)))    //	if((er==PB)&(d_er==PM)) mu=NB;
	{
	}
	//6*7

	if((er<-50)&(d_er>100))     //	if((er==NB)&(d_er==PB)) mu=0;
	{
	}
	if(((er>-60)&(er<-30))&(d_er>100))     //	if((er==NM)&(d_er==PB)) mu=0;
	{
	}
	if(((er>-40)&(er<-10))&(d_er>100))     //	if((er==NS)&(d_er==PB)) mu=NM;
	{
	}
	if(((er>-20)&(er<20))&(d_er>100))     //	if((er==0)&(d_er==PB)) mu=NM;
	{
	}
	if(((er>10)&(er<40))&(d_er>100))     //	if((er==PS)&(d_er==PB)) mu=NB;
	{
	}
	if(((er>30)&(er<60))&(d_er>100))     //	if((er==PM)&(d_er==PB)) mu=NB;
	{
	}
	if((er>50)&(d_er>100))     //	if((er==PB)&(d_er==PB)) mu=NB;
	{
	}
	//7*7
}

//重心法解模糊
void defuzzify()
{
}

void data_deal(unsigned int er_left1,unsigned int er_middle1,unsigned int er_right1,unsigned int der_left1,unsigned int der_middle1,unsigned int der_right1,unsigned int mu_left1,unsigned int mu_middle1,unsigned int mu_right1)
{
	if(er_memb!=NB)
		er_left=er_left1;
	er_middle=er_middle1;
	er_right=er_right;
	if(der_memb!=NB)
		der_left=der_left1;
	der_middle=der_middle1;
	der_right=der_right1;
	mu_left=mu_left1;
	mu_middle=mu_middle1;
	if(mu_memb!=NB)
		mu_right=mu;
	if(er<-70)
		high_er=1;
   //if(er<er_middle)
	//	high_er=(1/(er_middle-er_left))*(er-er_left);
	else if(er>er_middle)
	{
		high_er=(1/(er_middle-er_right))*(er-er_right);
	}
	if(er<-70)
		high_der=1;
    //if(er<er_middle)
	//	high_er=(1/(er_middle-er_left))*(er-er_left);
	else if(er>er_middle)
	{
		high_der=(1/(der_middle-der_right))*(d_er-der_right);
	}
	if(high_er<=high_der)        //最大最小法进行模糊推理
		mu=high_er;
	else 
		mu=high_der;
	middle=6;
	s[middle/2+1]=w*(mu-mu*mu/2);
	if(u_upper[middle]<=mu)               //更新u_upper[13]的值
		u_upper[middle]=mu;

}

⌨️ 快捷键说明

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