打印
[范例教程]

模糊PID温度控制

[复制链接]
1071|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
juliestephen|  楼主 | 2023-11-22 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


//-----------定义模糊系统参数-----------------------------------------------------------
//------------------------------------------------------------------------------------
// 定义差距输入常量
#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 uchar unsigned char
#define uint unsigned int

//-----------定义模糊系统参数-----------------------------------------------------------
//------------------------------------------------------------------------------------
unsigned char Temp_H,Temp_L;

uint sum;                          //10次AD值的综合变量
uchar RH,RH_H=12,RH_L=8,state,ms,cs;  //当前水位,  水位上限,下限,  设置项变量,50ms变量   ,cs 为计次数变量    ,
bit beep1,zt,s1;          //报警标志位,   工作模式标志位,   闪烁标志位

int Temperature;



//-----------定义模糊系统参数-----------------------------------------------------------
//------------------------------------------------------------------------------------
//-------------定义常量----------------------------------------------------------------
#define MU_MAX 0XFF            //模糊度的最大值为0XFF代表面1
#define RULE_TOT 10            //规则数个数
#define MF_TOT 5               //成员函数的个数
#define IO_NUM 0x07
#define LABEL_NUM 0x70
#define DEFAULT_VALUE 0x00
//----------------定义数据库-----------------------------------------------------------
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]={                  //距离功能函数
                                            { 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
                                          };

//-----------定义模糊系统参数-----------------------------------------------------------
//------------------------------------------------------------------------------------
//-----------定义模糊系统规则-----------------------------------------------------------
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值
//-----------子程序函数头申明-----------------------------------------------------------
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;              // 用点斜式计算mu
             temp-=input_memf[label][0];
             if (!input_memf[label][1])
             {
                temp=MU_MAX;
             }
             else
             {
                temp*=input_memf[label][1];
             }
             if (temp < 0x100)
             {                     // 如果结果不超过1
                return temp;       // 返回计算结果
             }
             else
             {
                return MU_MAX;     // 确保mu值在范围内
             }
        }
        else
        {                           // 输入落在第二条斜线上
            temp=input;               // 用点斜式方法计算 mu
            temp-=input_memf[label][2];
            temp*=input_memf[label][3];
            temp=MU_MAX-temp;
            if (temp < 0)
            {                      // 确保结果不小于0
                  return 0;
            }
            else
            {
                  return temp;        // mu为正 – 返回结果
            }
        }
    }
    return 0;
}
/*******************************************************************************
Function: defuzzify 解模糊
Description: 计算模糊输出的重心并调用函数把它
             转换成可被系统使用的输出量
Parameters: 无.
Returns: 无.
Side Effects: outputs[][] 数组被清零.
*******************************************************************************/
void defuzzify(void)
{
    unsigned long numerator, denominator;
    unsigned char j;
    numerator=0;                         // 恢复总数值
    denominator=0;
    for (j=0; j<MF_TOT; j++)
    {                                // 计算总和值
        numerator+=(outputs[j]*output_memf[j]);
        denominator+=outputs[j];
        outputs[j]=0;                        // 清零输出作为参考使用
        if (denominator)
        {                                     // 确保分母是0的情况不发生
            fuzzy_out=numerator/denominator;  // 确定 COG
        }
        else
        {
            fuzzy_out=DEFAULT_VALUE;         // 没有规则被触发
        }
    }
}
/*******************************************************************************
Function: fuzzy_engine
Description: 实施规则基中的规则
Parameters: 无
Returns: 无.
Side Effects: 无
********************************************************************************/
unsigned char bdata clause_val;                        // 保存当前的分支进行快速访问
sbit clause_type = clause_val^7;                       // 表示分支是否是条件分支或者是结果分支
void fuzzy_engine(uchar input)
{
    bit then;                                       // 当正在分析结果时置位
    unsigned char if_val,                           // 保存当前规则中条件分支中的值
                  clause,                           // 规则基中当前的分支
                      mu,                           // 保存当前分支中的值
                 label=0;                           // 被条件使用的成员函数
                  then=0;                           // 设第一个分支是条件分支
           if_val=MU_MAX;                           // max out mu for the first rule
    for (clause=0; clause<RULE_TOT; clause++)
    {                                               // 遍历每条规则
        clause_val=rules[clause];                   // 读入当前的分支
        if (!clause_type)
        {                                           // 当前的分支是不是条件分支
            if (then)
            {                                       // 是否正在分析结果...
                then=0;
                if_val=MU_MAX;                      // 复位mu
            }
            mu=compute_memval(input, label);        // 得到条件分支的值
            if_val=mu;
            label++;
        }
        else
        {                                       // 当前分支是结果
            then=1;            // 置位标志位,如果当前规则的mu比参考的值要大,保存这个值作为新的模糊输出
            if (outputs[clause_val&0x07] < if_val)
            {
                outputs[clause_val&0x07]=if_val;
            }
        }
    }
    defuzzify(); // 用COG方法计算模糊输出和反模糊输出
}

