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

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?ения, где она больше не ассоциируется с искусственным интеллектом.

Приложение 1

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

Код программы:

class Napryagenie

{

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

lo;

//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;

}

t;

float charge( int t )

{result;

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

(result < 0.0) result = (float)0.0;

result;

}

int simulate()

{

//extern int chargeMode;=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 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 40.0) temperature = (float)40.0;

++;

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; }

float fuzzyAnd (float a, float b)

{(a 1.0) return 0;

MAX(a, b);

}

float fuzzyOr(float a, float b)

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

}

float fuzzyNot(float a)

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

c;

}

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

{(inn >= 0.5) return 1;return 0;

}

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

{peak;

+= (-lo);

((lo < 0) && (high < 0))

{= -(high - lo);

}if ((lo 0))

{+= -lo;

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

{-= lo;

}

= (float)(high / 2.0);=(float)0.0;

(value < peak)

{(value / peak);

}if (value > peak)

{((high - value) / peak);

}

(float)1.0;

}

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

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

{upslope;downslope;

+= (-lo);

(lo < 0.0)

{_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 hi_plat) return ((hi - value) * downslope);

return (float)0.0;

}

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

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 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 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 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 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 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 hi) return (float)1.0;

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

}

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;

}

}

timer;

}

}//class

}

public partial class Form1 : Form

{Form1()

{();

}

void Form1_Load(object sender, EventArgs e)

{

}

g;[] tmpr;[] volt;[] mode;

void button1_Click(object sender, EventArgs e)

{i;

n = new Napryagenie();

s="";

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

(i = 0; i < 3000; i++)

{[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);

}

.ReadLine();

}

void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{

}

graphic

{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;

}

void drawaxes()

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

(i = 0; i < xw; i++)

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

}

(i = 0; i < yw; i++)

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

}

}//drawaxes

void drawgr(Color clr,float [] tmp)

{x,y;i;k = 0;

(i = maxx - xw; i < maxx; i++)

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

}

}//drawgr

}//graphic

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