当前位置:文档之家› (完整版)模糊PID控制的C程序

(完整版)模糊PID控制的C程序

(完整版)模糊PID控制的C程序
(完整版)模糊PID控制的C程序

//e:[-3,3] ec:[-3,3] kp:[-0.3,0.3]

#include

#define NB 0

#define NM 1

#define NS 2

#define ZO 3

#define PS 4

#define PM 5

#define PB 6

/*********************************************************/ float uf(float x,float a,float b,float c);

float cuf(float x,float a,float b,float c);

float ufl(float x,float a,float b);

float cufl(float x,float a,float b);

float ufr(float x,float a,float b);

float cufr(float x,float a,float b);

float ufr(float x,float a,float b);

float cufr(float x,float a,float b);

float fand(float a,float b);

float forr(float a,float b);

float FuzzyKp(float e,float ec);

//主程序

void main()

{

float a,b,Kp;

printf("The E is:");

scanf("%f",&a);

printf("The Ec is:");

scanf("%f",&b);

Kp=FuzzyKp(a,b);

printf("The parameter Kp is: %f\n\n",Kp);

float FuzzyKp(float e,float ec)

{float es[7];

float ecs[7];

/******模糊推理规则的可信度通过取小点运算得到*****/ float form[7][7];//(表X7)(隶属度表)

int i,j;

/*************求得的最大值赋给form[a][b]*********/ int a=0,b=0;

float lsd;int p;

float detkp;

/**************************/

int kp[7][7]={{PB,PB,PM,PS,PS,ZO,ZO},

{PB,PB,PM,PS,PS,ZO,NS},

{PM,PM,PM,PS,ZO,NS,NS},

{PM,PM,PS,ZO,NS,NM,NM},

{PS,PS,ZO,NS,NS,NM,NM},

{PS,ZO,NS,NM,NM,NM,NB},

{ZO,ZO,NM,NM,NM,NB,NB}};

es[NB]=ufl(e,-3,-1);

es[NM]=uf(e,-3,-2,0);

es[NS]=uf(e,-3,-1,1);

es[ZO]=uf(e,-2,0,2);

es[PS]=uf(e,-1,1,3);

es[PM]=uf(e,0,2,3);

es[PB]=ufr(e,1,3);

ecs[NB]=ufl(ec,-3,-1);//ec

ecs[NM]=uf(ec,-3,-2,0);

ecs[NS]=uf(ec,-3,-1,1);

ecs[ZO]=uf(ec,-2,0,2);

ecs[PS]=uf(ec,-1,1,3);

ecs[PM]=uf(ec,0,2,3);

ecs[PB]=ufr(ec,1,3);

for(i=0;i<7;i++)

{

float w,h,r;

for(j=0;j<7;j++)

{

h=es[i];

r=ecs[j];

w=fand(h,r);

form[i][j]=w;

}

}

for(i=0;i<7;i++)

{

for(j=0;j<7;j++)

{

if(form[a][b]

{

a=i;

b=j;

}

}

}

lsd=form[a][b];//es和ecs最值中的最大值p=kp[a][b];

if(p==NB)

detkp=cufl(lsd,-0.3,-0.1);

else if(p==NM)

detkp=cuf(lsd,-0.3,0.2,0);

else if(p==NS)

detkp=cuf(lsd,-0.3,-0.1,0.1);

else if(p==ZO)

detkp=cuf(lsd,-0.2,0,0.2);

else if(p==PS)

detkp=cuf(lsd,-0.1,0.1,0.3);

else if(p==PM)

detkp=cuf(lsd,0,0.2,0.3);

else if(p==PB)

detkp=cufr(lsd,0.1,0.3);

return detkp;

}

/**************************************以下为附属子函数*/

/**************求隶属度(三角形)模糊化处理***************/ float uf(float x,float a,float b,float c)

{

if(x<=a)

return (0);

else if((a

return( (x-a)/(b-a));

else if((b

return( (c-x)/(c-b));

else if(x>c)

return (0);

}

/****************三角形反模糊化处理(最大隶属度

法)**********************/

float cuf(float x,float a,float b,float c)

{

float y,z;

z=(b-a)*x+a;

y=c-(c-b)*x;

return (y+z)/2;

}

/*****************梯形(左)求隶属度模糊化*******************/ float ufl(float x,float a,float b)

{if(x<=a)

return 1;

else if((a

return (b-x)/(b-a);

else if(x>b)

return 0;

}

/*******************梯形反模糊化***********************/ float cufl(float x,float a,float b)

{return b-(b-a)*x;

}

/*****************梯形(右)求隶属度模糊化*******************/ float ufr(float x,float a,float b)

{if(x<=a)

return 0;

if((a

return (x-a)/(b-a);

if(x>=b)

return 1;

}

/*******************梯形反模糊化***********************/ float cufr(float x,float a,float b)

{return (b-a)*x +a;

}

/*******************求交集***********************/

float fand(float a,float b)

{return (a

}

/*******************求并集***********************/

float forr(float a,float b)

{return (a

}

相关主题
文本预览
相关文档 最新文档