Реферат по предмету "Информатика, программирование"


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

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

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
Применение нечеткой логики на примере простой моделизарядного
устройства для батарей
Екатеринбург
2010

Содержание
 
Постановказадачи
Нечёткая логикаи её преимущества использования
Описание проекта
Выводы
Приложение 1
Приложение 2

Постановка задачи
 
Цель работы – на языке MicrosoftVisual 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; }
publicfloat MIN(float a, float b) { return (a
publicfloat fuzzyAnd (float a, float b)
{
if (a
if (a >1.0) return 0;
if (b
if (b >1.0) return 0;
returnMAX(a, b);
}
publicfloat fuzzyOr(float a, float b)
{
if (a
if (a >0.0) return 0;
if (a
if (a >0.0) return 0;
returnMIN(a, b);
}
publicfloat fuzzyNot(float a)
{
if (a
if (a >1.0) return 0;
float c =(float)1.0 — a;
return c;
}
Операторы нечеткой логики очень схожи с обычными булевыми операторами.Функции принадлежности и правила нечеткой логики, подвергнутые лингвистическоймодификации, позволяют значительно расширить возможности системных операторов.Разработчики могут намного упростить сложность систем, используя нечеткуюлогику, поскольку она позволяет моделировать комплексные программы с большимколичеством входов и выходов.
С помощью нечеткой логики можно добиться снижения системных требований, азначит, сократить расходы на аппаратные средства. Во многих случаяхматематическое моделирование предпочтительнее заменить функциями принадлежностии правилами нечеткой логики и с их помощью управлять системой.
При сокращении объемов информации размеры кода уменьшаются, поэтомусистема работает быстрее. Кроме того, это позволяет использовать менее совершенныеаппаратные средства.

Описание проекта
Зарядное устройство работает в среде, где существует напряжение заряда(например, от солнечных батарей), и нагрузка. Напряжение позволяет заряжатьбатарею, в то время как нагрузка ее разряжает. Зарядное устройство имеет дварежима работы: режим подзарядки и режим быстрой зарядки. В режиме подзарядки вбатарею поступает только очень небольшое количество тока, что приводит кнеполной зарядке батареи. В режиме быстрой зарядки весь доступный токнаправляется в зарядное устройство.
С точки зрения систем управления следует определить, когда нужнопереходить в режим быстрой зарядки, а когда — в режим подзарядки. При зарядкетемпература батареи повышается. Если батарея заряжена полностью, дополнительныйток, проходящий через нее, будет приводить к ее нагреву. Поэтому, если батареянагревается, можно считать, что она полностью заряжена, а значит, следуетперейти в режим подзарядки. Кроме того, можно измерить напряжение батареи,чтобы определить, достигло ли оно предела, и затем переключиться в режимподзарядки. Если батарея не нагрелась и не достигла предела по напряжению,следует перейти в режим полной зарядки. Это упрощенные правила, посколькукривая температуры батареи является оптимальным показателем ее зарядки.
Функции принадлежности при зарядке батареи с помощью нечеткойлогики
У нас имеется две переменные: напряжение и температура. Графикипринадлежности для напряжения и температуры (отображающие функциипринадлежности) показаны на рис. 1 и 2.

/>
Рис. 1. График функции принадлежности для напряжения
/>
Рис. 2. График функции принадлежности для температуры
При создании функции принадлежности использованы следующие программныеконструкции, которые позволяют задать границы функции принадлежности с помощьюгруппы значений, представляющих ее параметры.
Функции, которые используются для создания функций принадлежности.
publicfloat spikeProfile (float value, float lo, float high)
{
float peak;
value +=(-lo);
 
if ((lo
{
high =-(high — lo);
}
else if((lo 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.
publicfloat plateauProfile(float value, float lo, float lo_plat,
floathi_plat, float hi)
{
floatupslope;
floatdownslope;
value +=(-lo);
if (lo
{
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
else if(value
else if(value > hi_plat) return ((hi — value) * downslope);
return (float)0.0;
}
Функция, plateauProf ile, задает функциюпринадлежности в форме трапеции (пример — функция принадлежности длятемпературы на рис. 2) Затем с помощьюфункции plateauProfile дополнительно создаются те функции принадлежности,которые распространяются до границ (например, функции холодно и жарко на рис. 2).Их задача заключается в том, чтобы определить степень принадлежности заданногозначения и аргументов функции. График функции принадлежности для напряженияопределяет в области напряжения три функции принадлежности: низкое, среднее ивысокое. Аналогично задаются три функции принадлежности для областитемпературы: холодно, тепло и горячо. Эти значения используются только для демонстрациии не учитывают какую-либо технологию производства батарей.
Функции принадлежности для напряжения
//функцияпринадлежности для низкого нааряжения
publicfloat m_voltage_low(float voltage)
{
const floatlo = (float)5.0;
const floatlo_plat = (float)5.0;
const floathi_plat = (float)5.0;
const floathi = (float)10.0;
if (voltage
if (voltage> hi) return (float)0.0;
returnplateauProfile(voltage, lo, lo_plat, hi_plat, hi);
}
//функцияпринадлежности для среднего напряжения
public floatm_voltage_medium(float voltage)
{
const floatlo = (float)5.0;
const floatlo_plat = (float)10.0;
const floathi_plat = (float)20.0;
const floathi = (float)25.0;
if (voltage
if (voltage> hi) return (float)0.0;
returnplateauProfile(voltage, lo, lo_plat, hi_plat, hi);
}
//функция принадлежности для высокого нааряжения
publicfloat m_voltage_high(float voltage)
{
const floatlo = (float)25.0;
const floatlo_plat = (float)30.0;
const floathi_plat = (float)30.0;
const floathi = (float)30.0;
if (voltage
if (voltage> hi) return (float)1.0;
returnplateauProfile(voltage, lo, lo_plat, hi_plat, hi);
}
Все функции принадлежности используют функцию plateau Profile, чтобыпостроить график. Каждая из них принимает значение напряжения и затемвозвращает значение, которое соответствует ее степени принадлежности. Каждаяфункция сначала проверяет переданное значение на соответствие диапазону функциипринадлежности. Если значение не выходит за рамки диапазона, оно передается вфункцию plateauPro f ile. При этом ее сигнатура задается как вектор [lo,lo__plat, hi_plat, hi], а затем пользователю возвращается результат.
Функции принадлежности для температуры
// функцияпринадлежностми для высокой температуры
publicfloat m_temp_hot(float temp)
{
const floatlo = (float)35.0;
const floatlo_plat = (float)45.0;
const floathi_plat = (float)45.0;
const floathi = (float)45.0;
if (temp
if (temp> hi) return (float)1.0;
return plateauProfile(temp,lo, lo_plat, hi_plat, hi);
}
// функцияпринадлежностми для средней температуры
public floatm_temp_warm(float temp)
{
const floatlo = (float)15.0;
const floatlo_plat = (float)25.0;
const floathi_plat = (float)35.0;
const floathi = (float)45.0;
if ((temp hi)) return (float)0.0;
returnplateauProfile(temp, lo, lo_plat, hi_plat, hi);
}
// функцияпринадлежностми для низкой температуры
public floatm_temp_cold(float temp)
{
const floatlo = (float)15.0;
const floatlo_plat = (float)15.0;
const floathi_plat = (float)15.0;
const floathi = (float)25.0;
if (temp
if (temp> hi) return (float)0.0;
returnplateauProfile(temp, lo, lo_plat, hi_plat, hi);
}

Функция управления зарядкой батареи с помощьюнечеткой логики
 
Как уже говорилось, зарядное устройство имеет два режима работы: режимподзарядки и режим быстрой зарядки. Состояние батареи отслеживают два датчика:датчик напряжения и датчик температуры. Функция chargeControlпозволяет управлять процессом зарядки батареи.
Функция, управляющая зарядкой батареи
public floatchargeControl(float timer )
{
int i = 0;
if ( (i++ %10) == 0 ) {
if (normalize(m_voltage_high(voltage)) ==1) {
ChargeMode= TRICKLE_CHARGE;
timer =(float)0.0;
} else if(normalize( m_temp_hot(temperature))==1) {
ChargeMode= TRICKLE_CHARGE;
timer =(float)0.0;
} else if(normalize(
fuzzyAnd(fuzzyNot(m_voltage_high(voltage)),
fuzzyNot(m_temp_hot(temperature))))==1){
ChargeMode= FAST_CHARGE;
timer =(float)0.0;
}
}
Используя правила нечеткой логики и функции принадлежности, указаннаяфункция в зависимости от значений напряжения и температуры изменяет режимзарядки батареи.

Главный цикл модели
Наконец, главный цикл выполняет функции управления процессом зарядкибатареи, основываясь на заданных параметрах напряжения и температуры.
Главный цикл
privatevoid Main (object sender, EventArgs e)
int i;
Napryagenien = new Napryagenie();
strings="";
tmpr=newfloat[3000];
volt = newfloat[3000];
mode = newint[3000];
for (i = 0;i
{
tmpr[i] =n.temperature;
volt[i] =n.voltage;
mode[i] =n.ChargeMode;
n.simulate();
n.timer =n.chargeControl(n.timer);
n.timer +=(float)1.0;
s =«Main: » + i + " volt=" + n.voltage + " temper="+ n.temperature + " Mode=" + n.ChargeMode;
listBox1.Items.Add(s);
}
Console.ReadLine();
}
Программа вызывает функцию, которая эмулирует процесс собственно зарядкии разрядки батареи, а затем позволяет функции управления зарядкой установитьнужный режим для зарядного устройства.

Вывод
В результате работы над проектом была создана модель работы зарядногоустройства для батареи. Программа описывает выбор режима зарядки, исходя изпараметров напряжения и температуры, а так же выводит графики изменения этихпараметров.
Программа написана на Microsoft Visual C# 2010Express Edition. Отладка производилась в операционной системе MSWindows ХР.
На этом примере было рассмотрено применение операторов нечёткой логики. Этиоператоры используется в самых разнообразных приложениях. Наиболее очевиднаяобласть их применения — системы управления, которым нечеткая логика ужеобеспечила коммерческий успех. Нечеткая логика используется в устройствевидеокамер и фотоаппаратов с автофокусом, системах смешивания цемента,автомобильных системах (например, системах АБС) и даже системах, основанных направилах. Наверное, самые полезные области применения все еще остаютсянеизвестными. Само название «нечеткая логика» не внушает особого доверия, хотядавно известно, что это надежный метод. Как и многие другие методики ИИ,нечеткая логика в настоящее время все чаще используется в устройствахповседневного применения, где она больше не ассоциируется с искусственныминтеллектом.

Приложение 1
зарядное устройство батарея нечёткая логика
Код программы:
class Napryagenie
{
intTRICKLE_CHARGE; //charge=заряд 0
intFAST_CHARGE; // 1
public intChargeMode;
intMAX_LOADS; //     5
publicfloat voltage, temperature;
publicfloat timer;
float[]load;
intcurLoad;
float lo;
//constructor
publicNapryagenie() {
TRICKLE_CHARGE= 0;
FAST_CHARGE= 1;
ChargeMode= TRICKLE_CHARGE;
MAX_LOADS=5;
load = newfloat[MAX_LOADS];
curLoad =0;
temperature= (float)12.0;
timer =(float)0.0;
voltage =(float)20.0;
load[0]=(float)0.02;
load[1]=(float)0.04;
load[2]=(float)0.06;
load[3]=(float)0.08;
load[4] =(float)0.1;
}
int t;
publicfloat charge( int t )
{
floatresult;
result =(float)Math.Sin((double)((float)t/(float)100.0));
if (result
returnresult;
}
public intsimulate()
{
//externint chargeMode;
t=0;
// First,update the loading if necessary
if(getSRand()
curLoad =getRand( MAX_LOADS );
}
// Affectthe current battery voltage given the load
voltage -=load[curLoad];
// Next,update the battery voltage given input charge
if(ChargeMode == FAST_CHARGE) {
voltage +=(charge(t) * (float)Math.Sqrt(timer));
} else {
voltage +=((charge(t) * (float)Math.Sqrt(timer)) / (float)10.0 );
}
if (voltage
else if(voltage > 35.0) voltage = (float)35.0;
// Updatethe temperature
if(ChargeMode == FAST_CHARGE) {
if (voltage> 25) {
temperature+= ((load[curLoad] * ((float)Math.Sqrt(timer)/(float)25.0)) * (float)10.0);
} else if(voltage > 15) {
temperature+= ((load[curLoad] * ((float)Math.Sqrt(timer) / (float)20.0)) * (float)10.0);
} else {
temperature+= ((load[curLoad] * ((float)Math.Sqrt(timer) / (float)15.0)) *(float) 10.0);
}
} else {
if (temperature> 20.0) {
temperature-= ((load[curLoad] * ((float)Math.Sqrt(timer) / (float)20.0)) * (float)10.0);
} else {
temperature-= ((load[curLoad] * ((float)Math.Sqrt(timer) /(float) 100.0)) * (float)10.0);
}
}
if (temperature
else if(temperature > 40.0) temperature = (float)40.0;
t++;
return 0;
}
publicfloat getSRand() {
float c;
Randomr=new Random();
uintRAND_MAX=0x7FFFFU;
c=((float)r.Next()/(float)RAND_MAX);
return c;
}
public intgetRand(float x) { return (int)((x) * getSRand()); }
publicfloat MAX(float a,float b)     { return (a>b)? a: b; }
publicfloat MIN(float a, float b) { return (a
publicfloat fuzzyAnd (float a, float b)
{
if (a
if (a >1.0) return 0;
if (b
if (b >1.0) return 0;
returnMAX(a, b);
}
publicfloat fuzzyOr(float a, float b)
{
if (a
if (a >0.0) return 0;
if (a
if (a >0.0) return 0;
returnMIN(a, b);
}
publicfloat fuzzyNot(float a)
{
if (a
if (a >1.0) return 0;
float c =(float)1.0 — a;
return c;
}
//нормализация
public intnormalize(float inn)
{
if (inn>= 0.5) return 1;
else return0;
}
//функция принадлежности в виде треугольника
publicfloat spikeProfile (float value, float lo, float high)
{
float peak;
value +=(-lo);
if ((lo
{
high =-(high — lo);
}
else if((lo 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;
}
// функция принадлежности в виде трапеции
publicfloat plateauProfile(float value, float lo, float lo_plat,
floathi_plat, float hi)
{
floatupslope;
floatdownslope;
value +=(-lo);
if (lo
{
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
else if(value
else if(value > hi_plat) return ((hi — value) * downslope);
return (float)0.0;
}
// функцияпринадлежностми для высокой температуры
publicfloat m_temp_hot(float temp)
{
const floatlo = (float)35.0;
const floatlo_plat = (float)45.0;
const floathi_plat = (float)45.0;
const floathi = (float)45.0;
if (temp
if (temp> hi) return (float)1.0;
returnplateauProfile(temp, lo, lo_plat, hi_plat, hi);
}
// функция принадлежностмидля средней температуры
public floatm_temp_warm(float temp)
{
const floatlo = (float)15.0;
const floatlo_plat = (float)25.0;
const floathi_plat = (float)35.0;
const floathi = (float)45.0;
if ((temp hi)) return (float)0.0;
returnplateauProfile(temp, lo, lo_plat, hi_plat, hi);
}
// функцияпринадлежностми для низкой температуры
public floatm_temp_cold(float temp)
{
const floatlo = (float)15.0;
const floatlo_plat = (float)15.0;
const floathi_plat = (float)15.0;
const floathi = (float)25.0;
if (temp
if (temp> hi) return (float)0.0;
returnplateauProfile(temp, lo, lo_plat, hi_plat, hi);
}
//функция принадлежности для низкого нааряжения
publicfloat m_voltage_low(float voltage)
{
const floatlo = (float)5.0;
const floatlo_plat = (float)5.0;
const floathi_plat = (float)5.0;
const floathi = (float)10.0;
if (voltage
if (voltage> hi) return (float)0.0;
returnplateauProfile(voltage, lo, lo_plat, hi_plat, hi);
}
//функцияпринадлежности для среднего напряжения
public floatm_voltage_medium(float voltage)
{
const floatlo = (float)5.0;
const floatlo_plat = (float)10.0;
const floathi_plat = (float)20.0;
const floathi = (float)25.0;
if (voltage
if (voltage> hi) return (float)0.0;
returnplateauProfile(voltage, lo, lo_plat, hi_plat, hi);
}
//функция принадлежности для высокого нааряжения
publicfloat m_voltage_high(float voltage)
{
const floatlo = (float)25.0;
const floatlo_plat = (float)30.0;
const floathi_plat = (float)30.0;
const floathi = (float)30.0;
if (voltage
if (voltage> hi) return (float)1.0;
returnplateauProfile(voltage, lo, lo_plat, hi_plat, hi);
}
publicfloat chargeControl(float timer )
{
int i = 0;
if ( (i++ %10) == 0 ) {
if (normalize(m_voltage_high(voltage)) ==1) {
ChargeMode= TRICKLE_CHARGE;
timer =(float)0.0;
} else if(normalize( m_temp_hot(temperature))==1) {
ChargeMode= TRICKLE_CHARGE;
timer =(float)0.0;
} else if(normalize(
fuzzyAnd(fuzzyNot(m_voltage_high(voltage)),
fuzzyNot(m_temp_hot(temperature))))==1){
ChargeMode= FAST_CHARGE;
timer =(float)0.0;
}
}
returntimer;
}
}//class
}
publicpartial class Form1: Form
{
publicForm1()
{
InitializeComponent();
}
privatevoid Form1_Load(object sender, EventArgs e)
{
}
Graphics g;
float []tmpr;
float []volt;
int []mode;
privatevoid button1_Click(object sender, EventArgs e)
{
int i;
Napryagenien = new Napryagenie();
strings="";
tmpr=newfloat[3000];
volt = newfloat[3000];
mode = newint[3000];
for (i = 0;i
{
tmpr[i] =n.temperature;
volt[i] =n.voltage;
mode[i] =n.ChargeMode;
n.simulate();
n.timer =n.chargeControl(n.timer);
n.timer +=(float)1.0;
s =«Main: » + i + " volt=" + n.voltage + " temper="+ n.temperature + " Mode=" + n.ChargeMode;
listBox1.Items.Add(s);
}
Console.ReadLine();
}
privatevoid listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
classgraphic
{
int xw, yw;
Graphicsgr;
int mx, my;
intminx,maxx,miny,maxy;
floatshx,shy;
publicgraphic(Graphics g, int mx1, int my1, int minx1, int maxx1, int miny1, intmaxy1)
{
gr = g;
mx = mx1;my = my1;
minx =minx1; maxx = maxx1; miny = miny1; maxy = maxy1;
xw = maxx1- minx1;
yw = maxy1- miny1;
}
public voiddrawaxes()
{
int i;
int lrsk =5;
float x =0, y;
shx =(float)mx / (float)xw;
shy =(float)my / (float)yw;
for (i = 0;i
{
x =(float)i * shx;
if (i % 50== 0)
gr.DrawLine(newPen(Color.Black, 1), x, my, x, my — lrsk);
}
for (i = 0;i
{
y = i *shy;
if (i % 1== 0)
gr.DrawLine(newPen(Color.Black, 1), 0, y, lrsk, y);
}
}//drawaxes
public voiddrawgr(Color clr,float [] tmp)
{
float x,y;
int i;
int k = 0;
for (i =maxx — xw; i
{
x = k++ *shx;
y = tmp[i]* shy;
gr.DrawEllipse(newPen(clr, 1), x, my — y, 1, 1);
}
}//drawgr
}//graphic
privatevoid button2_Click(object sender, EventArgs e)
{
g =panel1.CreateGraphics();
graphicgra=new graphic(g,panel1.Width,panel1.Height,0,3000,0,50);
gra.drawaxes();
gra.drawgr(Color.Green,tmpr);
gra.drawgr(Color.Red,volt);
}
}

Приложение 2
/>


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Мокли Джон Уильям (Mauchly John William)
Реферат "Учет в банках". Тема: "Понятие и характеристика платежных инструментов. Учет операций с их использованием"
Реферат Гра "Арканоід" на основі XNA Framework
Реферат Становление школы с этнокультурным компонентом
Реферат Адвокатура РФ
Реферат Кодирование чисел, символов и графической информации , единицы измерения данных
Реферат Психолого педагогические аспекты решения проблем межличностных отношений подростков
Реферат Научный метод познания. Антропный принцип
Реферат Биологически активные добавки к пище при коррекции массы тела и лечении атеросклероза
Реферат Радиотелеметрические системы с временным разделением каналов
Реферат Роль высших растений в почвообразовании (шпаргалка)
Реферат Наркотична залежність
Реферат 14. 00 на площадке установлена сцена, работает диджей, звучит русская народная музыка
Реферат Астрономия в художественных произведениях
Реферат Общетиповая методика прогнозирования социальных процессов Исследование будущего России