新聞中心

        模糊控制算法子程序

        作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        程序?yàn)槟:刂瞥绦颍?位單片機(jī),為模糊控制算法程序,實(shí)現(xiàn)簡(jiǎn)單的模糊控制,經(jīng)實(shí)踐總結(jié)得出,當(dāng)調(diào)整幅度較大時(shí),會(huì)出現(xiàn)振蕩,系統(tǒng)難以達(dá)到穩(wěn)定,這就需要更高一級(jí)的算法控制調(diào)整,當(dāng)調(diào)整幅度較小時(shí),系統(tǒng)可以很快達(dá)到穩(wěn)定。
        以下為模糊算法源程序:

        #include "reg52.h"
        //------------------------------------------------------------------------------------
        // 定義差距輸入常量
        #define GAP_ZERO 0x00
        #define GAP_VSMALL 0x01
        #define GAP_SMALL 0x02
        #define GAP_MEDIUM 0x03
        #define GAP_BIG 0x04
        // 定義控制輸出常量
        #define TURN_ZERO 0x80
        #define TURN_VSMALL 0x81
        #define TURN_SMALL 0x82
        #define TURN_MEDIUM 0x83
        #define TURN_BIG 0x84
        //-------------定義常量----------------------------------------------------------------
        #define MU_MAX 0XFF //模糊度的最大值為0XFF代表面1
        #define RULE_TOT 10 //規(guī)則數(shù)個(gè)數(shù)
        #define MF_TOT 5 //成員函數(shù)的個(gè)數(shù)
        #define IO_NUM 0x07
        #define LABEL_NUM 0x70
        #define DEFAULT_VALUE 0x00
        //----------------定義數(shù)據(jù)庫-----------------------------------------------------------
        unsigned char code output_memf[MF_TOT]={0, 15, 35, 60, 102};// OUTPUT TURNING NUMBER:
        //ZERO, VSMALL, SMALL, MEDIUM, BIG
        unsigned char code input_memf[MF_TOT][4]={
        // 輸入功能函數(shù)以點(diǎn)斜式方式存儲(chǔ). 第一維成員函數(shù)標(biāo)號(hào)第二維是點(diǎn)斜式數(shù)據(jù)
        //距離功能函數(shù)
        { 0x00, 0x00, 0x00, 0x0d }, // VSLOW
        { 0x00, 0x0d, 0x14, 0x0d }, // SLOW
        { 0x1e, 0x0d, 0x32, 0x0d }, // MEDIUM
        { 0x3C, 0x0d, 0x50, 0x0d }, // FAST
        { 0x50, 0x09, 0x6e, 0x00 } // VFAST
        };
        //-----------定義模糊系統(tǒng)規(guī)則-----------------------------------------------------------
        unsigned char code rules[RULE_TOT]={
        // if... then...
        GAP_ZERO,TURN_ZERO,
        GAP_VSMALL,TURN_VSMALL,
        GAP_SMALL,TURN_SMALL,
        GAP_MEDIUM,TURN_MEDIUM,
        GAP_BIG,TURN_BIG
        };
        //-----------定義各變量-----------------------------------------------------------------
        unsigned char outputs[MF_TOT],fuzzy_out; //模糊輸出mu值
        //-----------子程序函數(shù)頭申明-----------------------------------------------------------
        void fuzzy_engine(uchar);
        uchar compute_memval(uchar,uchar);
        void defuzzify(void);

        uchar compute_memval(uchar input,uchar label)
        {
        int data temp;
        if (input < input_memf[label][0])
        { // 如果輸入不在曲線下u值為0
        return 0;
        }
        else
        {
        if (input < input_memf[label][2])
        {
        temp=input; // 用點(diǎn)斜式計(jì)算mu
        temp-=input_memf[label][0];
        if (!input_memf[label][1])
        {
        temp=MU_MAX;
        }
        else
        {
        temp*=input_memf[label][1];
        }
        if (temp < 0x100)
        { // 如果結(jié)果不超過1
        return temp; // 返回計(jì)算結(jié)果
        }
        else
        {
        return MU_MAX; // 確保mu值在范圍內(nèi)
        }
        }
        else
        { // 輸入落在第二條斜線上
        temp=input; // 用點(diǎn)斜式方法計(jì)算 mu
        temp-=input_memf[label][2];
        temp*=input_memf[label][3];
        temp=MU_MAX-temp;
        if (temp < 0)
        { // 確保結(jié)果不小于0
        return 0;
        }
        else
        {
        return temp; // mu為正 – 返回結(jié)果
        }
        }
        }
        return 0;
        }

        void defuzzify(void)
        {
        unsigned long numerator, denominator;
        unsigned char j;
        numerator=0; // 恢復(fù)總數(shù)值
        denominator=0;
        for (j=0; j { // 計(jì)算總和值
        numerator+=(outputs[j]*output_memf[j]);
        denominator+=outputs[j];
        outputs[j]=0; // 清零輸出作為參考使用 }
        if (denominator)
        { // 確保分母是0的情況不發(fā)生
        fuzzy_out=numerator/denominator; // 確定 COG
        }
        else
        {
        fuzzy_out=DEFAULT_VALUE; // 沒有規(guī)則被觸發(fā)
        }
        }
        }

        unsigned char bdata clause_val; // 保存當(dāng)前的分支進(jìn)行快速訪問
        sbit clause_type = clause_val^7; // 表示分支是否是條件分支或者是結(jié)果分支
        void fuzzy_engine(uchar input)
        {
        bit then; // 當(dāng)正在分析結(jié)果時(shí)置位
        unsigned char if_val, // 保存當(dāng)前規(guī)則中條件分支中的值
        clause, // 規(guī)則基中當(dāng)前的分支
        mu, // 保存當(dāng)前分支中的值
        label=0; // 被條件使用的成員函數(shù)
        then=0; // 設(shè)第一個(gè)分支是條件分支
        if_val=MU_MAX; // max out mu for the first rule
        for (clause=0; clause { // 遍歷每條規(guī)則
        clause_val=rules[clause]; // 讀入當(dāng)前的分支
        if (!clause_type)
        { // 當(dāng)前的分支是不是條件分支
        if (then)
        { // 是否正在分析結(jié)果...
        then=0;
        if_val=MU_MAX; // 復(fù)位mu
        }
        mu=compute_memval(input, label); // 得到條件分支的值
        if_val=mu;
        label++;
        }
        else
        { // 當(dāng)前分支是結(jié)果
        then=1; // 置位標(biāo)志位,如果當(dāng)前規(guī)則的mu比參考的值要大,保存這個(gè)值作為新的模糊輸出
        if (outputs[clause_val&0x07] < if_val)
        {
        outputs[clause_val&0x07]=if_val;
        }
        }
        }
        defuzzify(); // 用COG方法計(jì)算模糊輸出和反模糊輸出
        }
        //------------------------------------------------------------------------------
        給出模糊控制的流程圖,若想完全理解清楚其控制原理,最好還是要找想關(guān)的模糊控制理論書籍,方能理解透徹:
        1.控制理論框圖
        2.控制算法的總流程圖,對(duì)應(yīng)模糊控制算法的程序流程圖



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 女性| 泗洪县| 嘉峪关市| 拉萨市| 大名县| 宣汉县| 乌拉特中旗| 盐亭县| 蛟河市| 宁明县| 饶河县| 汉川市| 加查县| 镇远县| 车险| 永平县| 昌宁县| 申扎县| 西安市| 沙洋县| 宣城市| 晋城| 泾阳县| 美姑县| 金乡县| 苏尼特右旗| 马边| 禹城市| 辽宁省| 阿拉善左旗| 浪卡子县| 汝州市| 青神县| 石景山区| 乐陵市| 凤冈县| 永德县| 锦州市| 洮南市| 峡江县| 通州市|