久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
模糊控制程序開源,模糊PID C語言實現及調模糊規則表方法
[打印本頁]
作者:
不拼不活
時間:
2021-4-20 09:49
標題:
模糊控制程序開源,模糊PID C語言實現及調模糊規則表方法
開源一下自己的模糊控制代碼,只需要給出偏差量,偏差范圍,偏差變化率范圍和你想要控制的量的范圍(比如P參數的變化范圍),再有一個合適的模糊規則就可使用,無需關心引擎內部邏輯,安安心心的調表就行。
關于如何調表:拿智能車比賽舉例,使用模糊控制后發現某一段線路跑的不好(即某一條模糊規則不理想),讀取此時的e_cache與ec_cache就能定位到模糊規則表的位置,修改該位置的表就行,注意,修改一處位置(可能為1個量,2個量或者4個量)后會導致周圍的規則變化,即發現其他線路跑法變了,畢竟控制本身就是個魚與熊掌不可兼得的事嘛。
歡迎大家討論使用,才疏學淺,不能保證毫無BUG,如發現BUG一定要反饋給我,我看到后會修正它。
源程序如下:
/*******!!! 該宏定義不可修改 !!!******/
#define NB 1
#define NM 2
#define NS 3
#define ZO 4
#define PS 5
#define PM 6
#define PB 7
/*** 不可修改內容結束 ****/
//N為negative,P為positive,B為big,M為middle,S為small,ZO為zero
int8 DirectionError[2][3]={0};//-128~127,這里儲存偏差量,注意數字范圍
#define E_MAX 120 //偏差E的最大值(預設),程序會自動分割成正負對稱數列
#define EC_MAX 60 //偏差變化EC的最大值(預設),程序會自動分割成正負對稱數列
#define P_MAX 10 //方向環P參數的最大值(預設),若不需要負數列,請修改下面的自動分割邏輯
#define D_MAX 10 //方向環D參數的最大值(預設),若不需要負數列,請修改下面的自動分割邏輯
int8 E_NB,E_NM,E_NS,E_ZO,E_PS,E_PM,E_PB; //E的界限值
float E_NB_D,E_NM_D,E_NS_D,E_ZO_D,E_PS_D,E_PM_D,E_PB_D; //用于保存E的隸屬度
int8 EC_NB,EC_NM,EC_NS,EC_ZO,EC_PS,EC_PM,EC_PB; //EC的界限值
float EC_NB_D,EC_NM_D,EC_NS_D,EC_ZO_D,EC_PS_D,EC_PM_D,EC_PB_D;//用于保存EC的隸屬度
float E_EC_NB_D,E_EC_NM_D,E_EC_NS_D,E_EC_ZO_D,E_EC_PS_D,E_EC_PM_D,E_EC_PB_D;//用于保存E_EC的隸屬度
float P_NB,P_NM,P_NS,P_ZO,P_PS,P_PM,P_PB; //輸出P的界限值
float P_NB_D,P_NM_D,P_NS_D,P_ZO_D,P_PS_D,P_PM_D,P_PB_D; //用于保存P的隸屬度
float D_NB,D_NM,D_NS,D_ZO,D_PS,D_PM,D_PB; //輸出D的界限值
float D_NB_D,D_NM_D,D_NS_D,D_ZO_D,D_PS_D,D_PM_D,D_PB_D; //用于保存D的隸屬度
float P_out,D_out; //用于保存最后的P,D輸出
int16 Direction_PID; //用于保存方向PID的輸出(直接加在速度環的輸入上,此時速度環必需指定基準速度)
float Fuzzy_a,Fuzzy_b,Fuzzy_c,Fuzzy_d;
void Fuzzy_Preprocess(void)//用于自動處理預設數據
{
//自動等分,只需運行一次
Fuzzy_a=E_MAX/4;
Fuzzy_b=EC_MAX/4;
Fuzzy_c=P_MAX/4;
Fuzzy_d=D_MAX/4;
E_NB = -E_MAX+Fuzzy_a,E_NM = -E_MAX+Fuzzy_a*2,E_NS = -E_MAX+Fuzzy_a*3,E_ZO=E_MAX-Fuzzy_a*4,E_PS = E_MAX-Fuzzy_a*3,E_PM = E_MAX-Fuzzy_a*2,E_PB = E_MAX-Fuzzy_a;
EC_NB = -EC_MAX+Fuzzy_b,EC_NM = -EC_MAX+Fuzzy_b*2,EC_NS = -EC_MAX+Fuzzy_b*3,EC_ZO=EC_MAX-Fuzzy_b*4,EC_PS = EC_MAX-Fuzzy_b*3,EC_PM = EC_MAX-Fuzzy_b*2,EC_PB = EC_MAX-Fuzzy_b;
P_NB = -P_MAX+Fuzzy_c,P_NM = -P_MAX+Fuzzy_c*2,P_NS = -P_MAX+Fuzzy_c*3,P_ZO=P_MAX-Fuzzy_c*4,P_PS = P_MAX-Fuzzy_c*3,P_PM = P_MAX-Fuzzy_c*2,P_PB = P_MAX-Fuzzy_c;
D_NB = -D_MAX+Fuzzy_d,D_NM = -D_MAX+Fuzzy_d*2,D_NS = -D_MAX+Fuzzy_d*3,D_ZO=D_MAX-Fuzzy_d*4,D_PS = D_MAX-Fuzzy_d*3,D_PM = D_MAX-Fuzzy_d*2,D_PB = D_MAX-Fuzzy_d;
//用于保存預處理好的范圍數據
int8 E_scope[9]={-E_MAX,E_NB,E_NM,E_NS,E_ZO,E_PS,E_PM,E_PB,E_MAX};//誤差范圍
int8 EC_scope[9]={-EC_MAX,EC_NB,EC_NM,EC_NS,EC_ZO,EC_PS,EC_PM,EC_PB,EC_MAX};//誤差變化范圍
int8 P_scope[9]={-P_MAX,P_NB,P_NM,P_NS,P_ZO,P_PS,P_PM,P_PB,P_MAX};//P范圍
int8 D_scope[9]={-D_MAX,D_NB,D_NM,D_NS,D_ZO,D_PS,D_PM,D_PB,D_MAX};//D范圍
}
//用于保存模糊規則 EC NB NM NS ZO PS PM PB
int8 Fuzzy_Rule[7*4][7]={{PB,PB,PB,PB,PB,PB,PB},//模糊控制表
{PB,PB,PB,PB,PM,PM,PS},//左邊為模糊規則,右邊保存預處理的輸出隸屬度
{PM,PM,PM,PS,PS,ZO,ZO},//該表用于直接控制,即輸出為實際物理量
{PM,PS,PS,ZO,NS,NM,NM},//該表可根據需要修改
{ZO,NS,NS,NM,NM,NM,NB},
{NS,NS,NM,NM,NM,NB,NB},
{NM,NM,NB,NB,NB,NB,NB},
/*E*/
/*NB*/{PB,PB,PM,PM,PS,ZO,ZO},//模糊P規則表
/*NM*/{PB,PB,PM,PS,PS,ZO,NS},//左邊為模糊規則,右邊保存預處理的輸出隸屬度
/*NS*/{PM,PM,PM,PS,ZO,NS,NS},//該表用于控制PID的參數P,即輸出為P值或P值的變化量
/*ZO*/{PM,PM,PS,ZO,NS,NM,NM},//該表必須修改,不可直接使用
/*PS*/{PS,PS,ZO,NS,NS,NM,NM},
/*PM*/{PS,ZO,PS,NM,NM,NM,NB},
/*PB*/{ZO,ZO,NM,NM,NM,NB,NB},
{NB,NB,NM,NM,NS,ZO,ZO},//模糊I規則表
{NB,NB,NM,NS,NS,ZO,ZO},//左邊為模糊規則,右邊保存預處理的輸出隸屬度
{NB,NM,NS,NS,ZO,PS,PS},//該表用于控制PID的參數I,即輸出為I值或I值的變化量
{NM,NM,NS,ZO,PS,PM,PM},//該表必須修改,不可直接使用
{NM,NS,ZO,PS,PS,PM,PB},
{ZO,ZO,PS,PS,PM,PB,PB},
{ZO,ZO,PS,PM,PM,PB,PB},
{NB,NB,NB,NB,NB,NM,PS},//模糊D規則表
{PS,NS,NB,NM,NM,NS,ZO},//左邊為模糊規則,右邊保存預處理的輸出隸屬度
{ZO,NS,NM,NM,NS,NS,ZO},//該表用于控制PID的參數D,即輸出為D值或D值的變化量
{ZO,NS,NS,NS,NS,NS,ZO},//該表必須修改,不可直接使用
{ZO,ZO,ZO,ZO,ZO,ZO,ZO},
{PB,ZO,PS,PS,PS,PS,PB},
{PB,PM,PM,PM,PS,PS,PB},
};
//用于指引模糊判斷,臨時變量
int8 e_cache=0;
int8 ec_cache=0;
void Fuzzy_Menbership(int E)//計算輸入隸屬度
{
//記錄偏差
int EC;
EC=E-DirectionError[0][2];
for(uint8 i=0;i<2;i++)
{
DirectionError[0][i]=DirectionError[0][i+1];//數據左移,低位扔掉
}
DirectionError[0][2]=E;
//計算模糊輸入隸屬度
if(E <= E_NB) E_NB_D=1,e_cache=0;
if(E > E_NB && E < E_NM) E_NB_D=(E_NM-E)/Fuzzy_a,E_NM_D=(E-E_NB)/Fuzzy_a,e_cache=1;
if(E > E_NM && E < E_NS) E_NM_D=(E_NS-E)/Fuzzy_a,E_NS_D=(E-E_NM)/Fuzzy_a,e_cache=2;
if(E > E_NS && E < E_ZO) E_NS_D=(E_ZO-E)/Fuzzy_a,E_ZO_D=(E-E_NS)/Fuzzy_a,e_cache=3;
if(E > E_ZO && E < E_PS) E_ZO_D=(E_PS-E)/Fuzzy_a,E_PS_D=(E-E_ZO)/Fuzzy_a,e_cache=4;
if(E > E_PS && E < E_PM) E_PS_D=(E_PM-E)/Fuzzy_a,E_PM_D=(E-E_PS)/Fuzzy_a,e_cache=5;
if(E > E_PM && E < E_PB) E_PM_D=(E_PB-E)/Fuzzy_a,E_PB_D=(E-E_PM)/Fuzzy_a,e_cache=6;
if(E >= E_PB) E_PB_D=1,e_cache=7;
if(EC <= EC_NB) EC_NB_D=1,ec_cache=0;
if(EC > EC_NB && EC < EC_NM) EC_NB_D=(EC_NM-EC)/Fuzzy_b,EC_NM_D=(EC-EC_NB)/Fuzzy_b,ec_cache=1;
if(EC > EC_NM && EC < EC_NS) EC_NM_D=(EC_NS-EC)/Fuzzy_b,EC_NS_D=(EC-EC_NM)/Fuzzy_b,ec_cache=2;
if(EC > EC_NS && EC < EC_ZO) EC_NS_D=(EC_ZO-EC)/Fuzzy_b,EC_ZO_D=(EC-EC_NS)/Fuzzy_b,ec_cache=3;
if(EC > EC_ZO && EC < EC_PS) EC_ZO_D=(EC_PS-EC)/Fuzzy_b,EC_PS_D=(EC-EC_ZO)/Fuzzy_b,ec_cache=4;
if(EC > EC_PS && EC < EC_PM) EC_PS_D=(EC_PM-EC)/Fuzzy_b,EC_PM_D=(EC-EC_PS)/Fuzzy_b,ec_cache=5;
if(EC > EC_PM && EC < EC_PB) EC_PM_D=(EC_PB-EC)/Fuzzy_b,EC_PB_D=(EC-EC_PM)/Fuzzy_b,ec_cache=6;
if(EC >= EC_PB) EC_PB_D=1,ec_cache=7;
}
//用于保存經過預處理的輸出隸屬度
float Fuzzy_MP[7*4][8]={0};
//讀取規則并寫入融合隸屬度
void Fuzzy_RD(int a,int b)//a:數據存儲模式 b:規則切換
{
switch (a)
{
case 1:switch(Fuzzy_Rule[e_cache][ec_cache])
{
case 1:E_EC_NB_D=E_EC_NB_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
case 2:E_EC_NM_D=E_EC_NM_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
case 3:E_EC_NS_D=E_EC_NS_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
case 4:E_EC_ZO_D=E_EC_ZO_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
case 5:E_EC_PS_D=E_EC_PS_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
case 6:E_EC_PM_D=E_EC_PM_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
case 7:E_EC_PB_D=E_EC_PB_D+Fuzzy_MP[e_cache+7*b][ec_cache];break;
};break;
case 2:switch(Fuzzy_Rule[e_cache][ec_cache])
{
case 1:E_EC_NB_D=E_EC_NB_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
case 2:E_EC_NM_D=E_EC_NM_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
case 3:E_EC_NS_D=E_EC_NS_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
case 4:E_EC_ZO_D=E_EC_ZO_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
case 5:E_EC_PS_D=E_EC_PS_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
case 6:E_EC_PM_D=E_EC_PM_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
case 7:E_EC_PB_D=E_EC_PB_D+Fuzzy_MP[e_cache-1+7*b][ec_cache];break;
};break;
case 3:switch(Fuzzy_Rule[e_cache][ec_cache])
{
case 1:E_EC_NB_D=E_EC_NB_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
case 2:E_EC_NM_D=E_EC_NM_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
case 3:E_EC_NS_D=E_EC_NS_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
case 4:E_EC_ZO_D=E_EC_ZO_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
case 5:E_EC_PS_D=E_EC_PS_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
case 6:E_EC_PM_D=E_EC_PM_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
case 7:E_EC_PB_D=E_EC_PB_D+Fuzzy_MP[e_cache+7*b][ec_cache-1];break;
};break;
case 4:switch(Fuzzy_Rule[e_cache][ec_cache])
{
case 1:E_EC_NB_D=E_EC_NB_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
case 2:E_EC_NM_D=E_EC_NM_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
case 3:E_EC_NS_D=E_EC_NS_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
case 4:E_EC_ZO_D=E_EC_ZO_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
case 5:E_EC_PS_D=E_EC_PS_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
case 6:E_EC_PM_D=E_EC_PM_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
case 7:E_EC_PB_D=E_EC_PB_D+Fuzzy_MP[e_cache-1+7*b][ec_cache-1];break;
};break;
}
}
//模糊引擎
float Fuzzy_Engine(int8 a)//0:模糊控制 1:模糊P 2:模糊I 3:模糊D
{
E_EC_NB_D=E_EC_NM_D=E_EC_NS_D=E_EC_ZO_D=E_EC_PS_D=E_EC_PM_D=E_EC_PB_D=0;//模糊輸出隸屬度預處理(清零)
switch(e_cache)
{
case 0:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NB_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NB_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NB_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NB_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NB_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NB_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache+7*a][ec_cache]= E_NB_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 1:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_NB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NB_D*EC_NB_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NM_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_NM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NB_D*EC_NM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NM_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_NS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NB_D*EC_NS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NM_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_ZO_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NB_D*EC_ZO_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NM_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_PS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NB_D*EC_PS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NM_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_PM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NB_D*EC_PM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NM_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NB_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NM_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 2:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_NB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NM_D*EC_NB_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NS_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_NM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NM_D*EC_NM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NS_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_NS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NM_D*EC_NS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NS_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_ZO_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NM_D*EC_ZO_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NS_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_PS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NM_D*EC_PS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NS_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_PM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NM_D*EC_PM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_NS_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NM_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_NS_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 3:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_NB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NS_D*EC_NB_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_ZO_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_NM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NS_D*EC_NM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_ZO_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_NS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NS_D*EC_NS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_ZO_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_ZO_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NS_D*EC_ZO_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_ZO_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_PS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NS_D*EC_PS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_ZO_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_PM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_NS_D*EC_PM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_ZO_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_NS_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_ZO_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 4:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_NB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_ZO_D*EC_NB_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PS_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_NM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_ZO_D*EC_NM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PS_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_NS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_ZO_D*EC_NS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PS_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_ZO_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_ZO_D*EC_ZO_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PS_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_PS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_ZO_D*EC_PS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PS_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_PM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_ZO_D*EC_PM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PS_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_ZO_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PS_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 5:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_NB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PS_D*EC_NB_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PM_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_NM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PS_D*EC_NM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PM_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_NS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PS_D*EC_NS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PM_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_ZO_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PS_D*EC_ZO_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PM_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_PS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PS_D*EC_PS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PM_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_PM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PS_D*EC_PM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PM_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PS_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PM_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 6:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_NB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PM_D*EC_NB_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_NM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PM_D*EC_NM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_NS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PM_D*EC_NS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_ZO_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PM_D*EC_ZO_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_PS_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PM_D*EC_PS_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_PM_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache-1+7*a][ec_cache-1]= E_PM_D*EC_PM_D,Fuzzy_RD(4,a);Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache-1+7*a][ec_cache]= E_PM_D*EC_PB_D,Fuzzy_RD(2,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
case 7:
{
switch (ec_cache)
{
case 0:Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_NB_D,Fuzzy_RD(1,a);break;
case 1:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_NB_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_NM_D,Fuzzy_RD(1,a);break;
case 2:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_NM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_NS_D,Fuzzy_RD(1,a);break;
case 3:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_NS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_ZO_D,Fuzzy_RD(1,a);break;
case 4:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_ZO_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PS_D,Fuzzy_RD(1,a);break;
case 5:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_PS_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PM_D,Fuzzy_RD(1,a);break;
case 6:Fuzzy_MP[e_cache+7*a][ec_cache-1]= E_PB_D*EC_PM_D,Fuzzy_RD(3,a);Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PB_D,Fuzzy_RD(1,a);break;
case 7:Fuzzy_MP[e_cache+7*a][ec_cache]= E_PB_D*EC_PB_D,Fuzzy_RD(1,a);break;
}
}break;
}
}
int Fuzzy_PID(int E)//模糊調用函數示范
{
Fuzzy_Preprocess();//用于自動處理預設數據,只需運行一次
Fuzzy_Menbership(E);//計算輸入隸屬度
Fuzzy_Engine(1);//計算模糊P
//重心法解模糊
//計算本次需調節的量,其中PD可直接用,也可加在預設的基準值上,這取決于PD的變化范圍
P_out = E_EC_NB_D*P_NB + E_EC_NM_D*P_NM + E_EC_NS_D*P_NS + E_EC_ZO_D*P_ZO
+ E_EC_PS_D*P_PS + E_EC_PM_D*P_PM + E_EC_PB_D*P_PB;
Fuzzy_Engine(3);//計算模糊D
D_out = E_EC_NB_D*D_NB + E_EC_NM_D*D_NM + E_EC_NS_D*D_NS + E_EC_ZO_D*D_ZO
+ E_EC_PS_D*D_PS + E_EC_PM_D*D_PM + E_EC_PB_D*D_PB;
Direction_PID = P_out * (DirectionError[0][2] - DirectionError[0][1])
+ D_out * (DirectionError[0][2] - 2*DirectionError[0][1] + DirectionError[0][0]);
return Direction_PID;
}
復制代碼
51hei.png
(2.09 KB, 下載次數: 45)
下載附件
2021-4-20 16:16 上傳
以上程序原件下載(附件和本文中的一模一樣):
fuzzy.zip
(3.61 KB, 下載次數: 90)
2021-4-20 09:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
.h文件自己寫吧
作者:
db207766762
時間:
2021-6-1 13:40
樓主,你的儲存偏差的數組只用了3個,但你設置了2維的6個啊,,,
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
天堂一区二区三区
|
久久亚洲国产精品日日av夜夜
|
精品欧美一区二区在线观看
|
天天插天天射天天干
|
一级欧美一级日韩片
|
91一区二区三区
|
一区二区三区欧美大片
|
91视频一88av
|
在线观看国产www
|
日韩精品在线播放
|
久久在视频
|
国产精久久久久久久
|
天天欧美
|
www.久久精品视频
|
欧美精品欧美精品系列
|
一区二区三区视频在线
|
国产精品一区二区不卡
|
四虎影视一区二区
|
国产精品a久久久久
|
国产精品久久久久久久一区探花
|
欧美在线视频一区二区
|
久草中文在线
|
午夜精品在线
|
国产精品第2页
|
国产高清在线精品一区二区三区
|
www.久久精品
|
久热久
|
国产视频一二三区
|
99热国产免费
|
激情黄色在线观看
|
国产欧美日韩一区
|
精品国产不卡一区二区三区
|
久久免费精品视频
|
国产精品久久久久久久久久久久久
|
国产美女精品
|
国产日韩免费视频
|
亚洲一区二区视频
|
成人国产精品久久
|
国产成人午夜电影网
|
伊人网综合在线观看
|
国产精品久久久久久久7777
|