模糊推理(T-S系統)+C代碼


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章