#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include<string.h>
#include"fuzzy.h"
struct PID
{
unsigned int SetPoint; // 设定目标 Desired Value
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
unsigned int LastError; // Error[-1]  当前偏差
unsigned int PrevError; // Error[-2]   上一次偏差
unsigned int SumError; // Sums of Errors 累计偏差
};
struct PID spid; // PID Control Structure
unsigned int rout; // PID Response (Output) 响应输出
unsigned int rin; // PID Feedback (Input)//反馈输入
unsigned char high_time,low_time,count=0;//占空比调节参数

#define uchar unsigned char
#define uint unsigned int

char Usart_Data[3];

bit FinishFlag =0;
char UsartCount=0;
uchar buzzer_flag = 0;
sbit buzzer = P1^2;
sbit output=P1^0;
sbit ds=P3^2;
sbit DQ=P3^2;//ds18b20与单片机连接口
sbit lcden=P2^7;//LCE使能引脚
sbit lcdrs=P2^5;
sbit lcdrw=P2^6;
sbit ledred=P1^6;                                        //加热指示灯
sbit ledgreen=P1^7;                                //加热指示灯

sbit key0=P2^0;//按键引脚
sbit key1=P2^1;

bit busy;

uchar set[2]={0};
uchar code str1[]="now temp:      C";
uchar code str2[]="set temp:      C";
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar n,num;
int set_temper=30,temper,temp; //温度变量定义
unsigned int s;
float         f_temp;//转换后的温度

uint tvalue;         
uchar tflag;//温度正负标志

void SendData(unsigned char dat);
void SetSendData(unsigned char SetNum);


void delay(i)//延时函数
{
        uint j;
        for(i;i>0;i--)
        for(j=110;j>0;j--);
}

void Delay_Ms(i){
  delay(i);

}
void Timer2_init()
{
        RCAP2H = (0XFFFF - 50000)/256;
        RCAP2L = (0XFFFF - 50000)%256;
        T2CON =0;
        //T2MOD = 0;
        IE |=0xA0;
        TR2 = 1;
}
void wr_com(uchar ml)//写命令
{
        lcdrs=0;
        P0=ml;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;

}



void wr_data(uchar shuju)//写数据
{
        lcdrs=1;
        //lcden=1;
        P0=shuju;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;

}

void init()  //按照时序操作的初始化
{        
        lcdrw=0;
        wr_com(0x38);//显示模式设置,设置为16*2显示,5*7点阵,八位数据口
        wr_com(0x0c);//开显示,但不开光标,光标不闪
        wr_com(0x06);//显示光标移动设置
        wr_com(0x01);// 清屏
        wr_com(0x80);        // 数据指针初始化
        for(num=0;num<16;num++)
                {
                        wr_data(str1[num]);//now temp
                }
        wr_com(0x80+0x40); //地址初始化
        for(num=0;num<16;num++)
                {
                        wr_data(str2[num]);//set temp
                }
        
}

/*************************DS1820程序****************************/
void delay_18B20(unsigned int i)//延时1微秒
{
   while(i--);
}

void ds1820rst(void)/*ds1820复位*/
{
        unsigned char x=0;
        DQ = 1;          //DQ复位
        delay_18B20(4); //延时
        DQ = 0;          //DQ拉低
   TR0=0;
        delay_18B20(100); //精确延时大于
   TR0=1;
        DQ = 1;          //拉高
        delay_18B20(40);
}

uchar ds1820rd(void)/*读数据*/
{
        unsigned char i=0;
        unsigned char dat = 0;
   TR0=0;
        for (i=8;i>0;i--)
        {   
                DQ = 0; //给脉冲信号
                dat>>=1;
                DQ = 1; //给脉冲信号
                if(DQ)
                dat|=0x80;
                delay_18B20(10);
        }
   return(dat);
}

void ds1820wr(uchar wdata)/*写数据*/
{
        unsigned char i=0;
   TR0=0;
   for (i=8; i>0; i--)
   {
                DQ = 0;
                DQ = wdata&0x01;
                delay_18B20(10);
                DQ = 1;
                wdata>>=1;
   }
}

