一個模糊推理(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;
}