空间站 参考消息,手机wap版网站制作,网站占有率,东莞网站开发网站建设制作费用在现实控制中#xff0c;被控系统并非是线性时不变的#xff0c;往往需要动态调整PID的参数#xff0c;而模糊控制正好能够满足这一需求#xff0c;所以在接下来的这一节我们将讨论模糊PID控制器的相关问题。模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控…在现实控制中被控系统并非是线性时不变的往往需要动态调整PID的参数而模糊控制正好能够满足这一需求所以在接下来的这一节我们将讨论模糊PID控制器的相关问题。模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控制算法。可以说是模糊算法在PID参数整定上的应用。
1、模糊算法的原理
模糊算法是一种基于智能推理的算法虽然称之为模糊算法其实并不模糊实际上是一种逐步求精的思想。一个模糊控制器主要是由模糊化模糊推理机和精确化三个功能模块和知识库包括数据库和规则库构成的。在此我们近讨论模糊控制的几个主要问题。
1.1、输入量的量化
输入数据都是精确的要实现模糊算法需要现对其实现量化。所谓量化就是通过量化函数将输入量投射到一定的数字级别一般都是相对于0对称的数字区间。具体投射到怎样的区间根据实际情况而定因为这会直接影响到计算的精度。
1.2、模糊化
模糊化是模糊算法非常重要的一步首先确定对应各语言变量的模糊子集然后根据量化的结果我们就可以判断该输入所属的集合并计算出对应的隶属度。计算隶属度的方法有很多最常用的是使用三角形隶属度函数或梯形隶属度函数等来计算获得。
1.3、规则库
规则库是基于控制量的模糊化而的味道的是实现模糊推理的基础很大程度上依赖于经验来完成。规则库的表现形式可以有多种具体实现的形式根据我们实现的方便。
1.4、推理机
推理决策才是模糊控制的核心它利用知识库中的信息和模糊运算方式模拟人的推理决策的思想方法在一定的输入条件下激活相应的控制规则给出适当的模糊控制输出。
1.5、精确化
我们通过模糊推理得到一系列的模糊表达需要进行解模糊操作才能得到紧缺的数据。常用的解模糊方法有 最大隶属度法——计算简单适用于控制要求不高场合。 重心法——输出更平滑但计算难度大 加权平均法——一般在工业上应用最广泛
1.6、工程量化
系统控制输出是一个精确的数但不是可以直接用于对象控制的物理量所以在最后还要按照我们的需要进行转换。比如对应PID的参数则可进行必要的转换和修正在输出给PID控制器。
2、模糊PID算法的设计
前面简单的描述了模糊算法的基本原理接下来我们将讨论如何将其应用于PID控制当中。所谓模糊PID控制是以偏差e及偏差的变化ec为输入利用模糊控制规则在线对PID参数进行调整以满足不同的偏差e和偏差的增量ec对PID参数的不同要求。其结构图如下 2.1、输入值的模糊化
输入值的模糊化就是将用于计算的输入对应到标准化的数值区间并根据量化结果和模糊化子集得到该输入对子集的隶属度。我们在使用偏差e和偏差增量ec作为输入实现控制参数调整则需要对e和ec进行模糊化。
首先我们确定e和ec的模糊子集对于PID控制我们选则负大[NB]、负中[NM]、负小[NS]、零[ZO]、正小[PS]、正中[PM]、正大[PB]等7个语言变量就能够有足够精度表达其模糊子集。所以我们定义e和ec的模糊子集均为{NBNMNSZOPSPMPB}。
确定了模糊子集我们怎么将e和ec的具体值和模糊集对应上呢我们需要引入量化函数。要确定量化函数我们先引入e和ec模糊集对应的论域定义为{-6-5-4-3-2-10123456}。对于任何一个物理量测量信号都有一个量程范围我们记为Vmax和Vmin和自然在PID调节时设定值的范围预期相同所以偏差e的范围就是Vmin-Vmax到Vmax-Vmin的范围内而偏差的增量范围则是其两倍。这里我们采用线性方式量化则其函数关系为 利用上述的量化函数就可以将e和ec量化我们可以采用如4舍5入的方式获取确定的模糊子集。但考虑到e和ec的变化是连续变化的4舍5入对控制精度可能存在影响所以我们引入隶属度来实现这一过程。
最后我们确定e和ec在模糊子集上的隶属度。隶属度是一个介于0和1之间的值用以描述对应一个输入属于某一个模糊自己的程度。一般我们描述成隶属度函数可采用的隶属度函数很多我们在次采用线性的隶属度函数或者称为三角隶属度函数其函数关系如下 如果我们量化后的结果是1那么属于ZO的隶属度为0.5同样属于PS的隶属度也是0.5。至此模糊化全部完成。
2.2、建立模糊规则表
前面我们简述了输入的模糊化但模糊推理才是模糊控制的根本。为了实现模糊推理首先我们要建立模糊推理的规则库或者称知识库然后建立推理机进行推理。
首先我们来建立模糊规则库在这里我们要对Kp、Ki和Kd三个参数进行调整所以要建立这3个变量的模糊规则库。
2.2.1、Kp模糊规则设计
在PID控制器中Kp值的选取决定于系统的响应速度。增大Kp能提高响应速度减小稳态偏差但是Kp值过大会产生较大的超调甚至使系统不稳定减小Kp可以减小超调提高稳定性但Kp过小会减慢响应速度延长调节时间。因此调节初期应适当取较大的Kp值以提高响应速度而在调节中期Kp则取较小值以使系统具有较小的超调并保证一定的响应速度而在调节过程后期再将Kp值调到较大值来减小静差提高控制精度。基于上述描述我们定义Kp的模糊规则如下 2.2.2、Ki模糊规则设计
在系统控制中积分控制主要是用来消除系统的稳态偏差。由于某些原因(如饱和非线性等)积分过程有可能在调节过程的初期产生积分饱和从而引起调节过程的较大超调。因此在调节过程的初期为防止积分饱和其积分作用应当弱一些甚至可以取零而在调节中期为了避免影响稳定性其积分作用应该比较适中最后在过程的后期则应增强积分作用以减小调节静差。依据以上分析我们制定的Ki模糊规则如下 2.2.3、Kd模糊规则设计
微分环节的调整主要是针对大惯性过程引入的微分环节系数的作用在于改变系统的动态特性。系统的微分环节系数能反映信号变化的趋势并能在偏差信号变化太大之前在系统中引入一个有效的早期修正信号从而加快响应速度减少调整时间消除振荡最终改变系统的动态性能。因此Kd值的选取对调节动态特性影响很大。Kd值过大调节过程制动就会超前致使调节时间过长Kd值过小调节过程制动就会落后从而导致超调增加。根据实际过程经验在调节初期应加大微分作用这样可得到较小甚至避免超调而在中期由于调节特性对Kd值的变化比较敏感因此Kd值应适当小一些并应保持固定不变然后在调节后期Kd值应减小以减小被控过程的制动作用进而补偿在调节过程初期由于Kd值较大所造成的调节过程的时间延长。依据以上分析我们制定Kd的模糊规则如下 接下来根据偏差E和偏差增量EC模糊化的结果以及规则库推理出∆Kp、∆Ki、∆Kd对应的模糊子集。由于前面我们设计的是采用隶属度函数来定义输入输出量在模糊子集的隶属度所以推理出来的∆Kp、∆Ki、∆Kd的模糊子集通常是一个由模糊变量组成的矩阵。而输入量E和EC则是一个由模糊变量组成的向量。
最后我们需要明确不同的模糊变量所对应的量化数据。这个量化数据与物理量的对应则根据具体的不同对象是完全不一样的。
2.3、解模糊处理
对于求得的目标对象我们还需要将其你模糊处理以使其与具体的物理量相对应。在模糊PID调解中我们需要的是KpKi和Kd所以我们需要根据模糊推理的结果得到我们想要的KpKi和Kd值。
我们前面设计了三角隶属度函数并采用相同的量化目标即论域{-66}所以在某一时刻输入输出所处的模糊变量的隶属度是相同的基于这一基础我们采用重心法计算各输出量的量化值。其公式如下 其实因为我们采用的隶属度函数的特性在任何方向的计算隶属度的和均为1所以分母可以省略。于是每一个对象的计算实际上就是矩阵操作公式如下 如果使用的是量化值则还需要转为实际值关于这一点直接使用物理量值也是没问题的怎么处理根据实际需要确定。得到增量后我们也可以引入系数来放大和缩小KpKi和Kd变化量具体实现公式如下
其中∆K为我们所计算得到的值而α为系数设定增量对最终只的影响。
3、模糊PID算法实现
前面我们描述了算法的全过程接下来我们编码实现之。首先我们依然需要定义一个模糊PID控制器的结构对象。
/*定义结构体和公用体*/
typedef struct
{float setpoint; /*设定值*/float kp; /*比例系数*/float ki; /*积分系数*/float kd; /*微分系数*/float lasterror; /*前一拍偏差*/float preerror; /*前两拍偏差*/float deadband; /*死区*/float output; /*输出值*/float result; /*物理量输出值*/float maximum; /*输出值的上限*/float minimum; /*输出值的下限*/float maxdKp; /*Kp增量的最大限值*/float mindKp; /*Kp增量的最小限值*/float qKp; /*Kp增量的影响系数*/float maxdKi; /*Ki增量的最大限值*/float mindKi; /*Ki增量的最小限值*/float qKi; /*Ki增量的影响系数*/float maxdKd; /*Kd增量的最大限值*/float mindKd; /*Kd增量的最小限值*/float qKd; /*Kd增量的影响系数*/
}FUZZYPID;
接下来实现输入值的模糊化。我们前面已经设计了采用线性量化函数以及三角隶属度函数所以实现就简单了。
/*线性量化操作函数,论域{-6-5-4-3-2-10123456}*/
static void LinearQuantization(FUZZYPID *vPID,float pv,float *qValue)
{float thisError;float deltaError;thisErrorvPID-setpoint-pv; //计算偏差值deltaErrorthisError-vPID-lasterror; //计算偏差增量qValue[0]6.0*thisError/(vPID-maximum-vPID-minimum);qValue[1]3.0*deltaError/(vPID-maximum-vPID-minimum);
}
对于量化函数实际上可根据需要采用不同的函数如速降曲线函数正太分布函数以及其它一元函数等都是可以的但对于我们在这里的实现目标使用线性函数就足够了。还有隶属度函数也是一样有多种选择我们这里采用计算量较小的三角隶属度函数
/*隶属度计算函数*/
static void CalcMembership(float *ms,float qv,int * index)
{if((qv-NB)(qv-NM)){index[0]0;index[1]1;ms[0]-0.5*qv-2.0; //y-0.5x-2.0ms[1]0.5*qv3.0; //y0.5x3.0}else if((qv-NM)(qv-NS)){index[0]1;index[1]2;ms[0]-0.5*qv-1.0; //y-0.5x-1.0ms[1]0.5*qv2.0; //y0.5x2.0}else if((qv-NS)(qvZO)){index[0]2;index[1]3;ms[0]-0.5*qv; //y-0.5xms[1]0.5*qv1.0; //y0.5x1.0}else if((qvZO)(qvPS)){index[0]3;index[1]4;ms[0]-0.5*qv1.0; //y-0.5x1.0ms[1]0.5*qv; //y0.5x}else if((qvPS)(qvPM)){index[0]4;index[1]5;ms[0]-0.5*qv2.0; //y-0.5x2.0ms[1]0.5*qv-1.0; //y0.5x-1.0}else if((qvPM)(qvPB)){index[0]5;index[1]6;ms[0]-0.5*qv3.0; //y-0.5x3.0ms[1]0.5*qv-2.0; //y0.5x-2.0}
}
接下来我们实现模糊推理的函数有了前面的基础和模糊规则库模糊计算的函数其实已经简单了。
/*解模糊化操作,根据具体的量化函数和隶属度函数调整*/
static void FuzzyComputation (FUZZYPID *vPID,float pv,float *deltaK)
{float qValue[2]{0,0}; //偏差及其增量的量化值int indexE[2]{0,0}; //偏差隶属度索引float msE[2]{0,0}; //偏差隶属度int indexEC[2]{0,0}; //偏差增量隶属度索引float msEC[2]{0,0}; //偏差增量隶属度float qValueK[3];LinearQuantization(vPID,pv,qValue);CalcMembership(msE,qValue[0],indexE);CalcMembership(msEC,qValue[1],indexEC);qValueK[0]msE[0]*(msEC[0]*ruleKp[indexE[0]][indexEC[0]]msEC[1]*ruleKp[indexE[0]][indexEC[1]])msE[1]*(msEC[0]*ruleKp[indexE[1]][indexEC[0]]msEC[1]*ruleKp[indexE[1]][indexEC[1]]);qValueK[1]msE[0]*(msEC[0]*ruleKi[indexE[0]][indexEC[0]]msEC[1]*ruleKi[indexE[0]][indexEC[1]])msE[1]*(msEC[0]*ruleKi[indexE[1]][indexEC[0]]msEC[1]*ruleKi[indexE[1]][indexEC[1]]);qValueK[2]msE[0]*(msEC[0]*ruleKd[indexE[0]][indexEC[0]]msEC[1]*ruleKd[indexE[0]][indexEC[1]])msE[1]*(msEC[0]*ruleKd[indexE[1]][indexEC[0]]msEC[1]*ruleKd[indexE[1]][indexEC[1]]);deltaK[0]LinearRealization(vPID-maxdKp,vPID-mindKp,qValueK[0]);deltaK[1]LinearRealization(vPID-maxdKi,vPID-mindKi,qValueK[1]);deltaK[2]LinearRealization(vPID-maxdKd,vPID-mindKd,qValueK[2]);
}
至此Kp、Ki和Kd的增量已经得到剩下的就是修正三个参数并用于实现PID调节与普通的增量型PID无异不再赘述。
4、总结
模糊PID算法是模糊算法在PID参数整定上的应用与纯粹的模糊控制算法是有区别的。普通的模糊控制器适用于直接推理控制器的输出而模糊PID算法使用模糊算法修改PID参数最终的控制器输出依然是由PID控制器来实现的。
模糊控制本身是非常复杂且具体应用方式很多。大多是针对特定对象的专业控制器已经脱离了PID这种通用性控制器的范畴。此外比较热门的还有模糊多变量控制器是属于先进控制系统APC的范畴有机会再讨论。
欢迎关注