资源描述:
《C实现模糊控制算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、本程序可在vc6.0环境下运行!输入e表示输出误差,ec表示误差变化率,经过测试具有很好的控制效果,对于非线性系统和数学模型难以建立的系统来说有更好的控制效果!现将其公开供大家学习研究!#include#include"math.h"#definePMAX 100 #definePMIN -100 #defineDMAX 100 #defineDMIN -100 2 #defineFMAX 100 /*语言值的满幅值*/intPFF[4]={0,12,24,48};/*输入量D语言值特征点*/intDFF[4]={
2、0,16,32,64};/*输出量U语言值特征点*/intUFF[7]={0,15,30,45,60,75,90};/*采用了调整因子的规则表,大误差时偏重误差,小误差时偏重误差变化*//*a0=0.3,a1=0.55,a2=0.74,a3=0.89 */ intrule[7][7]={//误差变化率-3,-2,-1,0,1,2,3 //误差 {-6,-6,-6,-5,-5,-5,-4,}, // -3 {-5,-4,-4,-3,-2,-2,-1,}, // -2 {-4,-3,-2,-1,0,1,2,}, // -1 {-
3、4,-3,-1,0,1,3,4,}, // 0 {-2,-1,0,1,2,3,4,}, // 1 {1,2,2,3,4,4,5,}, // 2 {4,5,5,5,6,6,6}}; // 3/**********************************************************/int Fuzzy(intP,intD) /*模糊运算引擎*/{int U; /*偏差,偏差微分以及输出值的精确量*/unsignedint PF[2],DF[2],UF[4]; /*偏差,偏差微分以及输出值的
4、隶属度*/int Pn,Dn,Un[4];long temp1,temp2; /*隶属度的确定*//*根据PD的指定语言值获得有效隶属度*/if(P>-PFF[3]&&P5、 Pn=0; PF[0]=FMAX*((float)(-PFF[0]-P)/(PFF[1]-PFF[0])); } elseif(P<=PFF[1]) { Pn=1;PF[0]=FMAX*((float)(PFF[1]-P)/(PFF[1]-PFF[0])); } elseif(P<=PFF[2]) { Pn=2;PF[0]=FMAX*((float)(PFF[2]-P)/(PFF[2]-PFF[1])); } elseif(P<=PFF[3]) { Pn=3;PF[0]=FMAX*((float)(PFF[3]-P)/(PFF[3]-PF
6、F[2])); } }elseif(P<=-PFF[3]) { Pn=-2; PF[0]=FMAX; }elseif(P>=PFF[3]) { Pn=3; PF[0]=0; }PF[1]=FMAX-PF[0]; if(D>-DFF[3]&&D7、at)(-DFF[1]-D)/(DFF[2]-DFF[1])); } elseif(D<=DFF[0]) { Dn=0; DF[0]=FMAX*((float)(-DFF[0]-D)/(DFF[1]-DFF[0])); } elseif(D<=DFF[1]) { Dn=1; DF[0]=FMAX*((float)(DFF[1]-D)/(DFF[1]-DFF[0])); } e