Федеральне агентство з освіти
ФГАОУ ВПО В«Уральський федеральний університет імені першого Президента Росії Б.Н. Єльцина В»
ПОЯСНЮВАЛЬНА ЗАПИСКА
Застосування нечіткої логіки на прикладі простої моделі зарядного
пристрої для батарей
Єкатеринбург
2010
Зміст
Постановка завдання
Нечітка логіка і її переваги використання
Опис проекту
Висновки
Додаток 1
Додаток 2
Постановка завдання
Мета роботи - на мові Microsoft Visual C # 2010 Express Edition створити модель роботи зарядного пристрою для батарей із застосуванням операторів нечіткої логіки. І відобразити графіки зміни напруги і температури в різних режимах зарядки.
Нечітка логіка та її переваги використання
Нечітка логіка (Fuzzy logic) була розроблена в 1963 р. Лотфі Заде (Lotfi Zadeh). Ця логічна система була придумана для того, щоб дозволити програмам працювати в діапазоні різних ступенів істини. Замість двійкових систем, що відображають лише істину і брехню, були введені ступеня істини, які діють в діапазоні від 0,0 до 1,0 включно.
Оператори нечіткої логіки
Аналогічно булевої логіки, нечітка логіка має набір базових операторів, вони збігаються з булевими, але діють по-іншому. Ці оператори забезпечують основу для операцій нечіткої логіки.
Формула обчислення
public float MAX (float a, float b) {return (a> b)? a: b;}
public float MIN (float a, float b) {return (a
public float fuzzyAnd (float a, float b)
{
if (a <0.0) return 0;
if (a> 1.0) return 0;
if (b <0.0) return 0;
if (b> 1.0) return 0;
return MAX (a, b);
}
public float fuzzyOr (float a, float b)
{
if (a <0.0) return 0;
if (a> 0.0) return 0;
if (a <0.0) return 0;
if (a> 0.0) return 0;
return MIN (a, b);
}
public float fuzzyNot (float a)
{
if (a <0.0) return 0;
if (a> 1.0) return 0;
float c = (Float) 1.0 - a;
return c;
}
Оператори нечіткої логіки дуже схожі з звичайними булевими операторами. Функції належності і правила нечіткої логіки, піддані лінгвістичної модифікації, дозволяють значно розширити можливості системних операторів. Розробники можуть набагато спростити складність систем, використовуючи нечітку логіку, оскільки вона дозволяє моделювати комплексні програми з великим кількістю входів і виходів.
За допомогою нечіткої логіки можна домогтися зниження системних вимог, а значить, скоротити витрати на апаратні засоби. У багатьох випадках математичне моделювання переважніше замінити функціями приналежності і правилами нечіткої логіки та з їхньою допомогою управляти системою.
При скороченні обсягів інформації розміри коду зменшуються, тому система працює швидше. Крім того, це дозволяє використовувати менш досконалі апаратні засоби.
Опис проекту
Зарядний пристрій працює в середовищі, де існує напруга заряду (Наприклад, від сонячних батарей), і навантаження. Напруга дозволяє заряджати батарею, в той час як навантаження її розряджає. Зарядний пристрій має два режими роботи: режим підзарядки і режим швидкої зарядки. У режимі підзарядки в батарею надходить тільки дуже невелика кількість струму, що призводить до неповної зарядці батареї. У режимі швидкої зарядки весь доступний струм направляється в зарядний пристрій.
З точки зору систем управління слід визначити, коли потрібно переходити в режим швидкої зарядки, а коли - в режим підзарядки. При зарядці температура батареї підвищується. Якщо батарея заряджена повністю, додатковий струм, що проходить через неї, буде приводити до її нагрівання. Тому, якщо батарея нагрівається, можна вважати, що вона повністю заряджена, а значить, слід перейти в режим підзарядки. Крім того, можна виміряти напругу батареї, щоб визначити, чи досягло воно межі, і потім перемкнутися в режим підзарядки. Якщо батарея не нагрілася і не досягла межі по напрузі, слід перейти в режим повної зарядки. Це спрощені правила, оскільки крива температури батареї є оптимальним показником її зарядки.
Функції належності при зарядці батареї за допомогою нечіткої логіки
У нас є дві змінні: напруга і температура. Графіки приналежності для напруги і температури (відображають функції приналежності) показані на рис. 1 і 2.
Рис. 1. Графік функції приналежності для напруги
Рис. 2. Графік функції приналежності для температури
При створенні функції приналежності використані наступні програмні конструкції, які дозволяють задати межі функції приналежності за допомогою групи значень, що представляють її параметри.
Функції, які використовуються для створення функцій приналежності.
public float spikeProfile (float value, float lo, float high)
{
float peak;
value + = (-Lo);
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 = (Float) (high/2.0);
lo = (Float) 0.0;
if (value
{
return (Value/peak);
}
else if (Value> peak)
{
return ((High - value)/peak);
}
return (Float) 1.0;
Функція, spikeProf ile, задає звичайну функцію належності у вигляді трикутника. Задаються значення 1о і high, які визначають базові вершини трикутника. Найвища точка задається як high/2.
public float plateauProfile (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 = (Float) (1.0/(lo_plat - lo));
downslope = (Float) (1.0/(hi - hi_plat));
if (value
else if (Value> hi) return (float) 0.0;
else if ((Value> = lo_plat) && (value <= hi_plat)) return (float) 1.0;
else if (Value
else if (Value> hi_plat) return ((hi - value) * downslope);
return (float) 0.0;
}
Функція, plateauProf ile, задає функцію приналежності у формі трапеції (приклад - функція належності для температури на рис. 2) Потім за допомогою функції plateauProfile додатково створюються ті функції приналежності, які поширюються до кордонів (наприклад, функції холодно і жарко на рис. 2). Їхнє завдання полягає в тому, щоб визначити ступінь приналежності заданого значення і аргументів функції. Графік функції приналежності для напруги визначає в області напруги три функції приналежності: низька, середня і високе. Аналогічно задаються три функції приналежності для області температури: холодно, тепло і гаряче. Ці значення використовуються тільки для демонстрації і не враховують-яку технологію виробництва батарей.
Функції приналежності для напруги
// функція приналежності для низького нааряженія
public float m_voltage_low (float voltage)
{
const float lo = (float) 5.0;
const float lo_plat = (float) 5.0;
const float hi_plat = (float) 5.0;
const float hi = (float) 10.0;
if (voltage
if (voltage> Hi) return (fl...