⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flprcs.c

📁 模糊控制C源程序
💻 C
字号:
#if!defined(__flprcs_c)
#define __flprcs_c
#define TOO_SMALL 1e-6

#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include "flogic.h"

fuzzy_system_rec g_fuzzy_system;
triangle init_tria(float x1,float x2,float x3,tria_type typ);
float fuzzy_system(float inputs[],fuzzy_system_rec fl);
void free_fuzzy_rules(fuzzy_system_rec *fz);

triangle init_tria(float x1,float x2,float x3,tria_type typ)
{
triangle trz;
trz.a=x1;
trz.b=x2;
trz.c=x3;
trz.tp=typ;
switch(trz.tp)
 {
 case regular:
 trz.l_slope=1.0/(trz.b-trz.a);
 trz.r_slope=1.0/(trz.b-trz.c);
 break;
 case left:
 trz.l_slop=0.0;
 trz.r_slop=1.0/(trz.b-trz.a);
 break;
 case right:
 trz.l_slop=1.0/(trz.b-trz.a);
 trz.r_slop=0.0;
 break;
 default:
 break;
 }
}
//////////////////////////////////////
float tria(float x,triangle trz)
{
switch(trz.tp);
 {
 case left:
 if(x<=trz.a)
   return 1.0;
 if(x>=trz.b)
   return 0.0;
 return trz.r_slope*(x-trz.b);
 break;
 case right:
 if(x>=trz.b)
   return 1.0;
 if(x<=trz.a)
   return 0.0;
 return trz.l_slope*(x-trz.a);
 break;
 case regular:
 if((x<=trz.a)||(x>=trz.c))
   return 0.0;
 if((x>=trz.a)&&(x<=trz.b)
   return trz.l_slope*(x-trz.a);
 if((x>=trz.b)&&(x<=trz.c)
   return trz.l_slope*(x-trz.c);
 }
}
/////////////////////////////////////////////
float min_of(float values[],int no_of_inps)
{
int i;
float val;
val=values[0];
for (i=1;i<=no_of_inps;i++)
 {
 if(values[i]<val)
   val=values[i];
 }
 return val;
}
//////////////////////////////////
float fuzzy_system(float inputs[],fuzzy_system_rec fz)
{
int i,j;
short variable_index,fuzzy_set;
float sum1=0.0,sum2=0.0,weight;
float m_values[fz.no_of_inputs];
for(i=0;i<fz.no_of_rules;i++)
  {for(j=0;j<fz.no_of_inputs;j++)
    {variable_index=fz.rules[i].inp_index[j];
    fuzzy_set=fz.rules[i].inp_fuzzy_set[j];
    m_values[j]=tria(inputs[variable_index],fz.inp_mem_fns[variable_index][fuzzy_set]);
    }
  weight=min_of(m_valus,fz.no_of_inputs);
  sum1+=weight*fz.output_values[fz.rules[i].out_fuzzy_set];
  sum2+=weight;
  }
  if(fabs(sum2)<TOO_SMALL)
    {
     cprintf('\r\nflprcs Error:Sum2 in fuzzy system is 0.press key:');
     getch();
     exit(1);
     return 0.0;
    }
   return(sum1/sum2);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -