在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            模糊控制算法子程序

            作者: 時(shí)間:2016-11-23 來(lái)源:網(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ù)庫(kù)-----------------------------------------------------------
            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é)果不超過(guò)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)行快速訪問(wè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)閉