模糊控制作业C语言.docx

上传人:b****5 文档编号:7505977 上传时间:2023-05-11 格式:DOCX 页数:11 大小:17.74KB
下载 相关 举报
模糊控制作业C语言.docx_第1页
第1页 / 共11页
模糊控制作业C语言.docx_第2页
第2页 / 共11页
模糊控制作业C语言.docx_第3页
第3页 / 共11页
模糊控制作业C语言.docx_第4页
第4页 / 共11页
模糊控制作业C语言.docx_第5页
第5页 / 共11页
模糊控制作业C语言.docx_第6页
第6页 / 共11页
模糊控制作业C语言.docx_第7页
第7页 / 共11页
模糊控制作业C语言.docx_第8页
第8页 / 共11页
模糊控制作业C语言.docx_第9页
第9页 / 共11页
模糊控制作业C语言.docx_第10页
第10页 / 共11页
模糊控制作业C语言.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模糊控制作业C语言.docx

《模糊控制作业C语言.docx》由会员分享,可在线阅读,更多相关《模糊控制作业C语言.docx(11页珍藏版)》请在冰点文库上搜索。

模糊控制作业C语言.docx

模糊控制作业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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2