uint get_temper()//获取温度
{  
     
        uchar a,b;

        ds1820rst();   
        ds1820wr(0xcc);//*跳过读序列号*/
        ds1820wr(0x44);//*启动温度转换*/
        ds1820rst();   
        ds1820wr(0xcc);//*跳过读序列号*/
        ds1820wr(0xbe);//*读取温度*/
        a=ds1820rd();
        b=ds1820rd();
   
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
   TR0=1;
   if(tvalue<0x0fff)   tflag=0;
   else {tvalue=~tvalue+1;tflag=1;}
        tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
        temp=tvalue;
        return temp;
}


void dis_temp(int t)//显示温度
{
        uchar d0,d1,d2,d3;
        //t=26;
        if(tflag==0)
        {
                d0=t/1000+0x30;
                d1=t%1000/100+0x30;
                d2=t%100/10+0x30;
                d3=t%10+0x30;
                if(d0==0x30)
                {
                        wr_com(0x80+9);
                        wr_data(d1);
                        wr_com(0x80+10);
                        wr_data(d2);
                        wr_com(0x80+11);
                        wr_data(0x2e);
                        wr_com(0x80+12);
                        wr_data(d3);
                        
                        SendData('N');
                        SendData(d1);
                        SendData(d2);
                        SendData('.');
                        SendData(d3);
                        SendData('E');                        
                        SendData('\r');
                SendData('\n');        
                }
                else
                {
                        wr_com(0x80+9);
                        wr_data(d0);
                        wr_com(0x80+10);
                        wr_data(d1);
                        wr_com(0x80+11);
                        wr_data(d2);
                        wr_com(0x80+12);
                        wr_data(' ');
                        
                        SendData('N');
                        SendData(d0);
                        SendData(d1);
                        SendData(d2);
                        SendData('E');                        
                        SendData('\r');
                SendData('\n');                                
               
                }
               
        }
        else
        {
                wr_com(0x80+9);
                wr_data('-');
                wr_com(0x80+10);
                wr_data(d1);
                wr_com(0x80+11);
                wr_data(d2);
                wr_com(0x80+12);
                wr_data(' ');
                //wr_com(0x80+12);
                //wr_data(d3);
               
//                        SendData('N');
//                        SendData(d1);
//                        SendData(d2);
//                        SendData('E');        
//                        SendData('\r');
//                        SendData('\n');               
        }
        wr_com(0x80+14);
        wr_data(0xdf);
        temper=t/10;
}



void keyscan()//键盘扫描
{  

   if(key0==0)
   {
                delay(1);
                if(key0==0)
                {
                        while(!key0);
                        delay(1);
                        while(!key0);
                        set_temper++;

                }

                set[0]=set_temper/10;        //获得设置温度显示值
                set[1]=set_temper%10;
                wr_com(0x80+0x40+9);
                wr_data(table[set[0]]);
                delay(1);
                wr_com(0x80+0x40+10);
                wr_data(table[set[1]]);
                delay(1);
                //wr_com(0x80+0x40+11);
                //wr_data(0x2e);
                //wr_com(0x80+0x40+14);
                //wr_data(0xdf);
                delay(1);
        }
        if(key1==0)
   {
                delay(3);//延时去抖
                if(key1==0)
                {
                        while(!key1);
                        delay(3);
                        while(!key1);
                        set_temper--;//温度减
                        if(set_temper==0)
                        {set_temper=0;}
                }

        
                set[0]=set_temper/10;        //获得设置温度显示值
                set[1]=set_temper%10;
                wr_com(0x80+0x40+9);        //显示设置温度值
                wr_data(table[set[0]]);
                delay(1);
                wr_com(0x80+0x40+10);
                wr_data(table[set[1]]);
                delay(1);
                //wr_com(0x80+0x40+11);
                //wr_data(0x2e);
                wr_com(0x80+0x40+14);
                wr_data(0xdf);
                delay(1);
        }
}

void PIDInit (struct PID *pp)
{
        memset ( pp,0,sizeof(struct PID)); //用参数0初始化pp
}



unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) //PID计算
{
        unsigned int dError,Error;
        Error = pp->SetPoint - NextPoint; // 偏差
        pp->SumError += Error; // 积分
        dError = pp->LastError - pp->PrevError; // 当前微分
        pp->PrevError = pp->LastError;
        pp->LastError = Error;
        return (pp->Proportion * Error//比例
        + pp->Integral * pp->SumError  //积分项
        + pp->Derivative * dError); //   微分项
}
/***********************************************************
温度比较处理子程序
***********************************************************/

