pid控制和模糊pid控制,pid控制与模糊pid控制比较

  pid控制和模糊pid控制,pid控制与模糊pid控制比较

  在实际控制中,被控系统不是线性的、时不变的,所以往往需要动态调整PID的参数,而模糊控制正好可以满足这种需求,所以在下一节中,我们将讨论模糊PID控制器的相关问题。模糊控制器是一种将模糊算法与PID控制参数自整定相结合的控制算法。可以说是模糊算法在PID参数整定中的应用。

  1.模糊算法原理

  模糊算法是一种基于智能推理的算法。虽然不模糊,但其实是一种逐渐细化的思路。一个模糊控制器主要由三个功能模块组成:模糊化、模糊推理机和精度与知识库(包括数据库和规则库)。这里我们讨论模糊控制的几个主要问题。

  1.1.投入量的量化

  输入数据都是精确的,为了实现模糊算法,需要对它们进行量化。所谓量化,就是通过量化函数把输入量投射到某个数级上,这个数级一般是相对于0对称的数区间。具体投影区间要看实际情况,因为会直接影响计算的精度。

  1.2、模糊化

  模糊化是模糊算法中非常重要的一步。首先,确定每个语言变量对应的模糊子集。然后根据量化结果,判断输入所属的集合,计算相应的隶属度。计算隶属度的方法很多,最常用的是使用三角形隶属度函数或梯形隶属度函数。

  1.3、规则库

  规则库基于控制变量的模糊性,是模糊推理的基础,很大程度上依赖于经验。规则库有很多种形式,具体的实现形式取决于我们的方便程度。

  1.4、推理机

  推理决策是模糊控制的核心。它利用知识库中的信息和模糊运算方式来模拟人们推理决策的思维方式。在一定的输入条件下,它激活相应的控制规则,给出合适的模糊控制输出。

  1.5,精度

  通过模糊推理,我们得到一系列模糊表达式,这些表达式需要去模糊化才能得到稀缺数据。常用的歧义解决方法有:

  最大隶属度法3354计算简单,适用于控制要求不高的场合。重心法3354输出比较平滑,但是计算比较困难。加权平均法3354通常是工业中应用最广泛的方法。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]七个语言变量,以足够的精度表示它们的模糊子集。因此,我们将e和ec的模糊子集定义为{NB,NM,NS,ZO,PS,PM,PB}。

  确定了模糊子集后,我们如何将E和ec的具体值对应到模糊集呢?我们需要引入一个量子化函数。为了确定量化函数,我们首先引入E和ec模糊集对应的论域,定义为{-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6}。对于任何一个物理量测量信号,都有一个范围,我们称之为Vmax和Vmin,这个范围与PID调节中设定值的期望范围相同,所以偏差E的范围是从Vmin-Vmax到Vmax-Vmin,偏差的增量范围是这个范围的两倍。我们这里用线性量化,它的函数关系是:

  e和ec可以用上面的量化函数量化,我们可以用4对5输入的方法得到某个模糊子集。但是考虑到E和ec的变化是连续的,4到5-in可能会影响控制精度,所以我们引入隶属度来实现这个过程。

  最后,确定E和ec在模糊子集上的隶属度。隶属度是一个介于0和1之间的值,用来描述对应的输入属于某个模糊自我的程度。一般我们描述为隶属函数,可以使用的隶属函数有很多。第二次,我们使用线性隶属函数,或三角隶属函数,其函数关系如下:

  如果我们量化的结果是1,那么ZO的隶属度是0.5,PS的隶属度也是0.5。至此,模糊化完成。

  2.2.建立模糊规则表。

  我们已经简要描述了输入的模糊性,但模糊推理是模糊控制的基础。为了实现模糊推理,首先要建立模糊推理的规则库或知识库,然后建立推理机进行推理。

  首先,我们来建立一个模糊规则库。这里要调整参数Kp,Ki,Kd,所以要建立这三个变量的模糊规则库。

  (1) Kp模糊规则设计

  在PID控制器中,Kp值的选择取决于系统的响应速度。提高Kp可以提高响应速度,减小稳态偏差;但是,如果Kp的值过高,就会出现较大的超调,甚至会降低系统的不稳定性。Kp可以减少超调,提高稳定性,但如果Kp过小,会减慢响应速度,延长调整时间。因此,在调节初期,应取较大的Kp值以提高响应速度,而在调节中期,应取较小的Kp值以使系统具有较小的超调量,并保证一定的响应速度。在调节过程的后期,将Kp值调整到一个较大的值,以减小静态误差,提高控制精度。基于以上描述,我们将Kp的模糊规则定义如下:

  (2) Ki模糊规则设计

  在系统控制中,积分控制主要用于消除系统的稳态偏差。由于某些原因(如饱和非线性等。),积分过程可能会在调节过程的前期产生积分饱和,从而造成调节过程的大超调。因此,在调整过程的前期,为防止积分饱和,其积分函数应较弱,甚至为零;在调节中期,为避免影响稳定性,其积分函数应适中;在最终处理的后期,应加强积分功能,以减少调整静态误差。根据以上分析,我们制定了Ki模糊规则如下:

  (3) Kd模糊规则设计

  微分环节的调节主要是针对大惯性过程介绍的,微分环节系数的作用是改变系统的动态特性。系统的微分系数可以反映信号的变化趋势,可以在偏差信号变化太大之前向系统引入有效的早期校正信号,从而加快响应速度,减少调节时间,消除振荡,最终改变系统的动态性能。因此,Kd值的选取对调节的动态特性影响很大。如果Kd值过大,调整过程中制动会提前,导致调整时间过长;如果Kd值太小,在调节过程中制动会滞后,导致超调量增加。根据实际的工艺经验,在调整的初始阶段,应该增加微分动作,这样可以减少甚至避免超调。从中期来看,由于调整特性对Kd值的变化比较敏感,所以Kd值要小一些,保持不变。然后,在调节后期要降低Kd值,以降低被控过程的制动作用,然后补偿调节过程前期较大的Kd值造成的调节过程的时间延长。根据以上分析,我们将Kd的模糊规则公式化如下:

  接下来,根据偏差E和偏差增量EC的模糊结果以及规则库,推导出KP、KI和KD对应的模糊子集。由于我们设计了隶属函数来定义模糊子集中输入和输出的隶属度,因此推导出的KP、KI和KD的模糊子集通常是由模糊变量组成的矩阵。输入E和EC是由模糊变量组成的向量。

  最后,我们需要明确不同模糊变量对应的量化数据。定量数据和物理量的对应关系根据对象的不同是完全不同的。

  2.3.消除歧义。

  对于获得的目标物体,我们还需要对其进行模糊处理,使其与具体的物理量相对应。在模糊PID调解中,我们需要Kp,Ki,Kd,所以需要根据模糊推理的结果得到我们想要的Kp,Ki,Kd的值。

  我们之前设计了三角隶属函数,采用了相同的量化指标,即论域{-6,6},所以在某一时刻,输入和输出所在的模糊变量的隶属度是相同的。在此基础上,我们采用重心法计算每个产量的定量值。公式如下:

  实际上,由于我们使用的隶属函数的特性,任何方向上计算的隶属度之和都是1,所以分母可以省略。所以每个对象的计算实际上是一个矩阵运算,公式如下:

  如果使用定量值,需要换算成实际值。这方面直接用物理值是没有问题的。如何处理,根据实际需要决定。在得到增量后,我们还可以引入系数来放大和缩小Kp、Ki和Kd的变化。具体实现公式如下:其中k是我们计算的值,是系数。设置增量对最终增量的影响。

  3.模糊PID算法的实现

  我们之前描述了算法的全过程,然后进行了编码。首先,我们还需要定义一个模糊PID控制器的结构对象。

  /*定义结构和公共机构*/

  typedef结构

  {

  浮动设定值;/*设定值*/

  浮动KP;/*比例因子*/

  浮动ki;/*积分系数*/

  浮动KD;/*微分系数*/

  float lasterror/*先前节拍偏差*/

  浮点预误差;/*前两拍的偏差*/

  浮动死区;/*死区*/

  浮点输出;/*输出值*/

  浮点结果;/*物理量的输出值*/

  浮动最大值;/*输出值的上限*/

  浮动最小值;/*输出值的下限*/

  float maxdKp/*Kp增量的最大限制*/

  浮动mindKp/*Kp增量的最小限制*/

  浮动qKp/*Kp增量的影响系数*/

  float maxdKi/*最大限制/*Ki增量*/

  浮明基;/*最小限制/*Ki增量*/

  浮动qKi/*影响系数/*Ki增量*/

  float maxdKd/*最大限制/*Kd增量*/

  float mindKd/*最小限制/*Kd增量*/

  浮动qKd/*影响系数/*Kd增量*/

  } FUZZYPID接下来,实现输入值的模糊化。我们设计了线性量化器

  静态空线性量化(FUZZYPID *vPID,float pv,float *qValue)

  {

  float thisError

  浮点deltaError

  this error=vPID-setpoint-PV;//计算偏差值

  delta error=this error-vPID-lasterror;//计算偏差增量

  qValue[0]=6.0*thisError/(vPID-最大值-vPID-最小值);

  q value[1]=3.0 * delta error/(vPID-最大值-vPID-最小值);

  }其实对于量化函数可以根据需要使用不同的函数,比如下坡曲线函数,正分布函数等一元函数,但是对于我们这里的目标使用线性函数就足够了。隶属函数也有很多选择。这里,我们使用计算量较少的三角形隶属函数:

  /*成员资格计算函数*/

  静态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.0

  ms[1]=0.5 * qv 3.0;//y=0.5x 3.0

  }

  else if((qv=-NM) (qv -NS))

  {

  index[0]=1;

  index[1]=2;

  ms[0]=-0.5 * qv-1.0;//y=-0.5x-1.0

  ms[1]=0.5 * qv 2.0;//y=0.5x 2.0

  }

  else if((qv=-NS) (qv ZO))

  {

  index[0]=2;

  index[1]=3;

  ms[0]=-0.5 * qv;//y=-0.5x

  ms[1]=0.5 * qv 1.0;//y=0.5x 1.0

  }

  else if((qv=ZO) (qv PS))

  {

  index[0]=3;

  index[1]=4;

  ms[0]=-0.5 * qv 1.0;//y=-0.5x 1.0

  ms[1]=0.5 * qv;//y=0.5x

  }

  else if((qv=PS) (qv PM))

  {

  index[0]=4;

  index[1]=5;

  ms[0]=-0.5 * qv 2.0;//y=-0.5x 2.0

  ms[1]=0.5 * qv-1.0;//y=0.5x-1.0

  }

  else if((qv=PM) (qv=PB))

  {

  index[0]=5;

  index[1]=6;

  ms[0]=-0.5 * qv 3.0;//y=-0.5x 3.0

  ms[1]=0.5 * qv-2.0;//y=0.5x-2.0

  }

  }接下来,我们实现模糊推理的功能。有了前面的基础和模糊规则库,模糊计算的功能其实很简单。

  /*模糊化操作,根据具体的量化函数和隶属函数进行调整*/

  静态void模糊计算(模糊PID *vPID,浮点pv,浮点*deltaK)

  {

  float qValue[2]={0,0 };//偏差及其增量的量化值

  int indexE[2]={0,0 };//偏差成员索引

  float msE[2]={0,0 };//偏差隶属度

  int indexEC[2]={0,0 };//偏差增量成员索引

  浮点msEC[2]={0,0 };//偏差增量隶属度

  float qValueK[3];

  线性量化(vPID,pv,q value);

  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]* rule ki[indexE[0]][indexEC[0]]msEC[1]* rule ki[indexE[0]][indexEC[1]])

  msE[1]*(msEC[0]* rule ki[indexE[1]][indexEC[0]]msEC[1]* rule ki[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]* rule KD[indexE[1]][indexEC[0]]msEC[1]* rule KD[indexE[1]][indexEC[1]]);

  deltaK[0]=linear realization(vPID-maxdKp,vPID- mindKp,qValueK[0]);

  deltaK[1]=linear realization(vPID-maxd ki,vPID- mindKi,qValueK[1]);

  deltaK[2]=linear realization(vPID-maxdKd,vPID- mindKd,qValueK[2]);

  }到目前为止,Kp,Ki,Kd的增量已经得到了,剩下的就是修改三个参数,用它们来实现PID调节,和普通的增量PID没什么区别,这里就不赘述了。

  4.摘要

  模糊PID算法是模糊算法在PID参数整定中的应用,不同于纯模糊控制算法。普通模糊控制器适用于直接推理控制器输出,而模糊PID算法采用模糊算法修改PID参数,最终的控制器输出仍由PID控制器实现。

  模糊控制本身很复杂,具体的应用方式有很多。它们大多是针对特定对象的专用控制器,已经脱离了PID这种通用控制器的范畴。另外,模糊多变量控制器属于先进控制系统(APC)的范畴也比较通俗,所以我们有机会再讨论一下。

  欢迎关注:

  想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • waitpid函数作用,c wait函数
  • waitpid函数作用,c wait函数,详解C语言中的wait()函数和waitpid()函数
  • ,,javascript SpiderMonkey中的函数序列化如何进行
  • spiderfoot安装,spiderfoot会被对手反扫描
  • PySpider,pyspider官方文档
  • C语言PID,pid控制算法的c语言实现
  • pid控制死区范围,带死区的pid控制方法有何优点
  • pid控制器中微分的作用,pid控制微分方程
  • 微分先行的pid控制算法课程设计,什么是微分先行pid控制
  • 设计pid控制器并设定参数,pid控制器参数设置
  • PID控制器百科,PID控制实现
  • PID控制算法原理,pid 控制算法
  • pid控制中积分控制指什么,数字pid控制器积分项的改进有哪些
  • pid控制器的调节原则,试说明pid控制器的优点
  • 通过进程名查找进程的pid,linux根据程序名查进程
  • 留言与评论(共有 条评论)
       
    验证码: