精华内容
下载资源
问答
  • 模糊PID控制

    千次阅读 2020-05-15 22:24:02
    PID控制器学习笔记:模糊PID控制器的实现 在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊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参数的不同要求。其结构图如下:
    模糊PID结构

    2.1 输入值的模糊化

    输入值的模糊化就是将用于计算的输入对应到标准化的数值区间,并根据量化结果和模糊化子集得到该输入对子集的隶属度。我们在使用偏差e和偏差增量ec作为输入实现控制参数调整则需要对e和ec进行模糊化。

    首先,我们确定e和ec的模糊子集,对于PID控制我们选则:负大[NB]、负中[NM]、负小[NS]、零[ZO]、正小[PS]、正中[PM]、正大[PB]等7个语言变量就能够有足够精度表达其模糊子集。所以我们定义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入对控制精度可能存在影响,所以我们引入隶属度来实现这一过程。

    最后我们确定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调解中,我们需要的是Kp,Ki和Kd,所以我们需要根据模糊推理的结果得到我们想要的Kp,Ki和Kd值。

    我们前面设计了三角隶属度函数,并采用相同的量化目标即论域{-6,6},所以在某一时刻,输入输出所处的模糊变量的隶属度是相同的,基于这一基础,我们采用重心法计算各输出量的量化值。其公式如下:
    在这里插入图片描述
    其实因为我们采用的隶属度函数的特性,在任何方向的计算隶属度的和均为1,所以分母可以省略。于是每一个对象的计算实际上就是矩阵操作,公式如下:
    在这里插入图片描述
    如果使用的是量化值,则还需要转为实际值,关于这一点直接使用物理量值也是没问题的,怎么处理根据实际需要确定。得到增量后,我们也可以引入系数来放大和缩小Kp,Ki和Kd变化量,具体实现公式如下:
    在这里插入图片描述
    其中∆K为我们所计算得到的值,而α为系数,设定增量对最终值的影响。

    4、总结

    模糊PID算法是模糊算法在PID参数整定上的应用,与纯粹的模糊控制算法是有区别的。普通的模糊控制器适用于直接推理控制器的输出,而模糊PID算法使用模糊算法修改PID参数,最终的控制器输出依然是由PID控制器来实现的。

    模糊控制本身是非常复杂且具体应用方式很多。大多是针对特定对象的专业控制器,已经脱离了PID这种通用性控制器的范畴。此外比较热门的还有模糊多变量控制器是属于先进控制系统(APC)的范畴,有机会再讨论。

    承蒙关照,欢迎关注:
    微信
    微博

    展开全文
  • 模糊pid控制

    2013-04-16 16:58:09
    基于matlAB的模糊自整定pid控制器的设计与仿真 毕业设计
  • simulink PID控制、模糊控制、模糊PID控制对比
  • PID控制器开发笔记之十二:模糊PID控制器的实现

    万次阅读 多人点赞 2018-11-10 19:14:06
    在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊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的模糊子集均为{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入对控制精度可能存在影响,所以我们引入隶属度来实现这一过程。

    最后我们确定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调解中,我们需要的是Kp,Ki和Kd,所以我们需要根据模糊推理的结果得到我们想要的Kp,Ki和Kd值。

    我们前面设计了三角隶属度函数,并采用相同的量化目标即论域{-6,6},所以在某一时刻,输入输出所处的模糊变量的隶属度是相同的,基于这一基础,我们采用重心法计算各输出量的量化值。其公式如下:

    其实因为我们采用的隶属度函数的特性,在任何方向的计算隶属度的和均为1,所以分母可以省略。于是每一个对象的计算实际上就是矩阵操作,公式如下:

    如果使用的是量化值,则还需要转为实际值,关于这一点直接使用物理量值也是没问题的,怎么处理根据实际需要确定。得到增量后,我们也可以引入系数来放大和缩小Kp,Ki和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,-1,0,1,2,3,4,5,6}*/
    static void LinearQuantization(FUZZYPID *vPID,float pv,float *qValue)
    {
      float thisError;
      float deltaError;
    
      thisError=vPID->setpoint-pv;                  //计算偏差值
      deltaError=thisError-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.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
      }
    }

    接下来,我们实现模糊推理的函数,有了前面的基础和模糊规则库,模糊计算的函数其实已经简单了。

    /*解模糊化操作,根据具体的量化函数和隶属度函数调整*/
    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)的范畴,有机会再讨论。

    欢迎关注:

    展开全文
  • 电机模糊pid控制

    2018-11-19 21:58:18
    用于串激电机的闭环控制,可以实现pid控制或模糊pid控制
  • 模糊pid控制C程序

    2019-01-25 21:17:58
    本人对模糊PID控制的两种理解的写法,模糊pid控制C程序,内有一定注释,欢迎交流本人对模糊PID控制的两种理解的写法,模糊pid控制C程序,内有一定注释,欢迎交流
  • simulink实现模糊PID控制

    万次阅读 多人点赞 2020-04-17 00:05:53
    simulink实现模糊PID控制模糊系统建立simulink实现主程序设计模糊PID模块结果展示 LabVIEW实现模糊PID控制可参考博客LabVIEW实现模糊PID控制 模糊系统建立 在matlab命令行输入fuzzy打开模糊系统设计器,设定输入个数...

    simulink实现模糊PID控制的资源链接如右:simulink实现模糊PID控制资源
    LabVIEW实现模糊PID控制可参考博客:LabVIEW实现模糊PID控制博客

    模糊系统建立

    在matlab命令行输入fuzzy打开模糊系统设计器,设定输入个数为2,范围均为[-3,3],输出个数为3,范围均为[-1,1],模糊系统如下图。根据相关文献定义规则,将建立好的模糊文件命名为Fuzzy_PID并保存到本地文件中,用于下一步的导入。
    模糊系统

    simulink实现

    主程序设计

    通过阶跃函数模拟输入信号,将输入信号分别传入自带PID模块与编写的模糊PID模块,将两个模块的控制结果及阶跃信号值通过scope函数进行展示,整体程序框图如下。
    主程序设计
    PID模块参数设置为P:0.05,I:0.01,D:0.005。

    模糊PID模块

    将阶跃信号传入系统,系统通过反馈计算误差及误差变化率,将误差及误差变化率乘以各自的量化因子,模糊系统的误差及误差变化率的值域均为[-3,3],假设实际的误差范围为[-8,8],误差变化率范围为[-16,16],则量化因子分别为0.375和0.1875。量化后的值通过saturation函数处理后传入模糊系统,模糊系统设定如下图,其中Fuzzy_PID应在命令行通过如下语句导入到系统中。

    Fuzzy_PID = readfis(‘Fuzzy_PID’)

    模糊系统设定
    模糊系统设定输出的范围均为[-1,1],因此也应根据相关经验乘以量化因子,并于初始PID参数,即P:0.05,I:0.01,D:0.005求和,处理后的参数传入PID系统中,结合了模糊规则及PID控制的系统即为模糊PID控制系统,系统的程序框图如下。
    模糊PID控制系统

    结果展示

    运行程序,点击scope可查看运行结果如下图,可以看出模糊PID比单独PID更早到达设定值,具有更好的响应速度。
    在这里插入图片描述

    展开全文
  • 模糊PID控制算法

    2018-10-21 20:41:30
    模糊PID控制算法,里面有文档介绍,m文件,清晰解释模糊PID算法的过程
  • 模糊PID控制C语言代码

    2021-01-14 16:34:12
    模糊PID控制C语言代码,codeblock工程
  • CSTR模糊PID控制

    2019-04-27 10:37:57
    此程序为根据CSTR模型进行模糊PID控制,程序仿真等 (CSTR Model and Fuzzy PID Control)
  • 模糊PID控制

    2018-12-08 18:01:51
    模糊PID控制器 基于simulink开发 有三个例子可供参考。
  • 模糊PID控制模型.zip

    2021-06-04 11:23:32
    模糊PID控制模型 simulink
  • 模糊PID控制仿真

    千次阅读 2021-01-23 15:02:37
    模糊PID控制仿真 一、简介 模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控制算法。可以说是模糊算法在PID参数整定上的应用。 自适应模糊PID控制器以误差e和误差变化ec作为输人(利用模糊控制规则...

    模糊PID控制仿真

    一、简介

    模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控制算法。可以说是模糊算法在PID参数整定上的应用。

    自适应模糊PID控制器以误差e和误差变化ec作为输人(利用模糊控制规则在线对PID参数进行修改),以满足不同时刻的e和ec对PID参数自整定的要求。

    PID参数模糊自整定是找出PID的3个参数kp、ki|kd与e和ec之间的模糊关系,在运行中通过不断检测e和ec ,根据模糊控制原理来对3个参数进行在线修改,以满足不同e和ec时对控制参数的要求,从而使被控对象有良好的动、静态性能。

    模糊控制这里不赘述了,可以网上查资料。
     

     

    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的模糊规则如下:

     

    整个自适应模糊PID控制的流程如下所示:

    二、题目要求

    三、实验代码

    1、规则表的建立

    %Fuzzy Tunning PID Control
    clear all;
    close all;
    
    a=newfis('fuzzpid');
    
    a=addvar(a,'input','e',[-3,3]);                        %Parameter e
    a=addmf(a,'input',1,'NB','zmf',[-3,-1]);
    a=addmf(a,'input',1,'NM','trimf',[-3,-2,0]);
    a=addmf(a,'input',1,'NS','trimf',[-3,-1,1]);
    a=addmf(a,'input',1,'Z','trimf',[-2,0,2]);
    a=addmf(a,'input',1,'PS','trimf',[-1,1,3]);
    a=addmf(a,'input',1,'PM','trimf',[0,2,3]);
    a=addmf(a,'input',1,'PB','smf',[1,3]);
    
    a=addvar(a,'input','ec',[-3,3]);                       %Parameter ec
    a=addmf(a,'input',2,'NB','zmf',[-3,-1]);
    a=addmf(a,'input',2,'NM','trimf',[-3,-2,0]);
    a=addmf(a,'input',2,'NS','trimf',[-3,-1,1]);
    a=addmf(a,'input',2,'Z','trimf',[-2,0,2]);
    a=addmf(a,'input',2,'PS','trimf',[-1,1,3]);
    a=addmf(a,'input',2,'PM','trimf',[0,2,3]);
    a=addmf(a,'input',2,'PB','smf',[1,3]);
    
    a=addvar(a,'output','kp',[-0.3,0.3]);                   %Parameter kp
    a=addmf(a,'output',1,'NB','zmf',[-0.3,-0.1]);
    a=addmf(a,'output',1,'NM','trimf',[-0.3,-0.2,0]);
    a=addmf(a,'output',1,'NS','trimf',[-0.3,-0.1,0.1]);
    a=addmf(a,'output',1,'Z','trimf',[-0.2,0,0.2]);
    a=addmf(a,'output',1,'PS','trimf',[-0.1,0.1,0.3]);
    a=addmf(a,'output',1,'PM','trimf',[0,0.2,0.3]);
    a=addmf(a,'output',1,'PB','smf',[0.1,0.3]);
    
    a=addvar(a,'output','ki',[-0.06,0.06]);             %Parameter ki
    a=addmf(a,'output',2,'NB','zmf',[-0.06,-0.02]);
    a=addmf(a,'output',2,'NM','trimf',[-0.06,-0.04,0]);
    a=addmf(a,'output',2,'NS','trimf',[-0.06,-0.02,0.02]);
    a=addmf(a,'output',2,'Z','trimf',[-0.04,0,0.04]);
    a=addmf(a,'output',2,'PS','trimf',[-0.02,0.02,0.06]);
    a=addmf(a,'output',2,'PM','trimf',[0,0.04,0.06]);
    a=addmf(a,'output',2,'PB','smf',[0.02,0.06]);
    
    a=addvar(a,'output','kd',[-3,3]);                   %Parameter kd
    a=addmf(a,'output',3,'NB','zmf',[-3,-1]);
    a=addmf(a,'output',3,'NM','trimf',[-3,-2,0]);
    a=addmf(a,'output',3,'NS','trimf',[-3,-1,1]);
    a=addmf(a,'output',3,'Z','trimf',[-2,0,2]);
    a=addmf(a,'output',3,'PS','trimf',[-1,1,3]);
    a=addmf(a,'output',3,'PM','trimf',[0,2,3]);
    a=addmf(a,'output',3,'PB','smf',[1,3]);
    
    rulelist=[1 1 7 1 5 1 1;
              1 2 7 1 3 1 1;
              1 3 6 2 1 1 1;
              1 4 6 2 1 1 1;
              1 5 5 3 1 1 1;
              1 6 4 4 2 1 1;
              1 7 4 4 5 1 1;
              
              2 1 7 1 5 1 1;
              2 2 7 1 3 1 1;
              2 3 6 2 1 1 1;
              2 4 5 3 2 1 1;
              2 5 5 3 2 1 1;
              2 6 4 4 3 1 1;
              2 7 3 4 4 1 1;
              
              3 1 6 1 4 1 1;
              3 2 6 2 3 1 1;
              3 3 6 3 2 1 1;
              3 4 5 3 2 1 1;
              3 5 4 4 3 1 1;
              3 6 3 5 3 1 1;
              3 7 3 5 4 1 1;
              
              4 1 6 2 4 1 1;
              4 2 6 2 3 1 1;
              4 3 5 3 3 1 1;
              4 4 4 4 3 1 1;
              4 5 3 5 3 1 1;
              4 6 2 6 3 1 1;
              4 7 2 6 4 1 1;
              
              5 1 5 2 4 1 1;
              5 2 5 3 4 1 1;
              5 3 4 4 4 1 1;
              5 4 3 5 4 1 1;
              5 5 3 5 4 1 1;
              5 6 2 6 4 1 1;
              5 7 2 7 4 1 1;
              
              6 1 5 4 7 1 1;
              6 2 4 4 5 1 1;
              6 3 3 5 5 1 1;
              6 4 2 5 5 1 1;
              6 5 2 6 5 1 1;
              6 6 2 7 5 1 1; 
              6 7 1 7 7 1 1;
    
              7 1 4 4 7 1 1; 
              7 2 4 4 6 1 1;
              7 3 2 5 6 1 1;
              7 4 2 6 6 1 1;
              7 5 2 6 5 1 1;
              7 6 1 7 5 1 1;
              7 7 1 7 7 1 1];
           
    a=addrule(a,rulelist);
    a=setfis(a,'DefuzzMethod','centroid');
    %%bisector 面积等分法 lom 最大隶属度取大法 som 最大隶属度取小法
    %%centroid 面积重心法 mom 最大隶属度平均法
    writefis(a,'fuzzpid');
    
    a=readfis('fuzzpid');
    
    figure(1);
    plotmf(a,'input',1);
    figure(2);
    plotmf(a,'input',2);
    figure(3);
    plotmf(a,'output',1);
    figure(4);
    plotmf(a,'output',2);
    figure(5);
    plotmf(a,'output',3);
    figure(6);
    plotfis(a);
    
    fuzzy fuzzpid;
    showrule(a);
    ruleview fuzzpid;
    

    得出上述的规则表:


    2、函数版本仿真

    %Fuzzy PID Control
    close all;
    clear all;
    
    a=readfis('fuzzpid');   %Load fuzzpid.fis
    
    ts=0.5;
    s=tf('s');
    %sys=tf(5.235e005,[1,87.35,1.047e004,0]);
    sys=tf(1,[10,1],'outputdelay',0.5)
    % sys=exp(-0.5*s)*sys
    dsys=c2d(sys,ts,'tustin');
    [num,den]=tfdata(dsys,'v')
    
    u_1=0.0;u_2=0.0;u_3=0.0;
    y_1=0;y_2=0;y_3=0;
    
    x=[0,0,0]';
    
    e_1=0;
    ec_1=0;
    %kp0=0.40;
    kp0=7;
    % kp0=39.6498;
    %kd0=1.0;
    kd0=1.7;
    % kd0=9.4295;
    ki0=2.9;
    % ki0=2.7887;
    
    for k=1:1:30
    time(k)=k*ts;
    
    %r(k)=sign(sin(2*pi*k*ts));
    r(k)=30;
    %Using fuzzy inference to tunning PID
    k_pid=evalfis([0.5*e_1,0.4*ec_1],a);
    kp(k)=kp0+k_pid(1);
    ki(k)=ki0+k_pid(3);
    kd(k)=kd0+k_pid(2);
    u(k)=kp(k)*x(1)+kd(k)*x(2)+ki(k)*x(3);
    
    % if k==300     % Adding disturbance(1.0v at time 0.3s)
    %    u(k)=u(k)+1.0;
    % end
    
    %y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(1)*u(k)+num(2)*u_1+num(3)*u_2+num(4)*u_3;
    y(k)=-den(2)*y_1+num(1)*u(k)+num(2)*u_1;
    %y(k)=-den(2)*y_1+num(2)*u_1;
    
    e(k)=r(k)-y(k);
    %%%%%%%%%%%%%%Return of PID parameters%%%%%%%%%%%%%%%
       u_3=u_2;
       u_2=u_1;
       u_1=u(k);
       
       y_3=y_2;
       y_2=y_1;
       y_1=y(k);
       
       x(1)=e(k);            % Calculating P
       x(2)=e(k)-e_1;        % Calculating D
       x(3)=x(3)+e(k)*ts;    % Calculating I
    
       ec_1=x(2);
       e_2=e_1;
       e_1=e(k);
    end
    
    figure(1);
    plot(time,r,'b',time,y,'r');
    xlabel('time(s)');ylabel('rin,yout');
    figure(2);
    plot(time,e,'r');
    xlabel('time(s)');ylabel('error');
    figure(3);
    plot(time,u,'r');
    xlabel('time(s)');ylabel('u');
    figure(4);
    plot(time,kp,'r');
    xlabel('time(s)');ylabel('kp');
    figure(5);
    plot(time,ki,'r');
    xlabel('time(s)');ylabel('ki');
    figure(6);
    plot(time,kd,'r');
    xlabel('time(s)');ylabel('kd');

    3、simulink仿真

    子系统

    四、实验结果

    1、函数版本

     

    2、simlink仿真

     

    展开全文
  • 模糊PID控制器仿真

    2020-11-10 09:23:37
    Matlab/simulink模糊PID控制器仿真设计,其中模糊控制器包括两个输入,三个输出,采用三角形的隶属度函数(响应速度快),当然也可以改成高斯型或者其他,7个隶属度函数,包含49条隶属度规则,其中的模糊控制器需要...
  • 模糊PID控制.zip

    2019-12-02 10:10:24
    模糊PID控制,研究了 PID 在发电机励磁控制系统的应用。首先建立了发电机励磁控制系统的数学模型,探讨了 PID 算法的数字化,并在MATLAB上进行了仿真试验。附有程序代码。
  • 经典与PID模糊PID控制

    2014-09-15 12:46:58
    介绍经典PID与模糊PID控制
  • 博主中复现文档中的代码与仿真,进行相应的仿真分析。 【精品课设】经典PID与模糊PID控制的对比与分析(一) https://blog.csdn.net/qq_42249050/article/details/118067566
  • slx文件为模糊PID控制,模块齐全,方便使用,只需要修改成需要的信号输入即可
  • 在地铁屏蔽门控制系统中,对无刷直流电机的控制,针对因传统PID控制方式存在的不足,难以达到对电机的理想控制效果,提出一种模糊PID控制策略。通过分析无刷直流电机的数学模型,建立双闭环调速控制系统,并对速度环...
  • Takagi–Sugeno模糊系统的Hinf模糊PID控制综合
  • 构造出一种 PID模糊控制器,并证明了这种模糊控制器近似于一种变参数的PID 控制器。 以 PID 模型为基础,基于无源性定理对模糊 PID 控制器的稳定性进行分析, 导出了使模糊 PID 控制器稳 定的充分条件,为...
  • 模糊PID控制在汽车ABS中的应用与仿真研究-模糊PID 控制在汽车ABS 中的应用与仿真研究.rar ABS 是一种变工况、非线性的系统,参数自整定模糊PID 控制可以利用模糊控制规则对PID 参数进行在线修改,因而具有较好的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,989
精华内容 795
关键字:

模糊pid控制