void compare_temper(void)
{
        unsigned char i;
        if(set_temper>temper)         //设置温度大于当前温度
        {
                buzzer_flag = 0;
                ledred=0;
                ledgreen=1;
                if(set_temper-temper>1)         //温度相差1度以上
                {         
                        high_time=100;
                        low_time=0;
                }
                else         //设置温度不大于当前温度
                {
                        //模糊计算
                        fuzzy_engine((set_temper-temper)*10);

                        high_time=(unsigned char)(fuzzy_out*4);
                        if(high_time>100)
                                high_time = 100;
                        low_time= (100-high_time);
                }
        }
        else if(set_temper<=temper)         //设置温度不大于当前温度
        {
                buzzer_flag = 1;
                ledred=1;
                ledgreen=0;
                if(temper-set_temper>0) //温度相差0度以上
                {
                        high_time=0;
                        low_time=100;
                }
                else
                {  
                        high_time=0;
                        low_time=100;
                }
        }
}

/*****************************************************
T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期
******************************************************/
void serve_T0() interrupt 1 using 1
{
        if(++count<=(high_time))         output=0;
        else if(count<=50)
        {
                output=1;
        }
        else count=0;
        TH0=0x2f;
        TL0=0x40;
}
void UsarrtInit(){
    SCON = 0x50;            //8-bit variable UART
    TMOD |= 0x20;            //Set Timer1 as 8-bit auto reload mode
    TH1 = TL1 = 0XFD;      //Set auto-reload vaule
    TR1 = 1;                //Timer1 start run
    ES = 1;                 //Enable UART interrupt
    EA = 1;                 //Open master interrupt switch
}

void SendData(unsigned char dat)
{
    while (busy);           //Wait for the completion of the previous data is sent
    ACC = dat;              //Calculate the even parity bit P (PSW.0)
    busy = 1;
    SBUF = ACC;             //Send data to UART buffer
}


/*----------------------------
UART interrupt service routine
----------------------------*/
void Uart_Isr() interrupt 4
{   
        unsigned char a;
        
    if (RI)
    {
        RI = 0;             //Clear receive interrupt flag
        a=SBUF;
                if(!FinishFlag){
                        
           Usart_Data[UsartCount]=a;
                        
        if(++UsartCount>2){
        UsartCount=0;
                FinishFlag=1;
        }
                        
                }else{
               
               
               
                }


               
    }
    if (TI)
    {
        TI = 0;             //Clear transmit interrupt flag
        busy = 0;           //Clear transmit busy flag
    }
}
void TemSendData(unsigned char SetNum){

        uchar d0,d1,d2,d3;
            if(tflag==0){
                d0=SetNum/1000+0x30;
                d1=SetNum%1000/100+0x30;
                d2=SetNum%100/10+0x30;
                d3=SetNum%10+0x30;
               
                        if(d0==0x30){
                                
                        SendData('N');
                        SendData(d1);
                        SendData(d2);
                        SendData('.');
                        SendData(d3);
                        SendData('E');                        
                        SendData('\r');
                SendData('\n');        
                        
                        }else{
                        SendData('N');
                        SendData(d0);
                        SendData(d1);
                        SendData(d2);
                        SendData('E');                        
                        SendData('\r');
                SendData('\n');        
                        
                        
                        
                        }        
                }else{
               
                        SendData('N');
                        SendData(d1);
                        SendData(d2);
                        SendData('E');        
                        SendData('\r');
                        SendData('\n');                                
               
               
                }





}


void SetSendData(unsigned char SetNum){        
        SendData('S');
        SendData(SetNum/10+48);
        SendData(SetNum%10+48);
        SendData('E');
        SendData('\r');
        SendData('\n');        
}

void LedA_StateData(){
        SendData('L');
        SendData('A');
        if(ledred){
        SendData('1');
        }else{
        SendData('0');
        }
        SendData('E');
        SendData('\r');
        SendData('\n');        
}
void LedB_StateData(){
        SendData('L');
        SendData('B');
        if(ledgreen){
        SendData('1');
        }else{
        SendData('0');
        }
        SendData('E');
        SendData('\r');
        SendData('\n');
}
void USart_Handle(){
      if(FinishFlag){
          if(Usart_Data[0]=='S'){;         
          set_temper=((Usart_Data[1]-48)*10)+(Usart_Data[2]-48);
                  
          }
                  set[0]=set_temper/10;        //获得设置温度显示值
                set[1]=set_temper%10;
                wr_com(0x80+0x40+9);        //显示设置温度值
                wr_data(table[set[0]]);
                delay(1);
                wr_com(0x80+0x40+10);
                wr_data(table[set[1]]);
                delay(1);
         
          FinishFlag=0;
          }
}


