[应用方案] 模糊PID控制算法

[复制链接]
 楼主| mnynt121 发表于 2023-10-25 19:25 | 显示全部楼层 |阅读模式
  1. class FuzzyPID
  2. {
  3.    
  4. public:
  5.         const static int N=7;
  6. private:
  7.         float target;  //系统的控制目标
  8.         float actual;  //采样获得的实际值
  9.         float e;       //误差
  10.         float e_pre_1; //上一次的误差
  11.         float e_pre_2; //上上次的误差
  12.         float de;      //误差的变化率
  13.         float emax;    //误差基本论域上限
  14.         float demax;   //误差辩化率基本论域的上限
  15.         float delta_Kp_max;   //delta_kp输出的上限
  16.         float delta_Ki_max;   //delta_ki输出上限
  17.         float delta_Kd_max;   //delta_kd输出上限
  18.         float Ke;      //Ke=n/emax,量化论域为[-3,-2,-1,0,1,2,3]
  19.         float Kde;     //Kde=n/demax,量化论域为[-3,-2,-1,0,1,2,3]
  20.         float Ku_p;    //Ku_p=Kpmax/n,量化论域为[-3,-2,-1,0,1,2,3]
  21.         float Ku_i;    //Ku_i=Kimax/n,量化论域为[-3,-2,-1,0,1,2,3]
  22.         float Ku_d;    //Ku_d=Kdmax/n,量化论域为[-3,-2,-1,0,1,2,3]
  23.         int Kp_rule_matrix[N][N];//Kp模糊规则矩阵
  24.         int Ki_rule_matrix[N][N];//Ki模糊规则矩阵
  25.         int Kd_rule_matrix[N][N];//Kd模糊规则矩阵
  26.         string mf_t_e;       //e的隶属度函数类型
  27.         string mf_t_de;      //de的隶属度函数类型
  28.         string mf_t_Kp;      //kp的隶属度函数类型
  29.         string mf_t_Ki;      //ki的隶属度函数类型
  30.         string mf_t_Kd;      //kd的隶属度函数类型
  31.         float *e_mf_paras; //误差的隶属度函数的参数
  32.         float *de_mf_paras;//误差的偏差隶属度函数的参数
  33.         float *Kp_mf_paras; //kp的隶属度函数的参数
  34.         float *Ki_mf_paras; //ki的隶属度函数的参数
  35.         float *Kd_mf_paras; //kd的隶属度函数的参数
  36.         float Kp;
  37.         float Ki;
  38.         float Kd;
  39.         float A;
  40.         float B;
  41.         float C;
  42. void showMf(const string & type,float *mf_paras);      //显示隶属度函数的信息
  43. void setMf_sub(const string & type,float *paras,int n);//设置模糊隶属度函数的子函数
  44. public:
  45. FuzzyPID(float e_max,float de_max,float kp_max,float ki_max,float kd_max,float Kp0,float Ki0,float Kd0);
  46. FuzzyPID(float *fuzzyLimit,float *pidInitVal);
  47. ~FuzzyPID();
  48. float trimf(float x,float a,float b,float c);          //三角隶属度函数
  49. float gaussmf(float x,float ave,float sigma);          //正态隶属度函数
  50. float trapmf(float x,float a,float b,float c,float d); //梯形隶属度函数
  51. void setMf(const string & mf_type_e,float *e_mf,
  52.                            const string & mf_type_de,float *de_mf,
  53.                            const string & mf_type_Kp,float *Kp_mf,
  54.                        const string & mf_type_Ki,float *Ki_mf,
  55.                            const string & mf_type_Kd,float *Kd_mf);        //设置模糊隶属度函数的参数
  56. void setRuleMatrix(int kp_m[N][N],int ki_m[N][N],int kd_m[N][N]);  //设置模糊规则
  57. float realize(float t,float a);  //实现模糊控制
  58. void showInfo();   //显示该模糊控制器的信息
  59. };
  60. 复制
  61. 然后是fuzzy_pid类的实现方法:

  62. #include"fuzzy_PID.h"


  63. FuzzyPID::FuzzyPID(float e_max,float de_max,float kp_max,float ki_max,float kd_max,float Kp0,float Ki0,float Kd0):
  64. target(0),actual(0),emax(e_max),demax(de_max),delta_Kp_max(kp_max),delta_Ki_max(ki_max),delta_Kd_max(kd_max),e_mf_paras(NULL),de_mf_paras(NULL),
  65. Kp_mf_paras(NULL),Ki_mf_paras(NULL),Kd_mf_paras(NULL)
  66. {
  67.    
  68.    e=target-actual;
  69.    e_pre_1=0;
  70.    e_pre_2=0;
  71.    de=e-e_pre_1;
  72.    Ke=(N/2)/emax;
  73.    Kde=(N/2)/demax;
  74.    Ku_p=delta_Kp_max/(N/2);
  75.    Ku_i=delta_Ki_max/(N/2);
  76.    Ku_d=delta_Kd_max/(N/2);
  77.    mf_t_e="No type";
  78.    mf_t_de="No type";
  79.    mf_t_Kp="No type";
  80.    mf_t_Ki="No type";
  81.    mf_t_Kd="No type";
  82.    Kp=Kp0;
  83.    Ki=Ki0;
  84.    Kd=Kd0;
  85.    A=Kp+Ki+Kd;
  86.    B=-2*Kd-Kp;
  87.    C=Kd;
  88. }

  89. FuzzyPID::FuzzyPID(float *fuzzyLimit,float *pidInitVal)
  90. {
  91.    
  92.         target=0;
  93.         actual=0;
  94.         e=0;
  95.         e_pre_1=0;
  96.     e_pre_2=0;
  97.     de=e-e_pre_1;
  98.         emax=fuzzyLimit[0];
  99.         demax=fuzzyLimit[1];
  100.         delta_Kp_max=fuzzyLimit[2];
  101.         delta_Ki_max=fuzzyLimit[3];
  102.         delta_Kd_max=fuzzyLimit[4];
  103.         Ke=(N/2)/emax;
  104.     Kde=(N/2)/demax;
  105.     Ku_p=delta_Kp_max/(N/2);
  106.     Ku_i=delta_Ki_max/(N/2);
  107.     Ku_d=delta_Kd_max/(N/2);
  108.     mf_t_e="No type";
  109.     mf_t_de="No type";
  110.     mf_t_Kp="No type";
  111.     mf_t_Ki="No type";
  112.     mf_t_Kd="No type";
  113.         e_mf_paras=NULL;
  114.         de_mf_paras=NULL;
  115.         Kp_mf_paras=NULL;
  116.         Ki_mf_paras=NULL;
  117.         Kd_mf_paras=NULL;

  118.     Kp=pidInitVal[0];
  119.     Ki=pidInitVal[1];
  120.     Kd=pidInitVal[2];
  121.     A=Kp+Ki+Kd;
  122.     B=-2*Kd-Kp;
  123.     C=Kd;
  124. }

  125. FuzzyPID::~FuzzyPID()
  126. {
  127.    
  128.   delete [] e_mf_paras;
  129.   delete [] de_mf_paras;
  130.   delete [] Kp_mf_paras;
  131.   delete [] Ki_mf_paras;
  132.   delete [] Kd_mf_paras;
  133. }
  134. //三角隶属度函数
  135. float FuzzyPID::trimf(float x,float a,float b,float c)
  136. {
  137.    
  138.    float u;
  139.    if(x>=a&&x<=b)
  140.            u=(x-a)/(b-a);
  141.    else if(x>b&&x<=c)
  142.            u=(c-x)/(c-b);
  143.    else
  144.            u=0.0;
  145.    return u;

  146. }
  147. //正态隶属度函数
  148. float FuzzyPID::gaussmf(float x,float ave,float sigma)
  149. {
  150.    
  151.         float u;
  152.         if(sigma<0)
  153.         {
  154.    
  155.            cout<<"In gaussmf, sigma must larger than 0"<<endl;
  156.         }
  157.         u=exp(-pow(((x-ave)/sigma),2));
  158.         return u;
  159. }
  160. //梯形隶属度函数
  161. float FuzzyPID::trapmf(float x,float a,float b,float c,float d)
  162. {
  163.    
  164.     float u;
  165.         if(x>=a&&x<b)
  166.                 u=(x-a)/(b-a);
  167.         else if(x>=b&&x<c)
  168.         u=1;
  169.         else if(x>=c&&x<=d)
  170.                 u=(d-x)/(d-c);
  171.         else
  172.                 u=0;
  173.         return u;
  174. }
  175. //设置模糊规则Matrix
  176. void FuzzyPID::setRuleMatrix(int kp_m[N][N],int ki_m[N][N],int kd_m[N][N])
  177. {
  178.    
  179.         for(int i=0;i<N;i++)
  180.            for(int j=0;j<N;j++)
  181.            {
  182.    
  183.                    Kp_rule_matrix[i][j]=kp_m[i][j];
  184.                    Ki_rule_matrix[i][j]=ki_m[i][j];
  185.                    Kd_rule_matrix[i][j]=kd_m[i][j];
  186.            }
  187. }
  188. //设置模糊隶属度函数的子函数
  189. void FuzzyPID::setMf_sub(const string & type,float *paras,int n)
  190. {
  191.    
  192.         int N_mf_e,N_mf_de,N_mf_Kp,N_mf_Ki,N_mf_Kd;
  193.   switch(n)
  194.   {
  195.    
  196.   case 0:
  197.           if(type=="trimf"||type=="gaussmf"||type=="trapmf")
  198.             mf_t_e=type;
  199.           else
  200.                 cout<<"Type of membership function must be "trimf" or "gaussmf" or "trapmf""<<endl;
  201.       if(mf_t_e=="trimf")
  202.         N_mf_e=3;
  203.           else if(mf_t_e=="gaussmf")
  204.                 N_mf_e=2;
  205.           else if(mf_t_e=="trapmf")
  206.                 N_mf_e=4;
  207.       
  208.           e_mf_paras=new float [N*N_mf_e];
  209.           for(int i=0;i<N*N_mf_e;i++)
  210.                 e_mf_paras[i]=paras[i];
  211.           break;

  212.   case 1:
  213.           if(type=="trimf"||type=="gaussmf"||type=="trapmf")
  214.             mf_t_de=type;
  215.           else
  216.                 cout<<"Type of membership function must be "trimf" or "gaussmf" or "trapmf""<<endl;
  217.       if(mf_t_de=="trimf")
  218.         N_mf_de=3;
  219.           else if(mf_t_de=="gaussmf")
  220.                 N_mf_de=2;
  221.           else if(mf_t_de=="trapmf")
  222.                 N_mf_de=4;
  223.         de_mf_paras=new float [N*N_mf_de];
  224.           for(int i=0;i<N*N_mf_de;i++)
  225.                 de_mf_paras[i]=paras[i];
  226.           break;

  227.    case 2:
  228.           if(type=="trimf"||type=="gaussmf"||type=="trapmf")
  229.             mf_t_Kp=type;
  230.           else
  231.                 cout<<"Type of membership function must be "trimf" or "gaussmf" or "trapmf""<<endl;
  232.       if(mf_t_Kp=="trimf")
  233.         N_mf_Kp=3;
  234.           else if(mf_t_Kp=="gaussmf")
  235.                 N_mf_Kp=2;
  236.           else if(mf_t_Kp=="trapmf")
  237.                 N_mf_Kp=4;
  238.         Kp_mf_paras=new float [N*N_mf_Kp];
  239.           for(int i=0;i<N*N_mf_Kp;i++)
  240.                 Kp_mf_paras[i]=paras[i];
  241.           break;

  242.    case 3:
  243.           if(type=="trimf"||type=="gaussmf"||type=="trapmf")
  244.             mf_t_Ki=type;
  245.           else
  246.                 cout<<"Type of membership function must be "trimf" or "gaussmf" or "trapmf""<<endl;
  247.       if(mf_t_Ki=="trimf")
  248.         N_mf_Ki=3;
  249.           else if(mf_t_Ki=="gaussmf")
  250.                 N_mf_Ki=2;
  251.           else if(mf_t_Ki=="trapmf")
  252.                 N_mf_Ki=4;
  253.         Ki_mf_paras=new float [N*N_mf_Ki];
  254.           for(int i=0;i<N*N_mf_Ki;i++)
  255.                 Ki_mf_paras[i]=paras[i];
  256.           break;

  257.    case 4:
  258.           if(type=="trimf"||type=="gaussmf"||type=="trapmf")
  259.             mf_t_Kd=type;
  260.           else
  261.                 cout<<"Type of membership function must be "trimf" or "gaussmf" or "trapmf""<<endl;
  262.       if(mf_t_Kd=="trimf")
  263.         N_mf_Kd=3;
  264.           else if(mf_t_Kd=="gaussmf")
  265.                 N_mf_Kd=2;
  266.           else if(mf_t_Kd=="trapmf")
  267.                 N_mf_Kd=4;
  268.         Kd_mf_paras=new float [N*N_mf_Kd];
  269.           for(int i=0;i<N*N_mf_Kd;i++)
  270.                 Kd_mf_paras[i]=paras[i];
  271.           break;

  272.    default: break;
  273.   }
  274. }
  275. //设置模糊隶属度函数的类型和参数
  276. void FuzzyPID::setMf(const string & mf_type_e,float *e_mf,
  277.                         const string & mf_type_de,float *de_mf,
  278.                         const string & mf_type_Kp,float *Kp_mf,
  279.                     const string & mf_type_Ki,float *Ki_mf,
  280.                         const string & mf_type_Kd,float *Kd_mf)
  281. {
  282.    
  283.         setMf_sub(mf_type_e,e_mf,0);
  284.         setMf_sub(mf_type_de,de_mf,1);
  285.         setMf_sub(mf_type_Kp,Kp_mf,2);
  286.         setMf_sub(mf_type_Ki,Ki_mf,3);
  287.         setMf_sub(mf_type_Kd,Kd_mf,4);
  288. }
  289. //实现模糊控制
  290. float FuzzyPID::realize(float t,float a)   
  291. {
  292.    
  293.         float u_e[N],u_de[N],u_u[N];
  294.         int u_e_index[3],u_de_index[3];//假设一个输入最多激活3个模糊子集
  295.         float delta_Kp,delta_Ki,delta_Kd;
  296.         float delta_u;
  297.         target=t;
  298.         actual=a;
  299.     e=target-actual;
  300.         de=e-e_pre_1;
  301.         e=Ke*e;
  302.         de=Kde*de;
  303.   /* 将误差e模糊化*/
  304.         int j=0;
  305.         for(int i=0;i<N;i++)
  306.         {
  307.    
  308.                 if(mf_t_e=="trimf")
  309.                   u_e[i]=trimf(e,e_mf_paras[i*3],e_mf_paras[i*3+1],e_mf_paras[i*3+2]);//e模糊化,计算它的隶属度
  310.                 else if(mf_t_e=="gaussmf")
  311.                   u_e[i]=gaussmf(e,e_mf_paras[i*2],e_mf_paras[i*2+1]);//e模糊化,计算它的隶属度
  312.                 else if(mf_t_e=="trapmf")
  313.                   u_e[i]=trapmf(e,e_mf_paras[i*4],e_mf_paras[i*4+1],e_mf_paras[i*4+2],e_mf_paras[i*4+3]);//e模糊化,计算它的隶属度

  314.                 if(u_e[i]!=0)
  315.             u_e_index[j++]=i;                //存储被激活的模糊子集的下标,可以减小计算量
  316.           }
  317.         for(;j<3;j++)u_e_index[j]=0;             //富余的空间填0

  318.         /*将误差变化率de模糊化*/
  319.         j=0;
  320.         for(int i=0;i<N;i++)
  321.         {
  322.    
  323.                 if(mf_t_de=="trimf")
  324.                    u_de[i]=trimf(de,de_mf_paras[i*3],de_mf_paras[i*3+1],de_mf_paras[i*3+2]);//de模糊化,计算它的隶属度
  325.                 else if(mf_t_de=="gaussmf")
  326.                    u_de[i]=gaussmf(de,de_mf_paras[i*2],de_mf_paras[i*2+1]);//de模糊化,计算它的隶属度
  327.                 else if(mf_t_de=="trapmf")
  328.                    u_de[i]=trapmf(de,de_mf_paras[i*4],de_mf_paras[i*4+1],de_mf_paras[i*4+2],de_mf_paras[i*4+3]);//de模糊化,计算它的隶属度

  329.                 if(u_de[i]!=0)
  330.                         u_de_index[j++]=i;            //存储被激活的模糊子集的下标,可以减小计算量
  331.         }
  332.         for(;j<3;j++)u_de_index[j]=0;          //富余的空间填0

  333.         float den=0,num=0;
  334.         /*计算delta_Kp和Kp*/
  335.         for(int m=0;m<3;m++)
  336.                 for(int n=0;n<3;n++)
  337.                 {
  338.    
  339.                    num+=u_e[u_e_index[m]]*u_de[u_de_index[n]]*Kp_rule_matrix[u_e_index[m]][u_de_index[n]];
  340.                    den+=u_e[u_e_index[m]]*u_de[u_de_index[n]];
  341.                 }
  342.         delta_Kp=num/den;
  343.         delta_Kp=Ku_p*delta_Kp;
  344.         if(delta_Kp>=delta_Kp_max)   delta_Kp=delta_Kp_max;
  345.         else if(delta_Kp<=-delta_Kp_max) delta_Kp=-delta_Kp_max;
  346.         Kp+=delta_Kp;
  347.         if(Kp<0)Kp=0;
  348.         /*计算delta_Ki和Ki*/
  349.         den=0;num=0;
  350.         for(int m=0;m<3;m++)
  351.                 for(int n=0;n<3;n++)
  352.                 {
  353.    
  354.                    num+=u_e[u_e_index[m]]*u_de[u_de_index[n]]*Ki_rule_matrix[u_e_index[m]][u_de_index[n]];
  355.                    den+=u_e[u_e_index[m]]*u_de[u_de_index[n]];
  356.                 }

  357.         delta_Ki=num/den;
  358.         delta_Ki=Ku_i*delta_Ki;
  359.         if(delta_Ki>=delta_Ki_max)   delta_Ki=delta_Ki_max;
  360.         else if(delta_Ki<=-delta_Ki_max)  delta_Ki=-delta_Ki_max;
  361.         Ki+=delta_Ki;
  362.         if(Ki<0)Ki=0;
  363.         /*计算delta_Kd和Kd*/
  364.         den=0;num=0;
  365.         for(int m=0;m<3;m++)
  366.                 for(int n=0;n<3;n++)
  367.                 {
  368.    
  369.                    num+=u_e[u_e_index[m]]*u_de[u_de_index[n]]*Kd_rule_matrix[u_e_index[m]][u_de_index[n]];
  370.                    den+=u_e[u_e_index[m]]*u_de[u_de_index[n]];
  371.                 }
  372.         delta_Kd=num/den;
  373.         delta_Kd=Ku_d*delta_Kd;
  374.         if(delta_Kd>=delta_Kd_max)   delta_Kd=delta_Kd_max;
  375.         else if(delta_Kd<=-delta_Kd_max) delta_Kd=-delta_Kd_max;
  376.         Kd+=delta_Kd;
  377.         if(Kd<0)Kd=0;

  378.         A=Kp+Ki+Kd;
  379.     B=-2*Kd-Kp;
  380.     C=Kd;
  381.         delta_u=A*e+B*e_pre_1+C*e_pre_2;

  382.         delta_u=delta_u/Ke;
  383.   
  384.         if(delta_u>=0.95*target)delta_u=0.95*target;
  385.         else if(delta_u<=-0.95*target)delta_u=-0.95*target;

  386.         e_pre_2=e_pre_1;
  387.     e_pre_1=e;

  388.         return delta_u;
  389. }
  390. void FuzzyPID::showMf(const string & type,float *mf_paras)
  391. {
  392.    
  393.     int tab;
  394.         if(type=="trimf")
  395.                 tab=2;
  396.         else if(type=="gaussmf")
  397.                 tab==1;
  398.         else if(type=="trapmf")
  399.                 tab=3;
  400.         cout<<"函数类型:"<<mf_t_e<<endl;
  401.         cout<<"函数参数列表:"<<endl;
  402.         float *p=mf_paras;
  403.         for(int i=0;i<N*(tab+1);i++)
  404.           {
  405.    
  406.                   cout.width(3);
  407.               cout<<p[i]<<" ";
  408.                   if(i%(tab+1)==tab)
  409.                           cout<<endl;
  410.           }
  411. }
  412. void FuzzyPID::showInfo()
  413. {
  414.    
  415.    cout<<"Info of this fuzzy controller is as following:"<<endl;
  416.    cout<<"基本论域e:["<<-emax<<","<<emax<<"]"<<endl;
  417.    cout<<"基本论域de:["<<-demax<<","<<demax<<"]"<<endl;
  418.    cout<<"基本论域delta_Kp:["<<-delta_Kp_max<<","<<delta_Kp_max<<"]"<<endl;
  419.    cout<<"基本论域delta_Ki:["<<-delta_Ki_max<<","<<delta_Ki_max<<"]"<<endl;
  420.    cout<<"基本论域delta_Kd:["<<-delta_Kd_max<<","<<delta_Kd_max<<"]"<<endl;
  421.    cout<<"误差e的模糊隶属度函数参数:"<<endl;
  422.    showMf(mf_t_e,e_mf_paras);
  423.    cout<<"误差变化率de的模糊隶属度函数参数:"<<endl;
  424.    showMf(mf_t_de,de_mf_paras);
  425.    cout<<"delta_Kp的模糊隶属度函数参数:"<<endl;
  426.    showMf(mf_t_Kp,Kp_mf_paras);
  427.    cout<<"delta_Ki的模糊隶属度函数参数:"<<endl;
  428.    showMf(mf_t_Ki,Ki_mf_paras);
  429.    cout<<"delta_Kd的模糊隶属度函数参数:"<<endl;
  430.    showMf(mf_t_Kd,Kd_mf_paras);
  431.    cout<<"模糊规则表:"<<endl;
  432.    cout<<"delta_Kp的模糊规则矩阵"<<endl;
  433.    for(int i=0;i<N;i++)
  434.    {
  435.    
  436.          for(int j=0;j<N;j++)
  437.            {
  438.    
  439.                  cout.width(3);
  440.                  cout<<Kp_rule_matrix[i][j]<<" ";
  441.             }
  442.            cout<<endl;
  443.    }
  444.    cout<<"delta_Ki的模糊规则矩阵"<<endl;
  445.    for(int i=0;i<N;i++)
  446.    {
  447.    
  448.          for(int j=0;j<N;j++)
  449.            {
  450.    
  451.                  cout.width(3);
  452.                  cout<<Ki_rule_matrix[i][j]<<" ";
  453.             }
  454.            cout<<endl;
  455.    }
  456.    cout<<"delta_Kd的模糊规则矩阵"<<endl;
  457.    for(int i=0;i<N;i++)
  458.    {
  459.    
  460.          for(int j=0;j<N;j++)
  461.            {
  462.    
  463.                  cout.width(3);
  464.                  cout<<Kd_rule_matrix[i][j]<<" ";
  465.             }
  466.            cout<<endl;
  467.    }
  468.    cout<<endl;
  469.    cout<<"误差的量化比例因子Ke="<<Ke<<endl;
  470.    cout<<"误差变化率的量化比例因子Kde="<<Kde<<endl;
  471.    cout<<"输出的量化比例因子Ku_p="<<Ku_p<<endl;
  472.    cout<<"输出的量化比例因子Ku_i="<<Ku_i<<endl;
  473.    cout<<"输出的量化比例因子Ku_d="<<Ku_d<<endl;
  474.    cout<<"设定目标target="<<target<<endl;
  475.    cout<<"误差e="<<e<<endl;
  476.    cout<<"Kp="<<Kp<<endl;
  477.    cout<<"Ki="<<Ki<<endl;
  478.    cout<<"Kd="<<Kd<<endl;
  479.    cout<<endl;
  480. }
  481. 复制
  482. 之后是简单的测试:

  483. #include<iostream>
  484. #include"fuzzy_PID.h"

  485. #define NB -3
  486. #define NM -2
  487. #define NS -1
  488. #define ZO 0
  489. #define PS 1
  490. #define PM 2
  491. #define PB 3

  492. int main()
  493. {
  494.    
  495.         float target=600;
  496.         float actual=0;
  497.         float u=0;
  498.         int deltaKpMatrix[7][7]={
  499.    {
  500.    PB,PB,PM,PM,PS,ZO,ZO},
  501.                                  {
  502.    PB,PB,PM,PS,PS,ZO,NS},
  503.                                                      {
  504.    PM,PM,PM,PS,ZO,NS,NS},
  505.                                  {
  506.    PM,PM,PS,ZO,NS,NM,NM},
  507.                                  {
  508.    PS,PS,ZO,NS,NS,NM,NM},
  509.                                  {
  510.    PS,ZO,NS,NM,NM,NM,NB},
  511.                                  {
  512.    ZO,ZO,NM,NM,NM,NB,NB}};
  513.         int deltaKiMatrix[7][7]={
  514.    {
  515.    NB,NB,NM,NM,NS,ZO,ZO},
  516.                                  {
  517.    NB,NB,NM,NS,NS,ZO,ZO},
  518.                                                      {
  519.    NB,NM,NS,NS,ZO,PS,PS},
  520.                                  {
  521.    NM,NM,NS,ZO,PS,PM,PM},
  522.                                  {
  523.    NM,NS,ZO,PS,PS,PM,PB},
  524.                                  {
  525.    ZO,ZO,PS,PS,PM,PB,PB},
  526.                                  {
  527.    ZO,ZO,PS,PM,PM,PB,PB}};
  528.         int deltaKdMatrix[7][7]={
  529.    {
  530.    PS,NS,NB,NB,NB,NM,PS},
  531.                                  {
  532.    PS,NS,NB,NM,NM,NS,ZO},
  533.                                                      {
  534.    ZO,NS,NM,NM,NS,NS,ZO},
  535.                                  {
  536.    ZO,NS,NS,NS,NS,NS,ZO},
  537.                                  {
  538.    ZO,ZO,ZO,ZO,ZO,ZO,ZO},
  539.                                  {
  540.    PB,NS,PS,PS,PS,PS,PB},
  541.                                  {
  542.    PB,PM,PM,PM,PS,PS,PB}};
  543.         float e_mf_paras[]={
  544.    -3,-3,-2,-3,-2,-1,-2,-1,0,-1,0,1,0,1,2,1,2,3,2,3,3};
  545.         float de_mf_paras[]={
  546.    -3,-3,-2,-3,-2,-1,-2,-1,0,-1,0,1,0,1,2,1,2,3,2,3,3};
  547.         float Kp_mf_paras[]={
  548.    -3,-3,-2,-3,-2,-1,-2,-1,0,-1,0,1,0,1,2,1,2,3,2,3,3};
  549.         float Ki_mf_paras[]={
  550.    -3,-3,-2,-3,-2,-1,-2,-1,0,-1,0,1,0,1,2,1,2,3,2,3,3};
  551.         float Kd_mf_paras[]={
  552.    -3,-3,-2,-3,-2,-1,-2,-1,0,-1,0,1,0,1,2,1,2,3,2,3,3};
  553.     FuzzyPID fuzzypid(1500,650,0.3,0.9,0.6,0.01,0.04,0.01);
  554.         fuzzypid.setMf("trimf",e_mf_paras,"trimf",de_mf_paras,"trimf",Kp_mf_paras,"trimf",Ki_mf_paras,"trimf",Kd_mf_paras);
  555.         fuzzypid.setRuleMatrix(deltaKpMatrix,deltaKiMatrix,deltaKdMatrix);
  556.         cout<<"num target actual"<<endl;
  557.         /*fuzzy.showInfo();*/
  558.         for(int i=0;i<50;i++)
  559.         {
  560.    
  561.                 u=fuzzypid.realize(target,actual);
  562.                 actual+=u;
  563.                 cout<<i<<" "<<target<<" "<<actual<<endl;
  564.         }
  565.         fuzzypid.showInfo();
  566.         system("pause");
  567.         return 0;
  568. }


