一个模糊推理(T-S型系统)例子,如下:
代码的例子如下:
//制定推理规则:
//阀门的打开度数在[0, 90]
//定义:
// 关闭:0 开小:0~30 开中:30~60 开大:60~90
//R1:温度低,则关闭冷气阀门 if T is f1, then Y=0; Y表示:温度高低对应需要打开的度数
//R2:温度较低,则开小冷气阀门 if T is f2, then Y=30/14*(T-10);
//R3:温度较高,则阀门开中 if T is f3, then Y=30/22*(T-14)+30;
//R4:温度高,则开大阀门 if T is f4, then Y=30/12*(T-24)+60;
代码实现如下:
(下面代码是按照个人理解和思路书写,正确与否尚且不知,从结果看还是有些合理的,欢迎大牛帮忙指正)
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define N 4
double A[N];
double Y[N];
double funA1(double x); //A1温度低,的隶属度函数
double funA2(double x); //A2温度较低,的隶属度函数
double funA3(double x); //A3温度较高,的隶属度函数
double funA4(double x); //A4温度高,的隶属度函数
void main()
{
double T, Z;
double sum=0;
int i;
//推理规则
//阀门的打开度数在[0, 90]
//定义开小:0~30 开中:30~60 开大:60~90
//R1:温度低,则关闭冷气阀门 if T is f1, then Y=0; Y表示:温度高低对应需要打开的度数
//R2:温度较低,则开小冷气阀门 if T is f2, then Y=30/14*(T-10);
//R3:温度较高,则阀门开中 if T is f3, then Y=30/22*(T-14)+30;
//R4:温度高,则开大阀门 if T is f4, then Y=30/12*(T-24)+60;
for(T=0; T<50; T++)
{
A[0] = funA1(T);
A[1] = funA2(T);
A[2] = funA3(T);
A[3] = funA4(T);
//根据推理规则可计算
Y[0] = 0;
Y[1] = 30/14*(T-10);
Y[2] = 30/22*(T-14)+30;
Y[3] = 30/12*(T-24)+60;
//按加权求和法计算总输出
sum = 0;
for(i=0; i<N; i++)
{
sum += Y[i]*A[i];
}
printf("\n%0.2lf %lf\n", T, sum);
}
}
//A1的隶属度函数
double funA1(double x)
{
if(x<=10)
return 1;
if(x>10 && x<14)
return (1-(x-10)/4);
if(x>=14)
return 0;
}
//A2的隶属度函数
double funA2(double x)
{
if(x<=10)
return 0;
if(x>10 && x<=14)
return (x-10)/4;
if(x>14 && x<=24)
return (1-(x-14)/10);
if(x>24)
return 0;
}
//A3的隶属度函数
double funA3(double x)
{
if(x<=14)
return 0;
if(x>14 && x<=24)
return (x-14)/10;
if(x>24 && x<=36)
return 1-(x-24)/12;
if(x>36)
return 0;
}
//A4的隶属度函数
double funA4(double x)
{
if(x<=24)
return 0;
if(x>24 && x<=36)
return (x-24)/12;
if(x>36)
return 1;
}