模糊控制作业C语言.docx
《模糊控制作业C语言.docx》由会员分享,可在线阅读,更多相关《模糊控制作业C语言.docx(11页珍藏版)》请在冰点文库上搜索。
模糊控制作业C语言
模糊控制作业C语言
模糊控制作业
机研112张营章学号:
201120122044
题目:
设计一个两个输入,单输出的模糊控制器。
设计的二维模糊控制器的结构如图1所示。
在此控制器中两个输入为机器人与障碍的距离D
和机器人所处的环境类型T,输出为转角B。
1.控制器结构
与障碍距离A
输出转角B
障碍物情况T
图1.二维模糊控制器结构
2.语言变量
取A的模糊子集(5个):
很近近中远很远
分别简记为:
VNNMFVF
取T的模糊子集(8个)为(以障碍物与机器人方向为准(如图2所示))
右左右前左前前左右死胡同无
分别简记为:
T1T2T3T4T5T6T7T8
取B的模糊子集(9个)为:
左快转左转直行右转右快转
分别简记为:
1L2L3L4L5S6R7R8R9R
3.计算论域确定
A的计算论域:
[-2,+2]T的计算论域:
[1,8]B的计算论域:
[-4,+4]
4.确定隶属函数
障碍距离A(in)隶属函数为(高斯型):
μ
μ
VN=equalzero(exp(-(in+2)*(in+2)/(0.5*0.5*2)));N=equalzero(exp(-(in+1)*(in+1)/(0.45*0.45*2)));1
μμμ
M=equalzero(exp(-in*in/(0.4*0.4*2)));
F=equalzero(exp(-(in-1)*(in-1)/(0.45*0.45*2)));VF
=equalzero(exp(-(in-2)*(in-2)/(0.5*0.5*2)));
转角大小G(x)隶属度函数为(三角形
)
障碍物情况T(y)的隶属函数为:
?
1
?
Ti?
x?
?
?
?
0
?
x?
i?
?
x?
i?
[1,8]
5.制定模糊控制规则并建立模糊控制表
基于操作者手动控制策略,得出如下表所示的40条控制规则。
控制规则表
2
将上表的40条控制规则用语言描述为:
IFAisViandTisTithenBis例如控制规则的第一条语句:
由这条语句所确定的模糊关系可用下式写出:
R=(VNA×SB)·(T1T×SB)
如果实际距离为a,实际环境为t,则由上市可以算出控制量为
B1=a·(VNA×SB)·t·(T1T×SB)
则根据40条控制规则得到的控制量输出为:
B=B1+B2+B3+B4+…+B40
对于上式,由于t与T1为量化向量,所以有:
当t=T1时上式等效于:
1
当t≠T1时:
1B=a·(VNA×SB)B=0
B1=μVN(a)同时t=T1的式子等效于:
×SB
故求解过程简化为:
已知障碍类型t后,每种类型t对应五条控制规则,则分别求出B1~B5:
B=B1+B2+B3+B4+B5
对应取大即可得到控制向量,最后解模糊即可。
基于C++所编写的控制程序工程见附件。
运行示例如下:
(距离-1.3,障碍类型:
右边有障碍物)
3
显示控制向量的输出曲线(输出曲线使用vc++的easyx开源库)为:
由上图可知,输出曲线为单峰,较陡,符合控制逻辑。
4
附录:
程序
#include<math.h>
#include<stdio.h>
#include<iostream.h>
#include<graphics.h>//就是需要引用这个图形库
#include<conio.h>
doubleJJ[21]={-5,-4.5,-4,-3.5,-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5};voidcomparesmall(doublea,double*p,intlength)
{
for(inti=0;i<length;i++)
{
if(a<p[i])
{
p[i]=a;
}
}
}
doubleequalzero(doublex)
{
if(x<0.1)return0;
elsereturnx;
}
voidarrayAND(double*p1,double*p2,intlength)
{
for(inti=0;i<length;i++)
{
if(p1[i]<p2[i])p1[i]=p2[i];
}
}
double*triangleout(double*outp,double*inp,intlength,intmfn)
{
inti=0;
switch(mfn)
{
case1:
for(i=0;i<length;i++)
{
if(inp[i]<=-4&&inp[i]>=-5)
5
outp[i]=inp[i]+5;
elseif(inp[i]<=-3&&inp[i]>=-4)outp[i]=-inp[i]-3;
else
outp[i]=0;
}
break;
case2:
for(i=0;i<length;i++)
{
if(inp[i]<=-3&&inp[i]>=-4)outp[i]=inp[i]+4;
elseif(inp[i]<=-2&&inp[i]>=-3)outp[i]=-inp[i]-2;
else
outp[i]=0;
}
break;
case3:
for(i=0;i<length;i++)
{
if(inp[i]<=-2&&inp[i]>=-3)outp[i]=inp[i]+3;
elseif(inp[i]<=-1&&inp[i]>=-2)outp[i]=-inp[i]-1;
else
outp[i]=0;
}
break;
case4:
for(i=0;i<length;i++)
{
if(inp[i]<=-1&&inp[i]>=-2)outp[i]=inp[i]+2;
elseif(inp[i]<=0&&inp[i]>=-1)outp[i]=-inp[i];
else
outp[i]=0;
}
6
break;
case5:
for(i=0;i<length;i++){
if(inp[i]<=0&&inp[i]>=-1)outp[i]=inp[i]+1;
elseif(inp[i]<=1&&inp[i]>=0)outp[i]=-inp[i]+1;
else
outp[i]=0;
}
break;
case6:
for(i=0;i<length;i++){
if(inp[i]<=1&&inp[i]>=0)outp[i]=inp[i];
elseif(inp[i]<=2&&inp[i]>=1)outp[i]=-inp[i]+2;
else
outp[i]=0;
}
break;
case7:
for(i=0;i<length;i++){
if(inp[i]<=2&&inp[i]>=1)outp[i]=inp[i]-1;
elseif(inp[i]<=3&&inp[i]>=2)outp[i]=-inp[i]+3;
else
outp[i]=0;
}
break;
case8:
for(i=0;i<length;i++){
if(inp[i]<=3&&inp[i]>=2)outp[i]=inp[i]-2;
7
elseif(inp[i]<=4&&inp[i]>=3)
outp[i]=-inp[i]+4;
else
outp[i]=0;
}
break;
case9:
for(i=0;i<length;i++)
{
if(inp[i]<=4&&inp[i]>=3)
outp[i]=inp[i]-3;
elseif(inp[i]<=5&&inp[i]>=4)
outp[i]=-inp[i]+5;
else
outp[i]=0;
}
break;
}//switch
returnoutp;
}
double*gaussin(double*outp,doublein)
{
outp[0]=equalzero(exp(-(in+2)*(in+2)/(0.5*0.5*2)));outp[1]=equalzero(exp(-(in+1)*(in+1)/(0.45*0.45*2)));outp[2]=equalzero(exp(-in*in/(0.4*0.4*2)));
outp[3]=equalzero(exp(-(in-1)*(in-1)/(0.45*0.45*2)));outp[4]=equalzero(exp(-(in-2)*(in-2)/(0.5*0.5*2)));returnoutp;
}
voidmain()
{
inti;
intj;
charhuatu;
intzhangai;
doublejuli;
double*c;
double*co;
double*co1;
8
doublesum;
doublesumout;
doublesumco;
doubleoutt[40];
charstr[10];
co=newdouble[21];
co1=newdouble[21];
c=newdouble[5];
cout<<"请输入障碍类型1,2,3,4,5,6,7,8"<<endl;cout<<"1:
右边有障碍物"<<endl;
cout<<"2:
左边有障碍物"<<endl;
cout<<"3:
右边前边有障碍物"<<endl;
cout<<"4:
左边前边有障碍物"<<endl;
cout<<"5:
前边有障碍物"<<endl;
cout<<"6:
左右有障碍物"<<endl;
cout<<"7:
死胡同"<<endl;
cout<<"8:
没有障碍物"<<endl;
cout<<"障碍类型为:
";
cin>>zhangai;
cout<<"请输入距离-2~2(-2对应距离最近)"<<endl;cout<<"距离为:
";
cin>>juli;
for(i=0;i<21;i++)co[i]=0;c=gaussin(c,juli);//cout<<*c<<endl<<*(c+1)<<endl<<*(c+2)<<endl<<*(c+3)<<endl<<*(c+4);if(zhangai==1){co=triangleout(co,JJ,21,1);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,2);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,3);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,4);comparesmall(c[3],co1,21);arrayAND(co,co1,21);
9
co1=triangleout(co1,JJ,21,5);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}if(zhangai==2){co=triangleout(co,JJ,21,9);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,8);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,7);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,6);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}if(zhangai==3){co=triangleout(co,JJ,21,1);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,1);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,2);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,3);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,4);comparesmall(c[4],co1,21);arrayAND(co,co1,21);
10
}if(zhangai==4){co=triangleout(co,JJ,21,9);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,9);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,8);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,7);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,6);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}if(zhangai==5){co=triangleout(co,JJ,21,2);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,3);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,4);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}if(zhangai==6){
11
co=triangleout(co,JJ,21,5);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,5);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}if(zhangai==7){co=triangleout(co,JJ,21,5);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,5);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}if(zhangai==8){co=triangleout(co,JJ,21,5);//取输出语言值comparesmall(c[0],co,21);//输入与输出取小co1=triangleout(co1,JJ,21,5);//取下一个输出语言值comparesmall(c[1],co1,21);//输入与输出取小arrayAND(co,co1,21);
12
co1=triangleout(co1,JJ,21,5);comparesmall(c[2],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[3],co1,21);arrayAND(co,co1,21);co1=triangleout(co1,JJ,21,5);comparesmall(c[4],co1,21);arrayAND(co,co1,21);}//for(i=0;i<21;i++)//cout<<i<<""<<co1[i]<<endl;sumco=0;//for(i=0;i<5;i++)//cout<<c[i]<<endl;for(i=0;i<21;i++){}sum=sum/sumco;cout<<"输出转角为:
"<<sum*15<<"度"<<endl;//画图cout<<"是否显示输出曲线(y/n)"<<endl;cin>>huatu;if(huatu=='y'){initgraph(640,480);//这里和TC略有区别line(255,0,255,480);outtextxy(257,410,"0");line(55,380,55,420);outtextxy(57,410,"-4");line(105,390,105,410);outtextxy(107,410,"-3");line(155,390,155,410);outtextxy(157,410,"-2");line(205,390,205,410);
13sum=0;sum+=co[i]*JJ[i];sumco+=co[i];//cout<<i<<""<<co[i]<<endl;
outtextxy(207,410,"-1");line(305,390,305,410);outtextxy(307,410,"1");line(355,390,355,410);outtextxy(357,410,"2");line(405,390,405,410);outtextxy(407,410,"3");line(455,380,455,420);outtextxy(457,410,"4");sumout=sum;
if(sumout<=-1){
itoa(sum*1000,str,10);str[6]=str[5];
str[5]=str[4];
str[4]=str[3];
str[3]=str[2];
str[2]='.';
}
elseif(sumout<0){
itoa(sum*1000,str,10);str[7]=str[5];
str[6]=str[4];
str[5]=str[3];
str[4]=str[2];
str[3]=str[1];
str[2]='.';
str[1]='0';
}
elseif(sumout==0){
itoa(sum*1000,str,10);}
elseif(sumout<1){
itoa(sum*1000,str,10);str[7]=s