lzmm 发表于 2023-11-5 11:22 | 显示全部楼层
需要确定合适的模糊函数。这些函数需要能够反映系统的状态和性能指标,并且需要具有足够的精度和可表达性。同时,模糊函数需要考虑到系统的非线性和动态特性。
claretttt 发表于 2023-11-5 11:48 | 显示全部楼层
在实现模糊PID控制算法时,需要设计合适的模糊控制器。模糊控制器需要能够有效地将系统的实时状态转化为模糊指令,并控制执行机构的动作。同时,模糊控制器需要具有足够的稳定性和精度。
iyoum 发表于 2023-11-5 14:50 | 显示全部楼层
比例环节能快速响应误差变化,积分环节能消除稳态误差,微分环节则可加快系统对于大惯性变化的响应速度并减弱超调趋势。根据系统的实际情况,适当调整这三个环节的比例,可以优化控制效果。例如,当误差向负方向增大时,可以适当增大比例环节以加快调节速度,同时减小积分环节以防止负方向上出现饱和积分的现象。
bestwell 发表于 2023-11-5 15:23 | 显示全部楼层
模糊PID控制算法的实现较为复杂,需要具备一定的编程能力和算法基础。如果开发人员缺乏相关经验和技能,则需要花费大量的时间和精力来学习和实践。
plsbackup 发表于 2023-11-5 16:18 | 显示全部楼层
需要注意选择合适的模糊化和解模糊的方法
uytyu 发表于 2023-11-5 17:34 | 显示全部楼层
在实现模糊PID控制算法时,需要考虑到这些不确定性问题,并采取相应的措施来解决。
mattlincoln 发表于 2023-11-5 18:07 | 显示全部楼层
可以减少模糊规则的个数,或者使用简化的模糊推理方法等。
ulystronglll 发表于 2023-11-5 21:09 | 显示全部楼层
使用模糊PID控制算法时,需要注意系统的稳定性。
mmbs 发表于 2023-11-5 21:39 | 显示全部楼层
模糊PID控制算法的运行环境也非常重要
jimmhu 发表于 2023-11-5 21:58 | 显示全部楼层
模糊PID控制算法需要经过严格的测试和验证才能投入使用,以确保其安全性和有效性。因此,开发人员需要制定一套完善的测试计划,并在实施过程中不断监控和评估控制系统的性能。
deliahouse887 发表于 2023-11-5 22:31 | 显示全部楼层
虽然模糊PID控制算法在一定程度上提高了系统的鲁棒性,但是在某些情况下,可能会影响系统的稳定性。
ulystronglll 发表于 2023-11-6 20:05 | 显示全部楼层
模糊PID控制中,模糊逻辑用于描述输入(误差和误差变化率)和输出(PID参数)之间的模糊关系。选择合适的模糊逻辑(如Mamdani或Takagi-Sugeno)对于实现良好的控制性能至关重要。
wilhelmina2 发表于 2023-11-7 19:29 | 显示全部楼层
模糊PID控制算法的核心是模糊规则库,它需要根据被控对象的特性进行设计。模糊规则库的设计需要考虑到输入和输出变量的选择、变量的模糊化方法、模糊规则的选择以及去模糊化方法等因素。
i1mcu 发表于 2023-11-8 12:17 | 显示全部楼层
在实际应用前,需要对系统进行建模和仿真,以验证模糊PID算法的有效性。根据仿真结果,可以进一步优化控制算法,提高控制性能。
mollylawrence 发表于 2023-11-8 13:38 | 显示全部楼层
在使用模糊PID控制算法时,需要注意系统的稳定性,必要时可以进行稳定性分析。
wilhelmina2 发表于 2023-11-8 14:58 | 显示全部楼层
需要根据实际过程的特性和需求,通过实验和调整来找到最佳的模糊控制规则。
ingramward 发表于 2023-11-8 15:05 | 显示全部楼层
在模糊PID控制算法中,需要注意避免过度调整PID参数导致系统不稳定的情况。
minzisc 发表于 2023-11-8 16:09 | 显示全部楼层
需要根据控制对象的特性和控制需求,合理地设定模糊规则,以达到调整PID参数的目的。
uptown 发表于 2023-11-8 19:09 | 显示全部楼层
模糊PID控制算法的计算量较大,因此在资源有限的条件下,可能需要对算法进行优化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

3322

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部