{"rsdb":{"rid":"158451","subhead":"","postdate":"0","aid":"118820","fid":"49","uid":"1","topic":"1","content":"
<\/p>\n
\u5b9e\u73b0\u6a21\u7cca\u63a7\u5236\u5668\u9700\u8981\u4ee5\u4e0b\u6b65\u9aa4\uff1a<\/p> \u786e\u5b9a\u6a21\u7cca\u63a7\u5236\u5668\u7684\u8f93\u5165\u548c\u8f93\u51fa\u91cf \u8bbe\u8ba1\u6a21\u7cca\u63a7\u5236\u5668\u7684\u63a7\u5236\u89c4\u5219 \u786e\u7acb\u6a21\u7cca\u5316\u548c\u975e\u6a21\u7cca\u5316\u7684\u65b9\u6cd5 \u9009\u62e9\u6a21\u7cca\u63a7\u5236\u5668\u7684\u8f93\u5165\u53d8\u91cf\u548c\u8f93\u51fa\u53d8\u91cf\u7684\u8bba\u57df\u5e76\u786e\u5b9a\u6a21\u7cca\u63a7\u5236\u5668\u7684\u53c2\u6570\uff08\u5982\u91cf\u5316\u56e0\u5b50\uff0c\u6bd4\u4f8b\u56e0\u5b50\u7b49\uff09 \u7f16\u5236\u6a21\u7cca\u63a7\u5236\u7b97\u6cd5\u7684\u5e94\u7528\u7a0b\u5e8f \n
\u5408\u7406\u9009\u62e9\u6a21\u7cca\u63a7\u5236\u7b97\u6cd5\u7684\u91c7\u6837\u65f6\u95f4<\/p> \n
\u672c\u6a21\u7cca\u63a7\u5236\u5668\u91c7\u7528\u53cc\u8f93\u5165\u5355\u8f93\u51fa\u7684\u5f62\u5f0f\uff0c\u8f93\u5165\u53d8\u91cf\u4e3a\u8bef\u5deee\u548c\u8bef\u5dee\u7684\u53d8\u5316\u7387de,\u8f93\u51fa\u4e3a\u63a7\u5236\u91cfu\uff1be,de,u\u7684\u91cf\u5316\u8bba\u57df\u8303\u56f4\u4e3a[-3,-2,-1,0,1,2,3],\u5212\u5206\u7684\u6a21\u7cca\u5b50\u96c6\u4e3a\uff1a[NB,NM,NS,ZO,PS,PM,PB].\u57fa\u672c\u8bba\u57df\u7684\u8303\u56f4\u9009\u53d6\u9700\u8981\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u6765\u786e\u5b9a\u4e0a\u9650\u503cemax,demax,umax. \u7136\u540e\u7ed9\u51fa\u7c7b\u65b9\u6cd5\u7684\u5b9a\u4e49\uff1a<\/p> \n
\u91cf\u5316\u56e0\u5b50:Ke=3\/emax, Kde=3\/demax,
\u8f93\u51fa\u7f29\u653e\u56e0\u5b50\uff1aKu=umax\/3
\u4e3a\u4e86\u51cf\u5c11\u8ba1\u7b97\u91cf\uff0ce,de,u\u7684\u96b6\u5c5e\u5ea6\u51fd\u6570\u90fd\u9009\u7528\u4e09\u89d2\u5f62\u96b6\u5c5e\u5ea6\u51fd\u6570\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff1a
\u6a21\u7cca\u63a7\u5236\u6700\u91cd\u8981\u7684\u662f\u8981\u786e\u5b9a\u6a21\u7cca\u63a7\u5236\u89c4\u5219\uff0c\u5b83\u53ef\u4ee5\u901a\u8fc7\u4e13\u5bb6\u7ecf\u9a8c\u83b7\u5f97\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u91c7\u6837\u6570\u636e\u83b7\u5f97\uff0c\u8fd9\u91cc\u4f7f\u7528\u7684\u6a21\u7cca\u63a7\u5236\u89c4\u5219\u8868\u5982\u4e0b\uff1b
\u5728\u5fae\u5904\u7406\u5668\u4e2d\u5b9e\u73b0\u6a21\u7cca\u63a7\u5236\u7684\u4e00\u822c\u91c7\u7528\u79bb\u7ebf\u67e5\u8868\u7684\u65b9\u6cd5\u3002\u9996\u5148\u6a21\u7cca\u5316\u8f93\u5165\u5230\u63a7\u5236\u5668\u4e2d\u7684e\u548cde\uff0c\u8ba1\u7b97\u4ed6\u4eec\u7684\u5728\u6bcf\u4e2a\u6a21\u7cca\u5b50\u96c6\u4e2d\u7684\u96b6\u5c5e\u5ea6\u503c\uff0c\u7136\u540e\u627e\u51fa\u6fc0\u6d3b\u7684\u6a21\u7cca\u5b50\u96c6\uff0c\u5b58\u50a8\u8d77\u6765\uff0c\u6700\u540e\u4f7f\u7528\u52a0\u6743\u5e73\u5747\u7684\u65b9\u6cd5\u8ba1\u7b97\u8f93\u51fa\u503c\u3002\u5177\u4f53\u7684\u516c\u5f0f\u5982\u4e0b\uff1a
Zi\u4e3au\u7684\u6a21\u7cca\u96b6\u5c5e\u5ea6\u51fd\u6570\u7684\u5c16\u70b9\u6240\u5bf9\u5e94\u7684\u6a2a\u5750\u6807\u503c\u3002
\u4e0b\u9762\u8bb2\u8bb2\u600e\u4e48\u7528C++<\/a>\u5b9e\u73b0\u6a21\u7cca\u63a7\u5236\u5668\u3002
\u9996\u5148\u9700\u8981\u5efa\u7acb\u4e00\u4e2aFuzzy_controller\u7684\u7c7b\uff1a<\/p> \n \r\nclass Fuzzy_controller\r\n{\r\npublic:\r\n const static int N=7;\/\/\u5b9a\u4e49\u91cf\u5316\u8bba\u57df\u6a21\u7cca\u5b50\u96c6\u7684\u4e2a\u6570\r\nprivate:\r\n float target;\/\/\u7cfb\u7edf<\/a>\u7684\u63a7\u5236\u76ee\u6807\r\n float actual;\/\/\u91c7\u6837\u83b7\u5f97\u7684\u5b9e\u9645\u503c\r\n float e; \/\/\u8bef\u5dee\r\n float e_pre; \/\/\u4e0a\u4e00\u6b21\u7684\u8bef\u5dee\r\n float de; \/\/\u8bef\u5dee\u7684\u53d8\u5316\u7387\r\n float emax; \/\/\u8bef\u5dee\u57fa\u672c\u8bba\u57df\u4e0a\u9650\r\n float demax; \/\/\u8bef\u5dee\u8fa9\u5316\u7387\u57fa\u672c\u8bba\u57df\u7684\u4e0a\u9650\r\n float umax; \/\/\u8f93\u51fa\u7684\u4e0a\u9650\r\n float Ke; \/\/Ke=n\/emax,\u91cf\u5316\u8bba\u57df\u4e3a[-3,-2,-1,0,1,2,3]\r\n float Kde; \/\/Ke=n\/demax,\u91cf\u5316\u8bba\u57df\u4e3a[-3,-2,-1,0,1,2,3]\r\n float Ku; \/\/Ke=umax\/n,\u91cf\u5316\u8bba\u57df\u4e3a[-3,-2,-1,0,1,2,3]\r\n int rule[N][N];\/\/\u6a21\u7cca\u89c4\u5219\u8868\r\n string mf_t_e; \/\/e\u7684\u96b6\u5c5e\u5ea6\u51fd\u6570\u7c7b\u578b\r\n string mf_t_de; \/\/de\u7684\u96b6\u5c5e\u5ea6\u51fd\u6570\u7c7b\u578b\r\n string mf_t_u; \/\/u\u7684\u96b6\u5c5e\u5ea6\u51fd\u6570\u7c7b\u578b\r\n float *e_mf_paras; \/\/\u8bef\u5dee\u7684\u96b6\u5c5e\u5ea6\u51fd\u6570\u7684\u53c2\u6570\r\n float *de_mf_paras;\/\/\u8bef\u5dee\u7684\u504f\u5dee\u96b6\u5c5e\u5ea6\u51fd\u6570\u7684\u53c2\u6570\r\n float *u_mf_paras; \/\/\u8f93\u51fa\u7684\u96b6\u5c5e\u5ea6\u51fd\u6570\u7684\u53c2\u6570\r\n\r\npublic:\r\n Fuzzy_controller(float e_max,float de_max,float u_max);\r\n ~Fuzzy_controller();\r\n float trimf(float x,float a,float b,float c); \/\/\u4e09\u89d2\u96b6\u5c5e\u5ea6\u51fd\u6570\r\n float gaussmf(float x,float ave,float sigma); \/\/\u6b63\u6001\u96b6\u5c5e\u5ea6\u51fd\u6570\r\n float trapmf(float x,float a,float b,float c,float d); \/\/\u68af\u5f62\u96b6\u5c5e\u5ea6\u51fd\u6570\r\n \/\/\u8bbe\u7f6e\u6a21\u7cca\u96b6\u5c5e\u5ea6\u51fd\u6570\u7684\u53c2\u6570\r\n void setMf(const string & mf_type_e,float *e_mf,const string & mf_type_de,float *de_mf,const string & mf_type_u,float *u_mf);\r\n void setRule(int rulelist[N][N]); \/\/\u8bbe\u7f6e\u6a21\u7cca\u89c4\u5219\r\n float realize(float t,float a); \/\/\u5b9e\u73b0\u6a21\u7cca\u63a7\u5236\r\n void showInfo(); \/\/\u663e\u793a\u8be5\u6a21\u7cca\u63a7\u5236\u5668\u7684\u4fe1\u606f\r\n void showMf(const string & type,float *mf_paras); \/\/\u663e\u793a\u96b6\u5c5e\u5ea6\u51fd\u6570\u7684\u4fe1\u606f\r\n};<\/pre> \n
\r\nFuzzy_controller::Fuzzy_controller(float e_max,float de_max,float u_max):\r\ntarget(0),actual(0),emax(e_max),demax(de_max),umax(u_max),e_mf_paras(NULL),de_mf_paras(NULL),u_mf_paras(NULL)\r\n{\r\n e=target-actual;\r\n e_pre=0;\r\n de=e-e_pre;\r\n Ke=(N\/2)\/emax;\r\n Kde=(N\/2)\/demax;\r\n Ku=umax\/(N\/2);\r\n mf_t_e="trimf";\r\n mf_t_de="trimf";\r\n mf_t_u="trimf";\r\n}\r\n\r\nFuzzy_controller::~Fuzzy_controller()\r\n{\r\n delete [] e_mf_paras;\r\n delete [] de_mf_paras;\r\n delete [] u_mf_paras;\r\n}\r\n\/\/\u4e09\u89d2\u96b6\u5c5e\u5ea6\u51fd\u6570\r\nfloat Fuzzy_controller::trimf(float x,float a,float b,float c)\r\n{\r\n float u;\r\n if(x>=a&&x<=b)\r\n u=(x-a)\/(b-a);\r\n else if(x>b&&x<=c)\r\n u=(c-x)\/(c-b);\r\n else\r\n u=0.0;\r\n return u;\r\n\r\n}\r\n\/\/\u6b63\u6001\u96b6\u5c5e\u5ea6\u51fd\u6570\r\nfloat Fuzzy_controller::gaussmf(float x,float ave,float sigma) \r\n{\r\n float u;\r\n if(sigma<0)\r\n {\r\n cout<<"In gaussmf, sigma must larger than 0"<\n