?? fuzzy_main.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 + -