Приклади нечіткого управління 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Приклади нечіткого управління



 

С. 217 2.7.1. Керування зарядкою акумуляторної батареї за допомогою нечіткої логіки

[Джонс М.Т. Программирование искусственного интеллекта в приложениях. – М.: ДМК Пресс, 2004. – 312 с. (с.216-224)]

 

Управління зарядом батареї.

Акумуляторна батарея використовує джерело заряду від сонячних батарей і розряджається на навантаження. Напруга джерела заряду дозволяє заряджати батарею, у той час як навантаження розряджає її.

Батарея має два режими заряда:

1. У режимі підзарядки струм батареї невеликий, і це приводить до ії неповної зарядки.

2. У режимі швидкої зарядки струм батареї найбільший.

Стан батареї відслідковують два датчики: датчик напруги і датчик температури. При зарядці температура батареї підвищується. Якщо батарея нагрівається, то можна вважати, що вона цілком заряджена і треба перейти на менший струм – з режиму швидкої зарядки в режим підзарядки. Крім того, можна вимірювати напругу батареї, щоб визначити, чи досягло воно межі, і потім переключитися в режим підзарядки. Якщо батарея не нагрілася і не досягла межі по напрузі, то варто перейти в режим швидкої зарядки. Для керування зарядкою можна використовувати такі правила нечіткої логіки:

if m_voltage_high (voltage)

then mode = trickle_charge

if m_temperature_hot (temperature)

then mode = trickle_charge

if ((not (m_voltage_high (voltage))) AND

(not (m_temperature_hot (temperature))))

then mode = fast_charge

Завдання полягає в тім, щоб створити функції належності і використати правила нечіткої логіки.

 

С. 217 Функції належності при зарядці батареї за допомогою нечіткої логіки.

У даному випадку задані два змінні: напруга і температура. Графік функції належності для напруга і температури описують по три терми: для напруги - низьке, середнє і високе (рис. 9.5); для температури – холодно, тепло і гаряче (рис. 9.6).

Функції належності для напруги

Розроблювачі програмного забезпечення звичайно використовують два елементи нечіткої логіки: оператори нечіткої логіки і функції належності. Оператори нечіткої логіки являють собою функції AND, OR і NOT, модифіковані для нечіткої логіки (листинг 9.1).

Листинг 9.1. Оператори нечіткої логіки

#define MAX(a,b) ((а>b)? а: b)

#define MIN(a,b) ((a<b)? a: b)

fuzzyType fuzzyAnd(fuzzyType a, fuzzyType b)

{

return MAX(a.b);

}

fuzzyType fuzzyOr(fuzzyType a, fuzzyType b)

{

return MIN(a.b);

}

fuzzyType fuzzyNot(fuzzyType a)

{

return(1.0 - a);

}

Листинг 9.2. Функції, що використовуються для створення функцій належності

fuzzyType spikeProfile(float value, float lo, float high)

{

float peak;

value += (-1о);

if ((lo < 0) && (high < 0)) {

high = -(high - lo);

} else if (lo < 0) && (high > 0)) {

high += -lo;

} else if (lo > 0) && (high > 0)) {

high -= lo;

}

peak = (high / 2.0);

lo = 0.0;

if (value < peak) {

return (value / peak);

} else if (value > peak) {

return ((high-value) / peak);

}

return 1.0;

}

fuzzyType plateauProf ile (float value, float lo, float lo_plat,

float hi_plat, float hi)

{

float upslope;

float downslope;

value += (-lo);

 

if (lo < 0.0) {

lo_plat += -lo; hi_plat += -lo;

hi += -lo; lo = 0;
} else {

lo_plat -= lo; hi_plat -= lo;

hi -= lo; lo = 0;

}

upslope = (1.0 / (lo_plat - lo));

downslope = (1.0 / (hi - hi_plat));

 

if (value < lo) return 0.0;

else if (value > hi) return 0.0;

else if ((value >= lo_plat) && (value <= hi_plat)) return 1.0;

else if (value < lo_plat) return ((value-lo) * upslope);

else if (value > hi_plat) return ((hi-value) * downslope);

return 0.0;

}

