📄 sffisold.c
字号:
double tmp;
if (a==0)
fisError("Illegal parameters in fisGeneralizedBellMf() --> a = 0");
tmp = pow((x-c)/a, 2.0);
if (tmp == 0 && b == 0)
return(0.5);
else if (tmp == 0 && b < 0)
return(0.0);
else
return(1/(1+pow(tmp, b)));
}
/* S membership function */
static double
#ifdef __STDC__
fisSMf(double x, double *para)
#else
fisSMf(x, para)
double x, *para;
#endif
{
double a = para[0], b = para[1];
double out;
if (a >= b)
return(x >= (a+b)/2);
if (x <= a)
out = 0;
else if (x <= (a + b)/2)
out = 2*pow((x-a)/(b-a), 2.0);
else if (x <= b)
out = 1-2*pow((b-x)/(b-a), 2.0);
else
out = 1;
return(out);
}
/* Z membership function */
static double
#ifdef __STDC__
fisZMf(double x, double *para)
#else
fisZMf(x, para)
double x, *para;
#endif
{
double a = para[0], b = para[1];
double out;
if (a >= b)
return(x <= (a+b)/2);
if (x <= a)
out = 1;
else if (x <= (a + b)/2)
out = 1 - 2*pow((x-a)/(b-a), 2.0);
else if (x <= b)
out = 2*pow((b-x)/(b-a), 2.0);
else
out = 0;
return(out);
}
/* pi membership function */
static double
#ifdef __STDC__
fisPiMf(double x, double *para)
#else
fisPiMf(x, para)
double x, *para;
#endif
{
return(fisSMf(x, para)*fisZMf(x, para+2));
}
/* all membership function */
static double
#ifdef __STDC__
fisAllMf(double x, double *para)
#else
fisAllMf(x, para)
double x, *para;
#endif
{
return(1);
}
/* returns the number of parameters of MF */
static int
#ifdef __STDC__
fisGetMfParaN(char *mfType)
#else
fisGetMfParaN(mfType)
char *mfType;
#endif
{
if (strcmp(mfType, "trimf") == 0)
return(3);
if (strcmp(mfType, "trapmf") == 0)
return(4);
if (strcmp(mfType, "gaussmf") == 0)
return(2);
if (strcmp(mfType, "gauss2mf") == 0)
return(4);
if (strcmp(mfType, "sigmf") == 0)
return(2);
if (strcmp(mfType, "dsigmf") == 0)
return(4);
if (strcmp(mfType, "psigmf") == 0)
return(4);
if (strcmp(mfType, "gbellmf") == 0)
return(3);
if (strcmp(mfType, "smf") == 0)
return(2);
if (strcmp(mfType, "zmf") == 0)
return(2);
if (strcmp(mfType, "pimf") == 0)
return(4);
#ifndef NO_PRINTF
printf("Given MF type (%s) is unknown.\n", mfType);
#endif
exit(1);
return(0); /* get rid of compiler warning */
}
/***********************************************************************
T-norm and T-conorm operators
**********************************************************************/
/* Copyright (c) 1994-98 by The MathWorks, Inc. */
/* $Revision: $ $Date: $ */
static double
#ifdef __STDC__
fisMin(double x, double y)
#else
fisMin(x, y)
double x, y;
#endif
{return((x) < (y) ? (x) : (y));}
static double
#ifdef __STDC__
fisMax(double x, double y)
#else
fisMax(x, y)
double x, y;
#endif
{return((x) > (y) ? (x) : (y));}
static double
#ifdef __STDC__
fisProduct(double x, double y)
#else
fisProduct(x, y)
double x, y;
#endif
{return(x*y);}
static double
#ifdef __STDC__
fisProbOr(double x, double y)
#else
fisProbOr(x, y)
double x, y;
#endif
{return(x + y - x*y);}
static double
#ifdef __STDC__
fisSum(double x, double y)
#else
fisSum(x, y)
double x, y;
#endif
{return(x + y);}
/* apply given function to an array */
static double
#ifdef __STDC__
fisArrayOperation(double *array, int size, double (*fcn)())
#else
fisArrayOperation(array, size, fcn)
double *array;
int size;
double (*fcn)();
#endif
{
int i;
double out;
if (size == 0)
fisError("Given size is zero!");
out = array[0];
for (i = 1; i < size; i++)
out = (*fcn)(out, array[i]);
return(out);
}
/* Copyright (c) 1994-98 by The MathWorks, Inc. */
/* $Revision: $ $Date: $ */
/***********************************************************************
Defuzzification methods
**********************************************************************/
/* return the center of area of combined output MF (specified by mf)
of output m */
/* numofpoints is the number of partition for integration */
static double
#ifdef __STDC__
defuzzCentroid(FIS *fis, int m, double *mf, int numofpoints)
#else
defuzzCentroid(fis, m, mf)
FIS *fis;
int m;
double *mf;
int numofpoints;
#endif
{
double min = fis->output[m]->bound[0];
double max = fis->output[m]->bound[1];
double step = (max - min)/(numofpoints - 1);
double total_mf = 0;
double sum = 0;
int i;
for (i = 0; i < numofpoints; i++){
total_mf += mf[i];
sum += mf[i]*(min + step*i);
}
if (total_mf == 0) {
#ifndef NO_PRINTF
printf("Total area is zero in defuzzCentroid() for output %d!\n", m+1);
printf("Average of the range of this output variable is used as the output value.\n\n");
#endif
return((fis->output[m]->bound[0] + fis->output[m]->bound[1])/2);
}
return(sum/total_mf);
}
/* return the bisector of area of mf */
static double
#ifdef __STDC__
defuzzBisector(FIS *fis, int m, double *mf, int numofpoints)
#else
defuzzBisector(fis, m, mf)
FIS *fis;
int m;
double *mf;
int numofpoints;
#endif
{
double min = fis->output[m]->bound[0];
double max = fis->output[m]->bound[1];
double step = (max - min)/(numofpoints - 1);
double area, sub_area;
int i;
/* find the total area */
area = 0;
for (i = 0; i < numofpoints; i++)
area += mf[i];
if (area == 0) {
#ifndef NO_PRINTF
printf("Total area is zero in defuzzBisector() for output %d!\n", m+1);
printf("Average of the range of this output variable is used as the output value.\n");
#endif
return((fis->output[m]->bound[0] + fis->output[m]->bound[1])/2);
}
sub_area = 0;
for (i = 0; i < numofpoints; i++) {
sub_area += mf[i];
if (sub_area >= area/2)
break;
}
return(min + step*i);
}
/* Returns the mean of maximizing x of mf */
static double
#ifdef __STDC__
defuzzMeanOfMax(FIS *fis, int m, double *mf, int numofpoints)
#else
defuzzMeanOfMax(fis, m, mf)
FIS *fis;
int m;
double *mf;
int numofpoints;
#endif
{
double min = fis->output[m]->bound[0];
double max = fis->output[m]->bound[1];
double step = (max - min)/(numofpoints - 1);
double mf_max;
double sum;
int count;
int i;
mf_max = fisArrayOperation(mf, numofpoints, fisMax);
sum = 0;
count = 0;
for (i = 0; i < numofpoints; i++)
if (mf[i] == mf_max) {
count++;
sum += i;
}
return(min+step*sum/count);
}
/* Returns the smallest (in magnitude) maximizing x of mf */
static double
#ifdef __STDC__
defuzzSmallestOfMax(FIS *fis, int m, double *mf, int numofpoints)
#else
defuzzSmallestOfMax(fis, m, mf)
FIS *fis;
int m;
double *mf;
int numofpoints;
#endif
{
double min = fis->output[m]->bound[0];
double max = fis->output[m]->bound[1];
double step = (max - min)/(numofpoints - 1);
double mf_max;
int i, min_index = 0;
double min_distance = pow(2.0, 31.0)-1;
double distance; /* distance to the origin */
mf_max = fisArrayOperation(mf, numofpoints, fisMax);
for (i = 0; i < numofpoints; i++)
if (mf[i] == mf_max) {
distance = ABS(min + step*i);
if (min_distance > distance) {
min_distance = distance;
min_index = i;
}
}
return(min + step*min_index);
}
/* Returns the largest (in magnitude) maximizing x of mf */
static double
#ifdef __STDC__
defuzzLargestOfMax(FIS *fis, int m, double *mf, int numofpoints)
#else
defuzzLargestOfMax(fis, m, mf)
FIS *fis;
int m;
double *mf;
int numofpoints;
#endif
{
double min = fis->output[m]->bound[0];
double max = fis->output[m]->bound[1];
double step = (max - min)/(numofpoints - 1);
double mf_max;
int i, max_index = 0;
double max_distance = -(pow(2.0, 31.0)-1);
double distance; /* distance to the origin */
mf_max = fisArrayOperation(mf, numofpoints, fisMax);
for (i = 0; i < numofpoints; i++)
if (mf[i] == mf_max) {
distance = ABS(min + step*i);
if (max_distance < distance) {
max_distance = distance;
max_index = i;
}
}
return(min + step*max_index);
}
/* Copyright (c) 1994-98 by The MathWorks, Inc. */
/* $Revision: $ $Date: $ */
#ifdef MATLAB_MEX_FILE
/***********************************************************************
MATLAB function calls
**********************************************************************/
/* V4 --> v5
mxFreeMatrix --> mxDestroyArray
Matrix --> mxArray;
mxCreateFull(*, *, 0) --> mxCreateDoubleMatrix(*, *, mxREAL)
mexCallMATLAB(*, *, prhs, *) --> mexCallMATLAB(*, *, (mxArray **)prhs, *)
*/
/* execute MATLAB MF function, scalar version */
static double
#ifdef __STDC__
fisCallMatlabMf(double x, double *para, char *mf_type)
#else
fisCallMatlabMf(x, para, mf_type)
double x, *para;
char *mf_type;
#endif
{
int i;
mxArray *PARA = mxCreateDoubleMatrix(MF_PARA_N, 1, mxREAL);
mxArray *X = mxCreateDoubleMatrix(1, 1, mxREAL);
mxArray *OUT;
double out;
mxArray *prhs[2];
/* data transfer */
for (i = 0; i < MF_PARA_N; i++)
mxGetPr(PARA)[i] = para[i];
mxGetPr(X)[0] = x;
prhs[0] = X; prhs[1] = PARA;
/* call matlab MF function */
mexCallMATLAB(1, &OUT, 2, (mxArray **)prhs, mf_type);
out = mxGetScalar(OUT);
/* free allocated matrix */
mxDestroyArray(X);
mxDestroyArray(PARA);
mxDestroyArray(OUT);
/* return output */
return(out);
}
/* execute MATLAB MF function, vector version */
/* this is used in fisComputeOutputMfValueArray() */
static void
#ifdef __STDC__
fisCallMatlabMf2(double *x, double *para, char *mf_type, int leng, double *out)
#else
fisCallMatlabMf2(x, para, mf_type, leng, out)
double *x, *para;
char *mf_type;
int leng;
double *out;
#endif
{
int i;
mxArray *PARA = mxCreateDoubleMatrix(MF_PARA_N, 1, mxREAL);
mxArray *X = mxCreateDoubleMatrix(leng, 1, mxREAL);
mxArray *OUT;
mxArray *prhs[2];
/* transfer data in */
for (i = 0; i < MF_PARA_N; i++)
mxGetPr(PARA)[i] = para[i];
for (i = 0; i < leng; i++)
mxGetPr(X)[i] = x[i];
prhs[0] = X; prhs[1] = PARA;
/* call matlab MF function */
mexCallMATLAB(1, &OUT, 2, (mxArray **)prhs, mf_type);
/* transfer data out */
for (i = 0; i < leng; i++)
out[i] = mxGetPr(OUT)[i];
/* free allocated matrix */
mxDestroyArray(X);
mxDestroyArray(PARA);
mxDestroyArray(OUT);
}
#ifdef MATLAB_MEX_FILE /* This is only for MEX files, not for RTW */
/* use MATLAB 'exist' to check the type of a variable or function */
static double
#ifdef __STDC__
fisCallMatlabExist(char *variable)
#else
fisCallMatlabExist(variable)
char *variable;
#endif
{
double out;
#ifndef NO_PRINTF
mxArray *VARIABLE = mxCreateString(variable);
#else
mxArray *VARIABLE;
#endif
mxArray *OUT;
/* call matlab 'exist' */
mexCallMATLAB(1, &OUT, 1, &VARIABLE, "exist");
out = mxGetScalar(OUT);
/* free allocated matrix */
mxDestroyArray(VARIABLE);
mxDestroyArray(OUT);
/*
printf("%s\n", variable);
printf("out = %f\n", out);
*/
/* return output */
return(out);
}
#endif
/* execute MATLAB function with a vector input */
/* qualified MATLAB functions are min, sum, max, etc */
static double
#ifdef __STDC__
fisCallMatlabFcn(double *x, int leng, char *func)
#else
fisCallMatlabFcn(x, leng, func)
double *x;
int leng;
char *func;
#endif
{
double out;
mxArray *X = mxCreateDoubleMatrix(leng, 1, mxREAL);
mxArray *OUT;
int i;
/* transfer data */
for (i = 0; i < leng; i++)
mxGetPr(X)[i] = x[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -