📄 flprcs.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 + -