Перша функція, spikeProfile, задає функцію належності у вигляді трикутника. Розроблювач указує значення lo і hi, що визначають базові вершини трикутника. Вища точка задається як hi/2.

Друга функція, plateauProfile, задає функцію належності у формі трапеції. За допомогою функції plateauProfile додатково створюються ті функції належності, що поширюються до границь (наприклад, функції холодно і жарко на рис. 9.6).

 

 

Функції належності для моделі зарядного пристрою.

Листинг 9.3. Функції належності для напруги

fuzzyType m_voltage_low(float voltage)

{

const float lo = 5.0;

const float lo_plat = 5.0;

const float hi_plat = 5.0;

const float hi = 10.0;

if (voltage < lo) return 1.0;

if (voltage > hi) return 0.0;

return plateauProfile(voltage, lo, lo_plat, hi_plat, hi);

}

fuzzyType m_voltage_medium(float voltage)

{

const float lo = 5.0;

const float lo_plat = 10.0;

const float hi_plat = 20.0,-

const float hi = 25.0;

if (voltage < lo) return 0.0;

if (voltage > hi) return 0.0;

return plateauProfile(voltage, lo, lo_plat, hi_plat, hi);

Ї

fuzzyType m_voltage_high (float voltage)

{

const float lo = 25.0;

const float lo_plat = 30.0;

const float hi_plat = 30.0;

const float hi = 30.0;

if (voltage < lo) return 0.0;

if (voltage > hi) return 1.0;

return plateauProf ile (voltage, lo, lo_plat, hi_plat, hi);

}

Усі функції належності в листингу 9.3 використовують функцію plateau-Profile, щоб побудувати графік. Кожна з них приймає значення напруги і потім повертає значення, що відповідає її ступені належності. Кожна функція спочатку перевіряє передане значення на відповідність діапазонові функції належності. Якщо значення не виходить за межі діапазону, воно передається у функцію plateauProf ile. При цьому її сигнатура задається як вектор [lo, lo_plat, hi_plat, hi], а потім користувачеві повертається результат.

Функції належності, описані в листингу 9.3, зображені на рис. 9.5.

У листингу 9.4 представлені функції належності для температури батареї.

С. 222 Листинг 9.4. Функції належності для температури батареї.

fuzzyType m_temp_cold(float temp)

{

const float lo = 15.0;

const float lo_plat = 15.0;

const float hi_plat = 15.0;

const float hi = 25.0,'

if (temp < lo) return 1.0;

if (temp > hi) return 0.0;

return plateauProf ile (temp, lo, lo_plat, hi_plat, hi);

}

fuzzyType m_voltage_low(float voltage)

{

const float lo = 5.0;

const float lo_plat = 5.0;

const float hi_plat = 5.0;

const float hi = 10.0;

if (voltage < lo) return 1.0;

if (voltage > hi) return 0.0;

return plateauProfile(voltage, lo, lo_plat, hi_plat, hi);

}

fuzzyType m_voltage_medium(float voltage)

{

const float lo = 5.0;

const float lo_plat = 10.0;

const float hi_plat = 20.0;

const float hi = 25.0;

if (voltage < lo) return 0.0;

if (voltage > hi) return 0.0;

return plateauProfile (voltage, lo, lo_plat, hi_plat, hi);

}

 

c. 223 Функція chargeControl, що керує процесом зарядки батареї

Листинг 9.5. Функція, що керує зарядкою батареї

void chargeControl ()

{

static unsigned int і = 0;

extern float voltage, temperature;

if ((i++ % 10) = = 0) {

if (normalize (m_voltage_high(voltage))) {

chargeMode = TRICKLE_CHARGE;

* timer = 0.0;

} else if (normalize(m_temp_hot (temperature))) {

chargeMode = TRICKLE_CHARGE;

*timer = 0.0;

} else if (normalize (

fuzzyAnd(

fuzzyNot (m_voltage_high (voltage)),

fuzzyNot (m_temp_hot (temperature))))){

chargeMode = FAST_CHARGE;

*timer =0.0;

}

}

}

Використовуючі правила нечіткої логіки і функції належності, функція chargeControl () в залежності від значень напруги і температури змінює режим зарядки батареї.

 

Головний цикл моделі.

Головний цикл керує процесом зарядки батареї, викоритстовуючі на заданих параметрах напруги і температури (листинг 9.6).

Листинг 9.6. Головний цикл

int main()

int i;

extern float timer;

extern int simulate(void);

extern void chargeControl(float *);

extern float voltage;

extern float temperature;

extern int chargeMode;

for (і = 0; і < 3000; і++) {

simulate ();

chargeControl(&timer);

timer += 1.0;

printf("%d, %f, %f, %d\n", i,

voltage,

temperature,

chargeMode

)

return 0;

}

Програма викликає процес зарядки/розрядки батареї, а потім дозволяє функції керування зарядкою установити потрібний режим для зарядного пристрою.

Приклад виконання коду представлений на рис. 9.7. Цей графік показує напругу, температуру і режим зарядки. Наявність вхідної напруги зарядного пристрою визначається при влученні 50% сонячного світла на сонячні батареї.

Рис. 9.7. Зміна кривих при моделюванні керування зарядкою батареї

 

 

2.7.2. Приклад керування виходом даних по каналу зв´язку

 

Базова (універсальна) безперервна множина U=60 … 140 (швидкість передачі пакетів даних по каналу зв´язку по відношенню до проектного номінального значення 100) замінюється вектором U={u1, u2} з нечіткими базовими елементами uі та відповідною лінгвістичною змінною L={L1, L2}, де

(u1 = 60…100) à(L1 = “Низька“);

(u2 = 100…140) à(L2 = “Висока“).

Функції належності µі(u) базових елементів-субмножин uі до термів Lі наведені на рис.2.8.

                                                 
   
µі(u)
 
   
 
   
 
   
Низька  
 
Висока  
 
   
U – швидкість передачі
 
   
 
     
 
   
 
 
 
 
     
 
 
 
Рис. 2.8. Функції належності базових елементів uі до термів Li для базової множини U=0,6…1,4 (швидкість передачі пакетів даних по каналу).

 

 


Дві отримані логічні функції належності µ1(u) та µ2(u) використовуються для визначення закону керування каналом

UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆,

де uСТАРЕ – поточна кількість пакетів передачі даних;

UНОВЕ – нове поточне значення кількості пакетів передачі даних, яке дозволяється пропустити через канал;

- постійний коефіцієнт, який визначає максимальну кількість пакетів, яка може бути доданою або вилученою з передачі даних.

Припустимо, що автоматизується канал, який повинен в одиницю часу передавати 100 пакетів сигналів при ∆ = 10.

Якщо отримана знижена поточна швидкість передачі пакетів даних uСТАРЕ = 90, то при µ1(u)=0,5, µ2(u)=0 програма дасть дозвіл на підвищення швидкості передачі пакетів даних до

UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆ = 90 + (0,5-0) ∙10= 95.

Якщо при наступній ітерації програма буде продовжувати працювати зі швидкістю передачі даних uСТАРЕ=95, то при µ1(u)=0,25, µ2(u)=0 програма дасть дозвіл на підвищення швидкості передачі пакетів даних до буде отриманий наступний результат

UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆ = 95 + (0,25-0) ∙10= 97,5.

Якщо отримана підвищена поточна швидкість передачі пакетів даних uСТАРЕ = 110, то при даних ∆ = 10, µ1(u)=0, µ2(u)=0,5 програма дасть дозвіл на зниження швидкості передачі пакетів даних до

UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆ = 110 + (0-0,5) ∙10= 105.

Процес буде продовжуватись, доки не буде отримане значення UНОВЕ = 100.

Таким чином, за рахунок використання функції належності, отримано простий алгоритм керування.

 



Поделиться:


Последнее изменение этой страницы: 2016-06-24; просмотров: 308; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.60.149 (0.044 с.)