搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2017-3-27 20:03:51 | 显示全部楼层 |阅读模式
这个是在网上找到的程序应该是可以用。有一块我没有理解

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

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

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


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

int rule[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(int P,int D)   /*模糊运算引擎*/   //其中P代表Error D代表D_Error
{
        int    U;           /*偏差,偏差微分以及输出值的精确量*/
        unsigned int   PF[2],DF[2],UF[4];   /*偏差,偏差微分以及输出值的隶属度*/
        int    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]));
            }
            else if(P<=-PFF[1])   
            {
                           Pn=-1;
                            PF[0]=FMAX*((float)(-PFF[1]-P)/(PFF[2]-PFF[1]));
            }
            else if(P<=PFF[0])   
            {
                            Pn=0;
                    PF[0]=FMAX*((float)(-PFF[0]-P)/(PFF[1]-PFF[0]));
            }
            else if(P<=PFF[1])   
            {
                     Pn=1;
                        PF[0]=FMAX*((float)(PFF[1]-P)/(PFF[1]-PFF[0]));
            }
            else if(P<=PFF[2])
            {
                    Pn=2;
                        PF[0]=FMAX*((float)(PFF[2]-P)/(PFF[2]-PFF[1]));
            }
            else if(P<=PFF[3])   
           {
                            Pn=3;
                        PF[0]=FMAX*((float)(PFF[3]-P)/(PFF[3]-PFF[2]));
            }                  
        }
        else if(P<=-PFF[3])   
        {
            Pn=-2;   PF[0]=FMAX;
        }
        else if(P>=PFF[3])   
        {
            Pn=3;   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]));
            }
            else if(D<=-DFF[1])   
            {
                    Dn=-1;
                    DF[0]=FMAX*((float)(-DFF[1]-D)/(DFF[2]-DFF[1]));
            }
            else if(D<=DFF[0])   
            {
                    Dn=0;
                    DF[0]=FMAX*((float)(-DFF[0]-D)/(DFF[1]-DFF[0]));
            }  
            else if(D<=DFF[1])   
            {
                    Dn=1;
                    DF[0]=FMAX*((float)(DFF[1]-D)/(DFF[1]-DFF[0]));
            }
            else if(D<=DFF[2])   
            {
                    Dn=2; DF[0]=FMAX*((float)(DFF[2]-D)/(DFF[2]-DFF[1]));
            }
            else if(D<=DFF[3])   
            {
                    Dn=3; DF[0]=FMAX*((float)(DFF[3]-D)/(DFF[3]-DFF[2]));
            }   
        }
        else if(D<=-DFF[3])   
        {
            Dn=-2;
            DF[0]=FMAX;
        }
        else if(D>=DFF[3])   
        {
           Dn=3;
           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]<=DF[0])
           UF[1]=PF[1];
        else
           UF[1]=DF[0];
          
        if(PF[0]<=DF[1])
           UF[2]=PF[0];
        else
           UF[2]=DF[1];
          
        if(PF[1]<=DF[1])
           UF[3]=PF[1];
        else
           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])
        {
           if(UF[0]>UF[2])
            UF[2]=0;
           else
            UF[0]=0;
        }
        if(Un[0]==Un[3])
        {
           if(UF[0]>UF[3])
            UF[3]=0;
           else
            UF[0]=0;
        }
        if(Un[1]==Un[2])
        {
           if(UF[1]>UF[2])
            UF[2]=0;
           else
            UF[1]=0;
        }
        if(Un[1]==Un[3])
        {
           if(UF[1]>UF[3])
            UF[3]=0;
           else
            UF[1]=0;
        }
        if(Un[2]==Un[3])
        {
           if(UF[2]>UF[3])
            UF[3]=0;
           else
            UF[2]=0;
        }
       
        /*重心法反模糊*/
        /*Un[]原值为输出隶属函数标号,转换为隶属函数值*/
        if(Un[0]>=0)
           Un[0]=UFF[Un[0]];
        else
           Un[0]=-UFF[-Un[0]];
          
        if(Un[1]>=0)
           Un[1]=UFF[Un[1]];
        else
           Un[1]=-UFF[-Un[1]];
          
        if(Un[2]>=0)
           Un[2]=UFF[Un[2]];
        else
           Un[2]=-UFF[-Un[2]];
          
        if(Un[3]>=0)
           Un[3]=UFF[Un[3]];
        else
           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;
        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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-3-28 13:20:11 | 显示全部楼层
看了半天也看不懂

出0入0汤圆

 楼主| 发表于 2017-3-28 14:58:21 | 显示全部楼层
hgh1013 发表于 2017-3-28 13:20
看了半天也看不懂

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

出0入0汤圆

发表于 2017-3-28 18:09:25 | 显示全部楼层
头上两只角 发表于 2017-3-28 14:58
那你以前接触过模糊控制这方面的东西吗?

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

出0入0汤圆

发表于 2017-3-28 19:38:00 | 显示全部楼层
hgh1013 发表于 2017-3-28 18:09
项目上刚好需要这个理论控制,正在恶补中

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

出0入0汤圆

发表于 2017-3-28 20:09:51 | 显示全部楼层
3050311118 发表于 2017-3-28 19:38
有进展 上传一些资料给我们看看啊

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

出0入0汤圆

 楼主| 发表于 2017-3-28 22:03:48 | 显示全部楼层
hgh1013 发表于 2017-3-28 18:09
项目上刚好需要这个理论控制,正在恶补中

我也是在做项目恶补。   看懂的话可以交流交流。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 15:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表