模糊算法的研究和C语言实现包宇骅Word文件下载.docx
《模糊算法的研究和C语言实现包宇骅Word文件下载.docx》由会员分享,可在线阅读,更多相关《模糊算法的研究和C语言实现包宇骅Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
但是上述模糊滑模控制方案难以保证边界层内滑动模态的可达性,因而也就失去了滑模控制不变性的优点[6]。
本文提出一种新的模糊滑模控制器设计方法,可充分保证滑动模态的可达性。
由于模糊控制量与滑模变量之间无直接对应关系,按照专家经验采用启发式设计方案难度较大,而且难以保证设计参数的最优性,为此,本文通过采用遗传算法对控制器模糊项参数进行寻优设计。
考虑如下动态系统
x(n)=f(x,
,…,x(n-1))+bu b>
0
(1)
其中状态向量(x,
,…,x(n-1))=XT,假设
f(.)=
(.)+Δf(.)
(2)
其中
是f的估计值,Δf为模型的不确定性,F是Δf的上界函数,即
|Δf(.)|≤F(.) (3)
为讨论方便,先假设b=1,u为系统输入,控制目标是在系统存在不确定性的情况下,使系统状态向量跟踪预先选定的轨迹Xr,XTr=(xr,
r,…,x(n-1)r)。
定义误差向量
(4)
于是系统
(1)可以表示成如下状态方程
(5)
在传统SMC设计中,首先定义一个滑动平面
(6)
这里CT=(c1,c2,…,cn)是滑动平面系数,满足霍尔维兹多项式,不失一般性,取cn=1。
滑模控制的一个基本思想是要求通过等价控制量ueq保持状态在滑动平面上,由
Te-f(xTr-eT)-u+x(n)r=0 (7)
这里
=(0,c1,c2,…,cn-1),得到等价控制量ueq
(8)
可以保证系统状态到达滑动平面后,保持在滑动平面上,为实现滑动模态的存在及可达,还要求存在一不连续控制分量
(9)
以实现s.
<
0,即满足可达性条件,因此整个控制量为
u=ueq+ud (10)
然而,由于系统具有不确定性,ueq难以精确获得,因此考虑不确定性后有
ueq=
Te-
(xTr-eT)+x(n)r (11)
把式(9),式(11)代入式(6)得
(12)
由s.
0,得
ud=(F(.)+η)sgn(s) η>
0 (13)
考虑一般性,b≠1,且b具有不确定性,假设
β-1≤
/b≤β (14)
为b的估计值,β大于或等于1,那么取式(10)控制律为
u=
-1(ueq+ud)=
eq+
d (15)
进而得到
ud=[β(F(.)+η)+(β-1)|
eq|]sgn(s) (16)
令Q=β(F(.)+η)+(β-1)|
eq|,由前面有关参数的定义可知Q>
0,若不考虑参数的不确定性,即β=1,F(.)=0,则Q=η。
由分析可知,Q过小将影响非滑动模态到滑动模态的过渡时间或难以满足可达性条件;
Q过大,将导致大的抖振。
考虑参数不确定性,在仅知道参数上下界的情况下,会使Q取值过大,不可避免产生大的抖振。
为尽量消除抖振现象,文献[4],[5]提出在边界层内根据s的模糊值对Q值进行模糊调节,这一方法虽可以在边界层内起到柔化控制量u的作用,但由于参数的不确定性,对Q值的调节难以保证s.
0在边界层内成立,因为此时没有考虑
的变化情况。
本文提出一种模糊滑模控制器,该控制器根据滑模函数s及其导数
的模糊值决定Q的变化量ΔQ。
当s与
符号相反时ΔQ取值小于或等于零,当s与
同号时,ΔQ适当取正以使s.
0成立。
ΔQ的模糊取值根据如下规则。
Ri IfsisAiand
isBithenΔQiisyi
规则中Ai,Bi表示模糊集,则规则集输出ΔQ与模糊规则之间可通过模糊推理机建立如下关系。
(17)
Ri表示第i条模糊规则,m表示模糊规则数,且有
μi=ΠμAi(s)μBi(
) (18)
(19)
μAi、μBi是s、
的隶属度函数,定义如下
(20)
对αi、βi、γi有如下定义
(21)
式中αi0,βi0,γi0表示αi、βi、γi的初值,可结合一定的经验知识给出。
从以上对模糊控制器的结构分析可以发现,s和
的隶属度函数参数αi、βi、γi与规则输出参数yi影响着模糊量ΔQ的值。
而由式(21)可知,在αi0,βi0,γi0等初值给定情况下,αi,βi,γi是由δi,φi决定的。
所以对δi,φi,yi寻优即可以实现模糊控制器参数优化设计。
但是仅进行参数优化设计还难以实现真正的控制器优化,因为参数优化是在模糊集划分一定的情况下进行的,过多的模糊集划分将造成规则冗余,冗余的模糊规则必然会占用过多的存储空间,增大控制器决策时间。
因此,对模糊集的划分同样需要寻优,以实现模糊控制器从结构到参数的最优设计。
2.柴油机转速模糊控制的一种算法及其实现
转速模糊控制算法及实现
仅考虑转速闭环时,柴油机转速模糊控制系统框图如图1所示.
图1中,R为转速给定值;
Y为系统输出(实际转速值);
E=Y-R为转速偏差;
EC为转速偏差的变化率;
A为E经模糊化处理后,论域为X的模糊集;
B为EC经模糊化处理后,论域为Y的模糊集;
C为论域为Z的控制量模糊集;
Δu为C经模糊判决后的控制增量;
Δu*为清晰化计算出的实际控制增量.
2.1 输入变量的模糊化
考虑到本文研究的转速控制系统被控对象是一台6135型柴油机,最高转速为1500r/min,最低稳定转速为750r/min,因此X的论域可取为{-1500,1500},y={-1500,1500}.取转速偏差E的论域为[-750,750],隶属函数取梯形2三角形式(见图2).
转速偏差的语言变量E在X中取11个语言值.由图2可见,每个模糊子集均可用以下两式表示:
μ(x)=ax+b
(1)
μ(x)=-cx+d
(2)
显然,对任意转速偏差输入,在进行模糊化过程中,只属于两个模糊子集,对其它模糊子集的隶属度为零,如此处理可简化计算,减少内存和时间开销.其中,转速偏差分为5个区域,即[0,10],[10,110],[110,210],[210,310],[310,750],每个区域的隶属度按
(1)式和
(2)式计算,区别仅在于系数a,b,c,d各不相同,由于μ(x)轴的左半部曲线与右半部取为完全轴对称,因此当转速偏差为负值时,其计算程序上与上述程序相同.
2.2 模糊规则及模糊推理
考虑最简单的情况,模糊控制器采用一维结构时,其控制规则如下:
IfEisZEthen Δu isZE
IfEisPSthen Δu isPS
IfEisPMthen Δu isPM
IfEisPBthen Δu isPB
IfEisPVBthen Δu isPVB
其中:
Δu为模糊控制量的增量值,当转速偏差E为负值时,规则同上,只是Δu的符号相应改变(Δu的符号与E的符号一致);
ZE,S,M,B,VB分别表示输出增量Δu为“零,小,中等,大,很大”,P表示“Positive”,N表示“Negative”.
由以上分析可见,虽然模糊控制规则共有9条,但由于转速偏差E符号不同时,其控制规则是对称的,因此在实施模糊推理时,只用到了5条规则.此外,由于任意转速偏差E只可能属于两个模糊子集,因此在实际运算时,对应每个采样周期的转速偏差输入只可能激活两条规则,这样处理的结果是大大简化了计算,保证了实时控制对微处理器运算速度的需要.
模糊推理采用近似推理法则.对于一条被激活的规则,控制增量Δu的隶属度按Mamdani合成推理方法计算,即
由于此处只考虑转速误差E作为模糊输入变量,因此输出增量Δu的隶属度与输入变量的隶属度相同.
2.3 清晰化计算
对应于每个采集周期的转速偏差值E,由上述模糊决策过程激活2条控制规则(当E小于10r/min时仅激活一条规则),并可求出每条规则中模糊输出增量Δu的隶属度值.Δu*的隶属函数取单值线函数,即一系列的离散值(见图3).
输出控制量是执行器闭环控制的给定值,其论域为{0,100%},则输出增量Δu*
的论域取值为{-100%,100%}
.
对于求出的模糊输出增量,采用重心法计算其精确输出增量值,即:
当采用一维模糊控制器时,对于上述的输入变量模糊隶属度函数的模糊推理方法,不难证明
因此上式的计算量很小,易于在单片机中实现.
结 论
在以80C196KC嵌入式16位单片机为核心的柴油机数字调速系统中,根据上述算法设计了控制软件,并在6135型柴油机上进行了实机试验.图4和图5表示了柴油机低速空车接排时转速和齿杆位移变化的动态过程.由图可见,在接排的瞬间,柴油机的转速急剧下降,与此同时,齿杆位移量几乎是呈直线增加到100%,说明控制器控制动作的快速性已达到极限.事实上,通过一系列性能测试,以本文提出的模糊控制算法为基本控制策略的柴油机转速控制系统具有良好的动态性能,但若仅采用模糊控制,系统的稳态性能达不到一级调速精度.可采用多种控制策略来改善系统的稳态性能,其中Fuzzy-PID复合控制是提高系统控制精度的有效途径。
模糊控制算法的C语言实现
#include<
stdio.h>
#include"
math.h"
#definePMAX
100
#definePMIN
-100
#defineDMAX
#defineDMIN
#defineFMAX
/*语言值的满幅值*/
intPFF[4]={0,12,24,48};
/*输入量D语言值特征点*/
intDFF[4]={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
{-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)
/*模糊运算引擎*/
{
U;
/*偏差,偏差微分以及输出值的精确量*/
unsignedint
PF[2],DF[2],UF[4];
/*偏差,偏差微分以及输出值的隶属度*/
Pn,Dn,Un[4];
long
temp1,temp2;
/*隶属度的确定*/
/*根据PD的指定语言值获得有效隶属度*/
if(P>
-PFF[3]&
&
P<
PFF[3])
if(P<
=-PFF[2])
{
Pn=-2;
PF[0]=FMAX*((float)(-PFF[2]-P)/(PFF[3]-PFF[2]));
}
elseif(P<
=-PFF[1])
{
Pn=-1;
PF[0]=FMAX*((float)(-PFF[1]-P)/(PFF[2]-PFF[1]));
}
=PFF[0])
Pn=0;
PF[0]=FMAX*((float)(-PFF[0]-P)/(PFF[1]-PFF[0]));
=PFF[1])
Pn=1;
PF[0]=FMAX*((float)(PFF[1]-P)/(PFF[1]-PFF[0]));
=PFF[2])
Pn=2;
PF[0]=FMAX*((float)(PFF[2]-P)/(PFF[2]-PFF[1]));
=PFF[3])
Pn=3;
PF[0]=FMAX*((float)(PFF[3]-P)/(PFF[3]-PFF[2]));
}
elseif(P<
=-PFF[3])
PF[0]=FMAX;
elseif(P>
PF[0]=0;
PF[1]=FMAX-PF[0];
if(D>
-DFF[3]&
D<
DFF[3])
if(D<
=-DFF[2])
Dn=-2;
DF[0]=FMAX*((float)(-DFF[2]-D)/(DFF[3]-DFF[2]));
elseif(D<
=-DFF[1])
Dn=-1;
DF[0]=FMAX*((float)(-DFF[1]-D)/(DFF[2]-DFF[1]));
=DFF[0])
Dn=0;
DF[0]=FMAX*((float)(-DFF[0]-D)/(DFF[1]-DFF[0]));
=DFF[1])
Dn=1;
DF[0]=FMAX*((float)(DFF[1]-D)/(DFF[1]-DFF[0]));
=DFF[2])
Dn=2;
DF[0]=FMAX*((float)(DFF[2]-D)/(DFF[2]-DFF[1]));
=DFF[3])
Dn=3;
DF[0]=FMAX*((float)(DFF[3]-D)/(DFF[3]-DFF[2]));
elseif(D<
=-DFF[3])
DF[0]=FMAX;
elseif(D>
DF[0]=0;
DF[1]=FMAX-DF[0];
/*使用误差范围优化后的规则表rule[7][7]*/
/*输出值使用13个隶属函数,中心值由UFF[7]指定*/
/*一般都是四个规则有效*/
Un[0]=rule[Pn-1+3][Dn-1+3];
Un[1]=rule[Pn+3][Dn-1+3];
Un[2]=rule[Pn-1+3][Dn+3];
Un[3]=rule[Pn+3][Dn+3];
if(PF[0]<
=DF[0])
UF[0]=PF[0];
else
UF[0]=DF[0];
if(PF[1]<
UF[1]=PF[1];
UF[1]=DF[0];
=DF[1])
UF[2]=PF[0];
UF[2]=DF[1];
UF[3]=PF[1];
UF[3]=DF[1];
/*同隶属函数输出语言值求大*/
if(Un[0]==Un[1])
if(UF[0]>
UF[1])
UF[1]=0;
else
UF[0]=0;
if(Un[0]==Un[2])
UF[2])
UF[2]=0;
if(Un[0]==Un[3])
UF[3])
UF[3]=0;
else
if(Un[1]==Un[2])
if(UF[1]>
if(Un[1]==Un[3])
if(Un[2]==Un[3])
if(UF[2]>
/*重心法反模糊*/
/*Un[]原值为输出隶属函数标号,转换为隶属函数值*/
if(Un[0]>
=0)
Un[0]=UFF[Un[0]];
Un[0]=-UFF[-Un[0]];
if(Un[1]>
Un[1]=UFF[Un[1]];
Un[1]=-UFF[-Un[1]];
if(Un[2]>
Un[2]=UFF[Un[2]];
else
Un[2]=-UFF[-Un[2]];
if(Un[3]>
Un[3]=UFF[Un[3]];
Un[3]=-UFF[-Un[3]];
temp1=UF[0]*Un[0]+UF[1]*Un[1]+UF[2]*Un[2]+UF[3]*Un[3];
//因为选定隶属函数为三角形,且对称,故可以证明中心在中间的特征点上(横坐标)。
temp2=UF[0]+UF[1]+UF[2]+UF[3];
U=temp1/temp2;
returnU;
//最后的输出
}
voidmain()
inta=0,e,ec;
/*intnowpoint,p1,p2=1;
FILE*in,*out;
in=fopen("
in.txt"
"
r"
);
out=fopen("
out.txt"
w"
*/
//while(!
feof(in))
while
(1)
//fscanf(in,"
%d"
&
nowpoint);
//p1=nowpoint;
//e=0-nowpoint;
//ec=p1-p2;
printf("
请输入e:
"
scanf("
e);
请输入ec:
ec);
a=Fuzzy(e,ec);
//fprintf(out,"
%d
"
a);
//printf("
%d:
p1);
e:
%d
ec:
e,ec);
a:
\n"
//p2=p1;
//fclose(in);
//fclose(out);