使用特权

评论回复
沙发
updownq| | 2023-12-2 15:05 | 只看该作者
模糊PID温度控制是一种基于模糊逻辑算法的PID温度控制方法。

使用特权

评论回复
板凳
elsaflower| | 2023-12-2 16:09 | 只看该作者
模糊PID控制能够根据系统的状态自动调整控制参数,以达到更好的控制效果。

使用特权

评论回复
地板
modesty3jonah| | 2023-12-2 19:27 | 只看该作者
模糊PID温度控制是一种更先进的温度控制方法,它在许多需要精确温度控制的应用中都有广泛的使用

使用特权

评论回复
5
albertaabbot| | 2023-12-2 20:12 | 只看该作者
在模糊PID温度控制中,通过测量温度信号和设定温度信号,计算出模糊控制器的输出值。模糊控制器可以根据历史数据、实时数据和预测模型等信息,自动调整输出值,从而实现对温度的精确控制。

使用特权

评论回复
6
primojones| | 2023-12-2 20:20 | 只看该作者
根据模糊控制器得到的PID控制器的参数,实现PID控制器的控制算法,从而实现对温度的控制。

使用特权

评论回复
7
usysm| | 2023-12-2 22:05 | 只看该作者
模糊PID温度控制是一种将模糊控制与PID控制相结合的温度控制方法。在传统的PID温度控制中,控制精度较低,无法处理复杂的控制问题。而模糊控制具有非线性、自适应、鲁棒性强等优点,适用于处理复杂的控制问题。

使用特权

评论回复
8
alvpeg| | 2023-12-2 22:26 | 只看该作者
模糊PID温度控制是一种先进的温度控制策略,它结合了模糊逻辑和传统PID控制的优点。

使用特权

评论回复
9
wwppd| | 2023-12-2 22:34 | 只看该作者
模糊PID温度控制是一种基于模糊控制理论和PID控制算法的温度控制方法。

使用特权

评论回复
10
pl202| | 2023-12-3 22:39 | 只看该作者
模糊PID控制采用模糊逻辑,能够实现对复杂系统的智能化控制。

使用特权

评论回复
11
janewood| | 2023-12-4 11:18 | 只看该作者
模糊PID温度控制系统在许多实际应用场景中取得了良好的控制效果

使用特权

评论回复
12
eefas| | 2023-12-4 15:23 | 只看该作者
在常规的PID控制中,参数通常是固定的,而在模糊PID控制中,这三个参数能够根据系统的状态实时调整。

使用特权

评论回复
13
51xlf| | 2023-12-5 13:49 | 只看该作者
根据模糊控制器的输入和输出变量、模糊控制器的模糊控制规则,实现模糊控制器的逻辑推理,从而得到PID控制器的参数。

使用特权

评论回复
14
plsbackup| | 2023-12-5 14:29 | 只看该作者
在这种方法中,PID的三个参数(比例、积分、微分)是通过模糊逻辑算法整定出来的,具有自适应的特性。也就是说,这三个参数会根据外界环境的变化自动调节,以保证控制系统的稳定性。

使用特权

评论回复
15
sanfuzi| | 2023-12-6 16:07 | 只看该作者
模糊PID温度控制是一种基于模糊控制理论和PID控制算法的温度控制方法

使用特权

评论回复
16
ingramward| | 2023-12-8 09:28 | 只看该作者
在模糊PID温度控制中,模糊逻辑控制用于调整PID控制器的参数,以适应不同的工作环境和系统状态。

使用特权

评论回复
17
adolphcocker| | 2023-12-13 11:15 | 只看该作者
模糊PID控制通过模糊逻辑对PID控制算法中的参数进行在线自整定,从而实现对温度的高精度控制。

使用特权

评论回复
18
eefas| | 2023-12-13 11:55 | 只看该作者
利用模糊逻辑对PID控制算法中的参数进行在线自整定,从而实现对温度的高精度控制。

使用特权

评论回复
19
mickit| | 2023-12-13 14:03 | 只看该作者
传统的PID控制中,PID的三个参数设定后是不变,不具备自适应的特性。而在模糊PID温度控制中,由于参数的自动调节,使得系统能够更好地适应环境的变化,提高控制的精度和稳定性。

使用特权

评论回复
20
geraldbetty| | 2023-12-13 18:47 | 只看该作者
根据经验和实际情况确定模糊控制器的模糊控制规则,包括模糊控制器的输入和输出变量的模糊集、模糊控制器的隶属函数等。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

1090

帖子

2

粉丝