Применение нечёткой логики на примере простой модели зарядного устройства для батарей. Дипломная (ВКР). Информационное обеспечение, программирование.

Применение нечёткой логики на примере простой модели зарядного устройства для батарей. Дипломная (ВКР). Информационное обеспечение, программирование.




💣 👉🏻👉🏻👉🏻 ВСЯ ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻


























































Информационное обеспечение, программирование

Вы можете узнать стоимость помощи в написании студенческой работы.


Помощь в написании работы, которую точно примут!

Похожие работы на - Применение нечёткой логики на примере простой модели зарядного устройства для батарей

Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе

Нужна качественная работа без плагиата?

Не нашел материал для своей работы?


Поможем написать качественную работу Без плагиата!

Федеральное
агентство по образованию


ФГАОУ
ВПО «Уральский федеральный университет имени первого Президента России Б.Н.
Ельцина»




























Применение
нечеткой логики на примере простой модели зарядного


Нечёткая
логика и её преимущества использования


Цель работы - на языке 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 < b) ? a : b; }


{(a < 0.0) return 0;(a > 1.0)
return 0;(b < 0.0) return 0;(b > 1.0) return 0;


{(a < 0.0) return 0;(a > 0.0)
return 0;(a < 0.0) return 0;(a > 0.0) return 0;MIN(a, b);


{(a < 0.0) return 0;(a > 1.0)
return 0;c = (float)1.0 - a;


Операторы нечеткой логики очень схожи с обычными
булевыми операторами. Функции принадлежности и правила нечеткой логики,
подвергнутые лингвистической модификации, позволяют значительно расширить
возможности системных операторов. Разработчики могут намного упростить
сложность систем, используя нечеткую логику, поскольку она позволяет
моделировать комплексные программы с большим количеством входов и выходов.


С помощью нечеткой логики можно добиться
снижения системных требований, а значит, сократить расходы на аппаратные
средства. Во многих случаях математическое моделирование предпочтительнее
заменить функциями принадлежности и правилами нечеткой логики и с их помощью
управлять системой.


При сокращении объемов информации размеры кода
уменьшаются, поэтому система работает быстрее. Кроме того, это позволяет
использовать менее совершенные аппаратные средства.





Зарядное устройство работает в среде, где
существует напряжение заряда (например, от солнечных батарей), и нагрузка.
Напряжение позволяет заряжать батарею, в то время как нагрузка ее разряжает.
Зарядное устройство имеет два режима работы: режим подзарядки и режим быстрой
зарядки. В режиме подзарядки в батарею поступает только очень небольшое
количество тока, что приводит к неполной зарядке батареи. В режиме быстрой зарядки
весь доступный ток направляется в зарядное устройство.


С точки зрения систем управления следует
определить, когда нужно переходить в режим быстрой зарядки, а когда - в режим
подзарядки. При зарядке температура батареи повышается. Если батарея заряжена
полностью, дополнительный ток, проходящий через нее, будет приводить к ее
нагреву. Поэтому, если батарея нагревается, можно считать, что она полностью
заряжена, а значит, следует перейти в режим подзарядки. Кроме того, можно
измерить напряжение батареи, чтобы определить, достигло ли оно предела, и затем
переключиться в режим подзарядки. Если батарея не нагрелась и не достигла
предела по напряжению, следует перейти в режим полной зарядки. Это упрощенные
правила, поскольку кривая температуры батареи является оптимальным показателем
ее зарядки.


Функции принадлежности при зарядке
батареи с помощью нечеткой логики


У нас имеется две переменные: напряжение и
температура. Графики принадлежности для напряжения и температуры (отображающие
функции принадлежности) показаны на рис. 1 и 2.





Рис. 1. График функции принадлежности для
напряжения




Рис. 2. График функции принадлежности для
температуры




При создании функции принадлежности использованы
следующие программные конструкции, которые позволяют задать границы функции
принадлежности с помощью группы значений, представляющих ее параметры.


Функции, которые используются для создания
функций принадлежности.




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


Функция, spikeProf ile, задает обычную функцию
принадлежности в виде треугольника. Задаются значения 1о и high,
которые определяют базовые вершины треугольника. Высшая
точка
задается
как
high/2.


float plateauProfile(float value,
float lo, float lo_plat,hi_plat, float hi)


{_plat -= lo; hi_plat -= lo;-= lo;
lo = 0;


}=(float) (1.0 / (lo_plat - lo));=
(float)(1.0 / (hi - hi_plat));


(value < lo) return (float)0.0;if
(value > hi) return (float)0.0;if ((value >= lo_plat) && (value
<= hi_plat)) return (float)1.0;if (value < lo_plat) return ((value - lo)
* upslope);if (value > hi_plat) return ((hi - value) * downslope);




Функция, plateauProf ile, задает функцию
принадлежности в форме трапеции (пример - функция принадлежности для
температуры на рис. 2) Затем с помощью функции plateauProfile дополнительно
создаются те функции принадлежности, которые распространяются до границ
(например, функции холодно и жарко на рис. 2). Их задача заключается в том,
чтобы определить степень принадлежности заданного значения и аргументов
функции. График функции принадлежности для напряжения определяет в области
напряжения три функции принадлежности: низкое, среднее и высокое. Аналогично
задаются три функции принадлежности для области температуры: холодно, тепло и
горячо. Эти значения используются только для демонстрации и не учитывают
какую-либо технологию производства батарей.


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




//функция принадлежности для низкого нааряжения


public float m_voltage_low(float
voltage)


{float lo = (float)5.0;float lo_plat
= (float)5.0;float hi_plat = (float)5.0;float hi = (float)10.0;


(voltage < lo) return
(float)1.0;(voltage > hi) return (float)0.0;


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


//функция принадлежности для среднего
напряженияfloat m_voltage_medium(float voltage)


{float lo = (float)5.0;float lo_plat
= (float)10.0;float hi_plat = (float)20.0;float hi = (float)25.0;


(voltage < lo) return
(float)0.0;(voltage > hi) return (float)0.0;


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


//функция
принадлежности
для
высокого
нааряженияfloat
m_voltage_high(float voltage)


{float lo = (float)25.0;float
lo_plat = (float)30.0;float hi_plat = (float)30.0;float hi = (float)30.0;


(voltage < lo) return
(float)0.0;(voltage > hi) return (float)1.0;


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


Все функции принадлежности используют функцию
plateau Profile, чтобы построить график. Каждая из них принимает значение
напряжения и затем возвращает значение, которое соответствует ее степени
принадлежности. Каждая функция сначала проверяет переданное значение на
соответствие диапазону функции принадлежности. Если значение не выходит за
рамки диапазона, оно передается в функцию plateauPro f ile . При этом ее
сигнатура задается как вектор [lo, lo__plat, hi_plat, hi], а затем пользователю
возвращается результат.


Функции принадлежности для температуры




// функция принадлежностми для высокой
температуры


public float m_temp_hot(float temp)


{float lo = (float)35.0;float
lo_plat = (float)45.0;float hi_plat = (float)45.0;float hi = (float)45.0;


(temp < lo) return
(float)0.0;(temp > hi) return (float)1.0;plateauProfile(temp, lo, lo_plat,
hi_plat, hi);


// функция принадлежностми для средней
температурыfloat m_temp_warm(float temp)


{float lo = (float)15.0;float
lo_plat = (float)25.0;float hi_plat = (float)35.0;float hi = (float)45.0;


((temp < lo) || (temp > hi))
return (float)0.0;


plateauProfile(temp, lo, lo_plat,
hi_plat, hi);


// функция принадлежностми для низкой
температурыfloat m_temp_cold(float temp)


{float lo = (float)15.0;float
lo_plat = (float)15.0;float hi_plat = (float)15.0;float hi = (float)25.0;


(temp < lo) return
(float)1.0;(temp > hi) return (float)0.0;


plateauProfile(temp, lo, lo_plat,
hi_plat, hi);


Функция управления зарядкой батареи
с помощью нечеткой логики


Как уже говорилось, зарядное устройство имеет
два режима работы: режим подзарядки и режим быстрой зарядки. Состояние батареи
отслеживают два датчика: датчик напряжения и датчик температуры. Функция
chargeControl позволяет
управлять процессом зарядки батареи.


Функция, управляющая зарядкой батареи




public float chargeControl(float
timer )


{i = 0;( (i++ % 10) == 0 ) {(
normalize(m_voltage_high(voltage)) ==1) {= TRICKLE_CHARGE;= (float)0.0;


} else if (normalize(
m_temp_hot(temperature))==1) {= TRICKLE_CHARGE;= (float)0.0;


} else if (normalize(
(fuzzyNot(m_voltage_high(voltage)),(m_temp_hot(temperature))))==1) {=
FAST_CHARGE;= (float)0.0;


Используя правила нечеткой логики и функции
принадлежности, указанная функция в зависимости от значений напряжения и
температуры изменяет режим зарядки батареи.





Наконец, главный цикл выполняет функции
управления процессом зарядки батареи, основываясь на заданных параметрах
напряжения и температуры.


void Main (object sender, EventArgs
e)


i;n = new
Napryagenie();s="";=new float[3000];= new float[3000];= new
int[3000];


{[i] = n.temperature;[i] =
n.voltage;[i] = n.ChargeMode;


.simulate();.timer =
n.chargeControl(n.timer);.timer += (float)1.0;= "Main: " + i + "
volt=" + n.voltage + " temper=" + n.temperature + "
Mode=" + n.ChargeMode;.Items.Add(s);


Программа вызывает функцию, которая эмулирует
процесс собственно зарядки и разрядки батареи, а затем позволяет функции
управления зарядкой установить нужный режим для зарядного устройства.





В результате работы над проектом была создана
модель работы зарядного устройства для батареи. Программа описывает выбор
режима зарядки, исходя из параметров напряжения и температуры, а так же выводит
графики изменения этих параметров.


Программа написана
на
Microsoft Visual C# 2010 Express Edition. Отладка
производилась в операционной системе MS Windows ХР.


На этом примере было рассмотрено применение
операторов нечёткой логики. Эти операторы используется в самых разнообразных приложениях.
Наиболее очевидная область их применения - системы управления, которым нечеткая
логика уже обеспечила коммерческий успех. Нечеткая логика используется в
устройстве видеокамер и фотоаппаратов с автофокусом, системах смешивания
цемента, автомобильных системах (например, системах АБС) и даже системах,
основанных на правилах. Наверное, самые полезные области применения все еще
остаются неизвестными. Само название «нечеткая логика» не внушает особого
доверия, хотя давно известно, что это надежный метод. Как и многие другие
методики ИИ, нечеткая логика в настоящее время все чаще используется в
устройствах повседневного применения, где она больше не ассоциируется с
искусственным интеллектом.





зарядное устройство батарея нечёткая
логика


int TRICKLE_CHARGE; //charge=заряд  0FAST_CHARGE;
//    1int ChargeMode;MAX_LOADS; //        5float voltage, temperature;float
timer;[] load;curLoad;


//constructorNapryagenie() {_CHARGE
= 0;_CHARGE = 1;= TRICKLE_CHARGE;_LOADS=5;= new float[MAX_LOADS];= 0;=
(float)12.0;= (float)0.0;= (float)20.0;
[0]=(float)0.02;[1]=(float)0.04;[2]=(float)0.06;[3]=(float)0.08;[4] =
(float)0.1;


=
(float)Math.Sin((double)((float)t/(float)100.0));


// First, update the loading if
necessary (getSRand() < 0.02) {= getRand( MAX_LOADS );


// Affect the current battery
voltage given the load -= load[curLoad];


// Next, update the battery voltage
given input charge (ChargeMode == FAST_CHARGE) {+= (charge(t) *
(float)Math.Sqrt(timer));


} else {+= ((charge(t) *
(float)Math.Sqrt(timer)) / (float)10.0 );


(voltage < 0.0) voltage =
(float)0.0;if (voltage > 35.0) voltage = (float)35.0;




// Update the temperature
(ChargeMode == FAST_CHARGE) {(voltage > 25) {+= ((load[curLoad] *
((float)Math.Sqrt(timer)/(float)25.0)) * (float)10.0);


} else if (voltage > 15) {+=
((load[curLoad] * ((float)Math.Sqrt(timer) / (float)20.0)) * (float)10.0);


} else {+= ((load[curLoad] *
((float)Math.Sqrt(timer) / (float)15.0)) *(float) 10.0);


} else {(temperature > 20.0) {-=
((load[curLoad] * ((float)Math.Sqrt(timer) / (float)20.0)) * (float)10.0);


} else {-= ((load[curLoad] *
((float)Math.Sqrt(timer) /(float) 100.0)) * (float)10.0);


(temperature < 0.0) temperature =
(float)0.0;if (temperature > 40.0) temperature = (float)40.0;


float getSRand()   {c;r=new
Random();RAND_MAX=0x7FFFFU;


=((float)r.Next()/(float)RAND_MAX);c;


int getRand(float x) { return
(int)((x) * getSRand()); }




float MAX(float a,float b)        {
return (a>b) ? a : b; }float MIN(float a, float b) { return (a < b) ? a :
b; }


{(a < 0.0) return 0;(a > 1.0)
return 0;(b < 0.0) return 0;(b > 1.0) return 0;


{(a < 0.0) return 0;(a > 0.0)
return 0;(a < 0.0) return 0;(a > 0.0) return 0;MIN(a, b);


{(a < 0.0) return 0;(a > 1.0)
return 0;c = (float)1.0 - a;


//нормализацияint
normalize(float inn)


//функция
принадлежности
в
виде
треугольникаfloat
spikeProfile (float value, float lo, float high)


// функция
принадлежности
в
виде
трапеции


float plateauProfile(float value,
float lo, float lo_plat,hi_plat, float hi)


{_plat += -lo; hi_plat += -lo;+=
-lo; lo = 0;


{_plat -= lo; hi_plat -= lo;-= lo;
lo = 0;


=(float) (1.0 / (lo_plat - lo));=
(float)(1.0 / (hi - hi_plat));


(value < lo) return (float)0.0;if
(value > hi) return (float)0.0;if ((value >= lo_plat) && (value
<= hi_plat)) return (float)1.0;if (value < lo_plat) return ((value - lo)
* upslope);if (value > hi_plat) return ((hi - value) * downslope);




// функция принадлежностми для высокой
температуры


public float m_temp_hot(float temp)


{float lo = (float)35.0;float
lo_plat = (float)45.0;float hi_plat = (float)45.0;float hi = (float)45.0;


(temp < lo) return
(float)0.0;(temp > hi) return (float)1.0;


plateauProfile(temp, lo, lo_plat,
hi_plat, hi);


// функция принадлежностми для средней
температурыfloat m_temp_warm(float temp)


{float lo = (float)15.0;float
lo_plat = (float)25.0;float hi_plat = (float)35.0;float hi = (float)45.0;


((temp < lo) || (temp > hi))
return (float)0.0;


plateauProfile(temp, lo, lo_plat,
hi_plat, hi);


// функция принадлежностми для низкой
температурыfloat m_temp_cold(float temp)


{float lo = (float)15.0;float
lo_plat = (float)15.0;float hi_plat = (float)15.0;float hi = (float)25.0;


(temp < lo) return
(float)1.0;(temp > hi) return (float)0.0;


plateauProfile(temp, lo, lo_plat,
hi_plat, hi);


//функция
принадлежности
для
низкого
нааряженияfloat
m_voltage_low(float voltage)


{float lo = (float)5.0;float lo_plat
= (float)5.0;float hi_plat = (float)5.0;float hi = (float)10.0;


(voltage < lo) return
(float)1.0;(voltage > hi) return (float)0.0;


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


//функция принадлежности для среднего
напряженияfloat m_voltage_medium(float voltage)


{float lo = (float)5.0;float lo_plat
= (float)10.0;float hi_plat = (float)20.0;float hi = (float)25.0;


(voltage < lo) return
(float)0.0;(voltage > hi) return (float)0.0;


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


//функция
принадлежности
для
высокого
нааряженияfloat
m_voltage_high(float voltage)


{float lo = (float)25.0;float
lo_plat = (float)30.0;float hi_plat = (float)30.0;float hi = (float)30.0;


(voltage < lo) return
(float)0.0;(voltage > hi) return (float)1.0;


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


( normalize(m_voltage_high(voltage))
==1) {= TRICKLE_CHARGE;= (float)0.0;


} else if (normalize(
m_temp_hot(temperature))==1) {= TRICKLE_CHARGE;= (float)0.0;


} else if (normalize(
(fuzzyNot(m_voltage_high(voltage)),(m_temp_hot(temperature))))==1) {=
FAST_CHARGE;= (float)0.0;


void Form1_Load(object sender,
EventArgs e)


void button1_Click(object sender,
EventArgs e)


=new float[3000];= new float[3000];=
new int[3000];


.timer += (float)1.0;= "Main:
" + i + " volt=" + n.voltage + " temper=" +
n.temperature + " Mode=" + n.ChargeMode;.Items.Add(s);


void
listBox1_SelectedIndexChanged(object sender, EventArgs e)


{xw, yw;gr;mx, my;minx,maxx,miny,maxy;shx,shy;


graphic(Graphics g, int mx1, int
my1, int minx1, int maxx1, int miny1, int maxy1)


{= g;= mx1; my = my1;= minx1; maxx =
maxx1; miny = miny1; maxy = maxy1;= maxx1 - minx1;= maxy1 - miny1;


{i;lrsk = 5;x = 0, y;= (float)mx /
(float)xw;= (float)my / (float)yw;


{= (float)i * shx;(i % 50 ==
0).DrawLine(new Pen(Color.Black, 1), x, my, x, my - lrsk);


{= i * shy;(i % 1 == 0).DrawLine(new
Pen(Color.Black, 1), 0, y, lrsk, y);


void drawgr(Color clr,float [] tmp)


{= k++ * shx;= tmp[i] *
shy;.DrawEllipse(new Pen(clr, 1), x, my - y, 1, 1);


void button2_Click(object sender,
EventArgs e)


{= panel1.CreateGraphics();gra=new
graphic(g,panel1.Width,panel1.Height,0,3000,0,50);.drawaxes();.drawgr(Color.Green,
tmpr);.drawgr(Color.Red, volt);



Похожие работы на - Применение нечёткой логики на примере простой модели зарядного устройства для батарей Дипломная (ВКР). Информационное обеспечение, программирование.
Начало Сочинения Разговор С Собой
Курсовая Работа На Тему Гражданство В Российской Федерации: Конституционно-Правовое Регулирование, Основания Приобретения И Прекращения
Контрольная Работа На Тему Принципы Расчета Выпрямителя Для Электропривода Постоянного Тока
Реферат На Тему Овощные Культуры
Анализ стихотворения А.А. Фета «Добро и зло»
Сочинение На Тему Деловое Общение
Реферат по теме Хозяйственная деяельность в словиях рыночной экономики
Сочинение: Жанровое своеобразие Чеховских пьес
Какие Люди Остаются В Истории Сочинение Вступление
Сочинение По Картине Островского Золотая Осень
Реферат: Основи військової топографії та туризму 2
Курсовая работа: Факторы формирования социально-психологического климата в строительных бригадах
Сочинение Описание Любимого Уголка Природы 9 Класс
Реферат: Descartes Meditations Essay Research Paper Analyze in
Дипломная Работа На Тему Разделение Власти
Эссе Теории Эмоций
Реферат: Анализ обеспеченности основными средствами перерабатывающих предприятий агропромышленного компле
Курсовая работа по теме Анализ линейных электрических цепей в установившемся и переходном режимах
Курсовая работа по теме Особенности назначения и проведения судебно-медицинской экспертизы
Курсовая работа: Носії інформації
Похожие работы на - Aнaлиз кpeдитocпocoбнocти и плaтeжecпocoбнocти пpeдпpиятия
Реферат: Классификация регионов РФ по природным условиям
Доклад: Государев дьяк (Иван Григорьевич Выродков)

Report Page