头上两只角 发表于 2017-3-27 20:03:51

关于模糊控制的一些疑问?

这个是在网上找到的程序应该是可以用。有一块我没有理解

if(PF<=DF)
           UF=PF;
        else
           UF=DF;   为什么要这么写是什么意思。

#include <stdio.h>
#include"math.h"         
#define FMAX    100       /*语言值的满幅值*/

int PFF={0,200,300,400};   //7个状态      
/*输入量D语言值特征点*/
int DFF={0,100,200,300};   //7个


/*输出量U语言值特征点*/
int UFF={0,10,30,50,60,80,100};
int UFF_D={0,100,200,300,400,500,600};

int rule={
//误差变化率 -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(int P,int D)   /*模糊运算引擎*/   //其中P代表Error D代表D_Error
{
        int    U;         /*偏差,偏差微分以及输出值的精确量*/
        unsigned int   PF,DF,UF;   /*偏差,偏差微分以及输出值的隶属度*/
        int    Pn,Dn,Un;
        long   temp1,temp2;      

        /*隶属度的确定*/
        /*根据PD的指定语言值获得有效隶属度*/
        if(P>-PFF && P<PFF)
        {
          if(P<=-PFF)   
          {
                  Pn=-2;
                          PF=FMAX*((float)(-PFF-P)/(PFF-PFF));
          }
          else if(P<=-PFF)   
          {
                           Pn=-1;
                          PF=FMAX*((float)(-PFF-P)/(PFF-PFF));
          }
          else if(P<=PFF)   
          {
                          Pn=0;
                  PF=FMAX*((float)(-PFF-P)/(PFF-PFF));
          }
          else if(P<=PFF)   
          {
                     Pn=1;
                        PF=FMAX*((float)(PFF-P)/(PFF-PFF));
          }
          else if(P<=PFF)
          {
                  Pn=2;
                        PF=FMAX*((float)(PFF-P)/(PFF-PFF));
          }
          else if(P<=PFF)   
           {
                          Pn=3;
                        PF=FMAX*((float)(PFF-P)/(PFF-PFF));
          }                  
        }
        else if(P<=-PFF)   
        {
          Pn=-2;   PF=FMAX;
        }
        else if(P>=PFF)   
        {
          Pn=3;   PF=0;
        }
        PF=FMAX-PF;
       
        /*误差微分进行模糊化 获得有效的隶属度函数*/
       
        if(D>-DFF && D<DFF)
        {
          if(D<=-DFF)   
          {
                 Dn=-2;DF=FMAX*((float)(-DFF-D)/(DFF-DFF));
          }
          else if(D<=-DFF)   
          {
                  Dn=-1;
                  DF=FMAX*((float)(-DFF-D)/(DFF-DFF));
          }
          else if(D<=DFF)   
          {
                  Dn=0;
                  DF=FMAX*((float)(-DFF-D)/(DFF-DFF));
          }
          else if(D<=DFF)   
          {
                  Dn=1;
                  DF=FMAX*((float)(DFF-D)/(DFF-DFF));
          }
          else if(D<=DFF)   
          {
                  Dn=2; DF=FMAX*((float)(DFF-D)/(DFF-DFF));
          }
          else if(D<=DFF)   
          {
                  Dn=3; DF=FMAX*((float)(DFF-D)/(DFF-DFF));
          }   
        }
        else if(D<=-DFF)   
        {
          Dn=-2;
          DF=FMAX;
        }
        else if(D>=DFF)   
        {
           Dn=3;
           DF=0;
        }
        DF=FMAX-DF;
        /*使用误差范围优化后的规则表rule*/
        /*输出值使用13个隶属函数,中心值由UFF指定*/
        /*一般都是四个规则有效*/
        Un=rule;
        Un=rule;
        Un=rule;   
        Un=rule;
        if(PF<=DF)
           UF=PF;
        else
           UF=DF;
          
        if(PF<=DF)
           UF=PF;
        else
           UF=DF;
          
        if(PF<=DF)
           UF=PF;
        else
           UF=DF;
          
        if(PF<=DF)
           UF=PF;
        else
           UF=DF;
        /*同隶属函数输出语言值求大*/
          
        if(Un==Un)
        {
           if(UF>UF)
          UF=0;
           else
          UF=0;
        }
        if(Un==Un)
        {
           if(UF>UF)
          UF=0;
           else
          UF=0;
        }
        if(Un==Un)
        {
           if(UF>UF)
          UF=0;
           else
          UF=0;
        }
        if(Un==Un)
        {
           if(UF>UF)
          UF=0;
           else
          UF=0;
        }
        if(Un==Un)
        {
           if(UF>UF)
          UF=0;
           else
          UF=0;
        }
        if(Un==Un)
        {
           if(UF>UF)
          UF=0;
           else
          UF=0;
        }
       
        /*重心法反模糊*/
        /*Un[]原值为输出隶属函数标号,转换为隶属函数值*/
        if(Un>=0)
           Un=UFF];
        else
           Un=-UFF[-Un];
          
        if(Un>=0)
           Un=UFF];
        else
           Un=-UFF[-Un];
          
        if(Un>=0)
           Un=UFF];
        else
           Un=-UFF[-Un];
          
        if(Un>=0)
           Un=UFF];
        else
           Un=-UFF[-Un];
          
        temp1=UF*Un+UF*Un+UF*Un+UF*Un; //加权平均法
        temp2=UF+UF+UF+UF;
        U=temp1/temp2;
        return U;
}

int main()
{
        int a=0,e,ec;
        while(1)
        {
                printf("请输入e:");
                scanf("%d",&e);
      printf("请输入ec:");
                scanf("%d",&ec);
                a=Fuzzy(e,ec);
      printf("e: %d   ec: %d    ",e,ec);
                printf("a: %d   \n",a);
        }
       
        return 0;
}

hgh1013 发表于 2017-3-28 13:20:11

看了半天也看不懂

头上两只角 发表于 2017-3-28 14:58:21

hgh1013 发表于 2017-3-28 13:20
看了半天也看不懂

那你以前接触过模糊控制这方面的东西吗?

hgh1013 发表于 2017-3-28 18:09:25

头上两只角 发表于 2017-3-28 14:58
那你以前接触过模糊控制这方面的东西吗?

项目上刚好需要这个理论控制,正在恶补中

3050311118 发表于 2017-3-28 19:38:00

hgh1013 发表于 2017-3-28 18:09
项目上刚好需要这个理论控制,正在恶补中

有进展 上传一些资料给我们看看啊

hgh1013 发表于 2017-3-28 20:09:51

3050311118 发表于 2017-3-28 19:38
有进展 上传一些资料给我们看看啊

我们先把楼主发的读懂就好了

头上两只角 发表于 2017-3-28 22:03:48

hgh1013 发表于 2017-3-28 18:09
项目上刚好需要这个理论控制,正在恶补中

我也是在做项目恶补。   看懂的话可以交流交流。
页: [1]
查看完整版本: 关于模糊控制的一些疑问?