1、本程序可在 vc6.0 环境下运行!输入 e 表示输出误差,ec 表示误差变化率,经过测试具有很好的控制效果,对于非线性系统和数学模型难以建立的系统来说有更好的控制效果!现将其公开供大家学习研究!#include #include“math.h“ #define PMAX 100 #define PMIN -100 #define DMAX 100 #define DMIN -100 #define FMAX 100 /*语言值的满幅值*/ int PFF4=0,12,24,48;/*输入量 D 语言值特征点*/ int DFF4=0,16,32,64;/*输出量 U 语言值特征点*/ int
2、 UFF7=0,15,30,45,60,75,90;/*采用了调整因子的规则表,大误差时偏重误差,小误差时偏重误差变化*/ /*a0=0.3,a1=0.55,a2=0.74,a3=0.89 */ int rule77= /误差变化率 -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 -4,-3,-1, 0, 1, 3, 4, / 0 -2,-1, 0, 1, 2, 3, 4, / 1 1, 2, 2, 3, 4, 4, 5, / 2
3、 4, 5, 5, 5, 6, 6, 6; / 3/*/int Fuzzy(int P,int D) /*模糊运算引擎*/ int U; /*偏差,偏差微分以及输出值的精确量*/ unsigned int PF2,DF2,UF4; /*偏差,偏差微分以及输出值的隶属度*/ int Pn,Dn,Un4; long temp1,temp2; /*隶属度的确定*/ /*根据 PD 的指定语言值获得有效隶属度*/ if(P-PFF3 PF0=0; PF1=FMAX-PF0; if(D-DFF3 DF0=0; DF1=FMAX-DF0;/*使用误差范围优化后的规则表 rule77*/ /*输出值使用 1
4、3 个隶属函数,中心值由 UFF7指定*/ /*一般都是四个规则有效*/ Un0=rulePn-1+3Dn-1+3; Un1=rulePn+3Dn-1+3; Un2=rulePn-1+3Dn+3; Un3=rulePn+3Dn+3; if(PF0UF1)UF1=0;else UF0=0; if(Un0=Un2)if(UF0UF2)UF2=0;else UF0=0; if(Un0=Un3)if(UF0UF3)UF3=0;elseUF0=0; if(Un1=Un2)if(UF1UF2)UF2=0;elseUF1=0; if(Un1=Un3)if(UF1UF3)UF3=0;else UF1=0; i
5、f(Un2=Un3)if(UF2UF3)UF3=0;else UF2=0; /*重心法反模糊*/ /*Un原值为输出隶属函数标号,转换为隶属函数值*/ if(Un0=0)Un0=UFFUn0;else Un0=-UFF-Un0; if(Un1=0)Un1=UFFUn1;else Un1=-UFF-Un1; if(Un2=0)Un2=UFFUn2;elseUn2=-UFF-Un2; if(Un3=0)Un3=UFFUn3;else Un3=-UFF-Un3; temp1=UF0*Un0+UF1*Un1+UF2*Un2+UF3*Un3; temp2=UF0+UF1+UF2+UF3; U=temp1
6、/temp2;return U; void main() int a=0,e,ec;/*int nowpoint,p1,p2=1;FILE *in,*out;in=fopen(“in.txt“,“r“);out=fopen(“out.txt“,“w“);*/while(!feof(in)while(1)/fscanf(in,“%d“,/p1=nowpoint;/e=0-nowpoint;/ec= p1-p2;printf(“请输入 e:“);scanf(“%d“,printf(“请输入 ec:“);scanf(“%d“,a=Fuzzy(e,ec);/fprintf(out,“%d “,a);/printf(“%d: “,p1);printf(“e: %d ec: %d “,e,ec);printf(“a: %d n“,a);/p2=p1;/fclose(in);/fclose(out);