Реферати українською » Информатика, программирование » Застосування нечіткої логіки на прикладі простої моделі зарядного пристрою для батарей


Реферат Застосування нечіткої логіки на прикладі простої моделі зарядного пристрою для батарей

Федеральне агентство за освітою

>ФГАОУВПО «Уральський федеральний університет імені першого президента Росії Б.М. Єльцина»


>ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

Застосування нечіткою логіки з прикладу простий моделі зарядного

устрою для батарей

Єкатеринбург

2010


Зміст

 

Постановка завдання

>Нечеткая і її переваги використання

Опис проекту

Висновки

Додаток 1

Додаток 2


Постановка завдання

 

Мета роботи – мовою MicrosoftVisual З# 2010 ExpressEdition створити модель роботи зарядного устрою для батарей із застосуванням операторівнечеткой логіки. І відобразити графіки зміни напруження і температури у різних режимах зарядки.


>Нечеткая і її переваги використання

 

>Нечеткая логіка (>Fuzzylogic) була розроблена 1963 р.ЛотфиЗаде (>LotfiZadeh). Ця логічна систему було придумана у тому, аби дозволити програмам працювати у діапазоні різних ступенів істини. Замість двійкових систем, які відбивають лише істину і брехня, ввели ступеня істини, що діють у діапазоні від 0,0 до 1,0 включно.

Оператори нечіткою логіки

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

Формула обчислення

publicfloatMAX(floata,float b) {return (>a>b) ? a : b; }

publicfloatMIN(float a,float b) {return (a < b) ? a : b; }

publicfloatfuzzyAnd (>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;

>returnMAX(a, b);

}

publicfloatfuzzyOr(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;

>returnMIN(a, b);

}

publicfloatfuzzyNot(float a)

{

>if (a < 0.0)return 0;

>if (a > 1.0)return 0;

>float з = (>float)1.0 - a;

>return з;

}

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

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

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


Опис проекту

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

З погляду системам управління слід визначити, коли не потрібно переходити в режим швидкої зарядки, а коли - в режим підзарядки. При зарядку температура батареї підвищується. Якщо батарея заряджено повністю, додатковий струм, проходить неї, буде спричинить її нагріванню. Тому, якщо батарея нагрівається, вважатимуться, що вона цілком заряджено, отже, слід перейти в режим підзарядки. З іншого боку, можна виміряти напруга батареї, щоб визначити, досягло воно краю, і далі переключитися в режим підзарядки. Якщо батарея не нагрілася і сягнула межі за напругою, слід перейти в режим повної зарядки. Це спрощені правила, оскільки крива температури батареї є оптимальним показником її зарядки.

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

Ми маємо дві перемінні: напруга й температура. Графіки приналежності для напруження і температури (які відображатимуть функції приналежності) показані на рис. 1 і 2.


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

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

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

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

publicfloatspikeProfile (>floatvalue,floatlo,float high)

{

>floatpeak;

>value += (->lo);

 

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

{

high = -(high -lo);

}

>elseif ((>lo < 0) && (high > 0))

{

high += ->lo;

}

>elseif ((>lo > 0) && (high > 0))

{

high -=lo;

}

>peak = (>float)(high / 2.0);

>lo =(>float)0.0;

>if (>value <peak)

{

>return (>value /peak);

}

>elseif (>value >peak)

{

>return ((high -value) /peak);

}

>return (>float)1.0;

Функція,spikeProfile, задає звичайну функцію приналежності як трикутника.Задаются значення1о і high, які визначають базові вершини трикутника. Вища точка задається якhigh/2.

publicfloatplateauProfile(floatvalue,floatlo,floatlo_plat,

>floathi_plat,floathi)

{

>floatupslope;

>floatdownslope;

>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 <lo)return (>float)0.0;

>elseif (>value >hi)return (>float)0.0;

>elseif ((>value >=lo_plat) && (>value <=hi_plat))return (>float)1.0;

>elseif (>value <lo_plat)return ((>value -lo) *upslope);

>elseif (>value >hi_plat)return ((>hi -value) *downslope);

>return (>float)0.0;

}

Функція,plateauProfile, задає функцію приналежності у вигляді трапеції (приклад - функція приналежності для температури на рис. 2) Потім із допомогою функціїplateauProfile додатково створюються ті функції приналежності, які поширюються розширюється до кордонів (наприклад, функції зимно й спекотно на рис. 2). Їх завдання у тому, щоб визначити рівень приналежності заданого значення й аргументів функції. Графік функції приналежності для напруги визначає області напруги три функції приналежності: низька, середнє і високе. Аналогічно задаються три функції приналежності області температури: холодно, тепла і палко. Ці значення задіяні лише підтвердження і враховують якусь технологію виробництва батарей.

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

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

publicfloatm_voltage_low(floatvoltage)

{

>constfloatlo = (>float)5.0;

>constfloatlo_plat = (>float)5.0;

>constfloathi_plat = (>float)5.0;

>constfloathi = (>float)10.0;

>if (>voltage <lo)return (>float)1.0;

>if (>voltage >hi)return (>float)0.0;

>returnplateauProfile(voltage,lo,lo_plat,hi_plat,hi);

}

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

publicfloatm_voltage_medium(floatvoltage)

{

>constfloatlo = (>float)5.0;

>constfloatlo_plat = (>float)10.0;

>constfloathi_plat = (>float)20.0;

>constfloathi = (>float)25.0;

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

>if (>voltage >hi)return (>float)0.0;

>returnplateauProfile(voltage,lo,lo_plat,hi_plat,hi);

}

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

publicfloatm_voltage_high(floatvoltage)

{

>constfloatlo = (>float)25.0;

>constfloatlo_plat = (>float)30.0;

>constfloathi_plat = (>float)30.0;

>constfloathi = (>float)30.0;

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

>if (>voltage >hi)return (>float)1.0;

>returnplateauProfile(voltage,lo,lo_plat,hi_plat,hi);

}

Усі функції приналежності використовують функціюplateauProfile, щоб побудувати графік. Кожна вживає значення напруження і потім повертає значення, яке відповідає її ступеня приналежності. Кожна функція спочатку перевіряє передане значення щодо відповідності діапазону функції приналежності. Якщо значення теж не виходить далеко за межі діапазону, воно передається до функційplateauProfile . У цьому її сигнатура задається як вектор [>lo,lo__plat,hi_plat,hi], та був користувачеві повертається результат.

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

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

publicfloatm_temp_hot(floattemp)

{

>constfloatlo = (>float)35.0;

>constfloatlo_plat = (>float)45.0;

>constfloathi_plat = (>float)45.0;

>constfloathi = (>float)45.0;

>if (>temp <lo)return (>float)0.0;

>if (>temp >hi)return (>float)1.0;

>returnplateauProfile(temp,lo,lo_plat,hi_plat,hi);

}

// функціяпринадлежностми для середньої температури

publicfloatm_temp_warm(floattemp)

{

>constfloatlo = (>float)15.0;

>constfloatlo_plat = (>float)25.0;

>constfloathi_plat = (>float)35.0;

>constfloathi = (>float)45.0;

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

>returnplateauProfile(temp,lo,lo_plat,hi_plat,hi);

}

// функціяпринадлежностми для низькою температури

publicfloatm_temp_cold(floattemp)

{

>constfloatlo = (>float)15.0;

>constfloatlo_plat = (>float)15.0;

>constfloathi_plat = (>float)15.0;

>constfloathi = (>float)25.0;

>if (>temp <lo)return (>float)1.0;

>if (>temp >hi)return (>float)0.0;

>returnplateauProfile(temp,lo,lo_plat,hi_plat,hi);

}


Функція управління зарядкою батареї з допомогою нечіткою логіки

 

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

Функція, управляюча зарядкою батареї

publicfloatchargeControl(floattimer )

{

>int і = 0;

>if ( (і++ % 10) == 0 ) {

>if (normalize(m_voltage_high(voltage)) ==1) {

>ChargeMode =TRICKLE_CHARGE;

>timer = (>float)0.0;

}elseif (>normalize(m_temp_hot(temperature))==1) {

>ChargeMode =TRICKLE_CHARGE;

>timer = (>float)0.0;

}elseif (>normalize(

>fuzzyAnd(fuzzyNot(m_voltage_high(voltage)),

>fuzzyNot(m_temp_hot(temperature))))==1) {

>ChargeMode =FAST_CHARGE;

>timer = (>float)0.0;

}

}

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


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

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

Головний цикл

privatevoidMain (>objectsender,EventArgs e)

>int і;

>Napryagenie n = newNapryagenie();

>strings="";

>tmpr=newfloat[3000];

>volt = newfloat[3000];

>mode = newint[3000];

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

{

>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: " + і + "volt=" +n.voltage + "temper=" +n.temperature + " Mode=" +n.ChargeMode;

>listBox1.Items.Add(s);

}

>Console.ReadLine();

}

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


Висновок

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

Програма написана на MicrosoftVisual З# 2010 ExpressEdition.Отладка здійснювалася в операційній системі MS WindowsХР.

У цьому прикладі було розглянуто застосування операторівнечеткой логіки. Ці оператори використовують у найрізноманітніших додатках. Найочевидніша область їх застосування - системи управління, яким нечітка логіка вже забезпечила комерційний успіх.Нечеткая логіка використовують у устрої відеокамер і фотоапаратів завтофокусом, системах змішування цементу, автомобільних системах (наприклад, системах АБС) і навіть системах, заснованих на виключно правилах. Напевно, найкорисніші області застосування ще залишаються невідомими. Саме назва «нечітка логіка» не вселяє особливого довіри, хоча давно відомо, що це надійний метод. Як і більшість інші методики ІІ, нечітка логіка нині дедалі більше використовують у пристроях повсякденного застосування, де большє нє асоціюється з штучним інтелектом.


Додаток 1

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

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

>classNapryagenie

{

>intTRICKLE_CHARGE; //>charge=заряд 0

>intFAST_CHARGE; // 1

publicintChargeMode;

>intMAX_LOADS; // 5

publicfloatvoltage,temperature;

publicfloattimer;

>float[]load;

>intcurLoad;

>floatlo;

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

}

>intt;

publicfloatcharge(intt )

{

>floatresult;

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

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

>returnresult;

}

publicintsimulate()

{

//>externintchargeMode;

>t=0;

// First,update theloadingifnecessary

>if (>getSRand() < 0.02) {

>curLoad =getRand(MAX_LOADS );

}

//Affect thecurrentbatteryvoltagegiven theload

>voltage -=load[curLoad];

// Next,update thebatteryvoltagegiveninputcharge

>if (>ChargeMode ==FAST_CHARGE) {

>voltage += (>charge(t) * (>float)Math.Sqrt(timer));

}else {

>voltage += ((>charge(t) * (>float)Math.Sqrt(timer)) / (>float)10.0 );

}

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

>elseif (>voltage > 35.0)voltage = (>float)35.0;

// Update thetemperature

>if (>ChargeMode ==FAST_CHARGE) {

>if (>voltage > 25) {

>temperature += ((>load[curLoad] * ((>float)Math.Sqrt(timer)/(float)25.0)) * (>float)10.0);

}elseif (>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 < 0.0)temperature = (>float)0.0;

>elseif (>temperature > 40.0)temperature = (>float)40.0;

>t++;

>return 0;

}

publicfloatgetSRand() {

>float з;

>Randomr=newRandom();

>uintRAND_MAX=0x7FFFFU;

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

>return з;

}

publicintgetRand(float x) {return (>int)((x) *getSRand()); }

publicfloatMAX(floata,float b) {return (>a>b) ? a : b; }

publicfloatMIN(float a,float b) {return (a < b) ? a : b; }

publicfloatfuzzyAnd (>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;

>returnMAX(a, b);

}

publicfloatfuzzyOr(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;

>returnMIN(a, b);

}

publicfloatfuzzyNot(float a)

{

>if (a < 0.0)return 0;

>if (a > 1.0)return 0;

>float з = (>float)1.0 - a;

>return з;

}

//нормалізація

publicintnormalize(floatinn)

{

>if (>inn >= 0.5)return 1;

>elsereturn 0;

}

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

publicfloatspikeProfile (>floatvalue,floatlo,float high)

{

>floatpeak;

>value += (->lo);

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

{

high = -(high -lo);

}

>elseif ((>lo < 0) && (high > 0))

{

high += ->lo;

}

>elseif ((>lo > 0) && (high > 0))

{

high -=lo;

}

>peak = (>float)(high / 2.0);

>lo =(>float)0.0;

>if (>value <peak)

{

>return (>value /peak);

}

>elseif (>value >peak)

{

>return ((high -value) /peak);

}

>return (>float)1.0;

}

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

publicfloatplateauProfile(floatvalue,floatlo,floatlo_plat,

>floathi_plat,floathi)

{

>floatupslope;

>floatdownslope;

>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 <lo)return (>float)0.0;

>elseif (>value >hi)return (>float)0.0;

>elseif ((>value >=lo_plat) && (>value <=hi_plat))return (>float)1.0;

>elseif (>value <lo_plat)return ((>value -lo) *upslope);

>elseif (>value >hi_plat)return ((>hi -value) *downslope);

>return (>float)0.0;

}

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

publicfloatm_temp_hot(floattemp)

{

>constfloatlo = (>float)35.0;

>constfloatlo_plat = (>float)45.0;

>constfloathi_plat = (>float)45.0;

>constfloathi = (>float)45.0;

>if (>temp <lo)return (>float)0.0;

>if (>temp >hi)return (>float)1.0;

>returnplateauProfile(temp,lo,lo_plat,hi_plat,hi);

}

// функціяпринадлежностми для середньої температури

publicfloatm_temp_warm(floattemp)

{

>constfloatlo = (>float)15.0;

>constfloatlo_plat = (>float)25.0;

>constfloathi_plat = (>float)35.0;

>constfloathi = (>float)45.0;

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

>returnplateauProfile(temp,lo,lo_plat,hi_plat,hi);

}

// функціяпринадлежностми для низькою температури

publicfloatm_temp_cold(floattemp)

{

>constfloatlo = (>float)15.0;

>constfloatlo_plat = (>float)15.0;

>constfloathi_plat = (>float)15.0;

>constfloathi = (>float)25.0;

>if (>temp <lo)return (>float)1.0;

>if (>temp >hi)return (>float)0.0;

>returnplateauProfile(temp,lo,lo_plat,hi_plat,hi);

}

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

publicfloatm_voltage_low(floatvoltage)

{

>constfloatlo = (>float)5.0;

>constfloatlo_plat = (>float)5.0;

>constfloathi_plat = (>float)5.0;

>constfloathi = (>float)10.0;

>if (>voltage <lo)return (>float)1.0;

>if (>voltage >hi)return (>float)0.0;

>returnplateauProfile(voltage,lo,lo_plat,hi_plat,hi);

}

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

publicfloatm_voltage_medium(floatvoltage)

{

>constfloatlo = (>float)5.0;

>constfloatlo_plat = (>float)10.0;

>constfloathi_plat = (>float)20.0;

>constfloathi = (>float)25.0;

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

>if (>voltage >hi)return (>float)0.0;

>returnplateauProfile(voltage,lo,lo_plat,hi_plat,hi);

}

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

publicfloatm_voltage_high(floatvoltage)

{

>constfloatlo = (>float)25.0;

>constfloatlo_plat = (>float)30.0;

>constfloathi_plat = (>float)30.0;

>constfloathi = (>float)30.0;

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

>if (>voltage >hi)return (>float)1.0;

>returnplateauProfile(voltage,lo,lo_plat,hi_plat,hi);

}

publicfloatchargeControl(floattimer )

{

>int і = 0;

>if ( (і++ % 10) == 0 ) {

>if (normalize(m_voltage_high(voltage)) ==1) {

>ChargeMode =TRICKLE_CHARGE;

>timer = (>float)0.0;

}elseif (>normalize(m_temp_hot(temperature))==1) {

>ChargeMode =TRICKLE_CHARGE;

>timer = (>float)0.0;

}elseif (>normalize(

>fuzzyAnd(fuzzyNot(m_voltage_high(voltage)),

>fuzzyNot(m_temp_hot(temperature))))==1) {

>ChargeMode =FAST_CHARGE;

>timer = (>float)0.0;

}

}

>returntimer;

}

}//>class

}

publicpartialclassForm1 :Form

{

publicForm1()

{

>InitializeComponent();

}

privatevoidForm1_Load(objectsender,EventArgs e)

{

}

>Graphics g;

>float []tmpr;

>float []volt;

>int []mode;

privatevoidbutton1_Click(objectsender,EventArgs e)

{

>int і;

>Napryagenie n = newNapryagenie();

>strings="";

>tmpr=newfloat[3000];

>volt = newfloat[3000];

>mode = newint[3000];

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

{

>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: " + і + "volt=" +n.voltage + "temper=" +n.temperature + " Mode=" +n.ChargeMode;

>listBox1.Items.Add(s);

}

>Console.ReadLine();

}

privatevoidlistBox1_SelectedIndexChanged(objectsender,EventArgs e)

{

}

>classgraphic

{

>intxw,yw;

>Graphicsgr;

>intmx,my;

>intminx,maxx,miny,maxy;

>floatshx,shy;

publicgraphic(Graphics g,intmx1,intmy1,intminx1,intmaxx1,intminy1,intmaxy1)

{

>gr = g;

>mx =mx1;my =my1;

>minx =minx1;maxx =maxx1;miny =miny1;maxy =maxy1;

>xw =maxx1 -minx1;

>yw =maxy1 -miny1;

}

publicvoiddrawaxes()

{

>int і;

>intlrsk = 5;

>float x = 0, y;

>shx = (>float)mx / (>float)xw;

>shy = (>float)my / (>float)yw;

>for (і = 0; і <xw; і++)

{

x = (>float)i *shx;

>if (і % 50 == 0)

>gr.DrawLine(newPen(Color.Black, 1), x,my, x,my -lrsk);

}

>for (і = 0; і <yw; і++)

{

y = і *shy;

>if (і % 1 == 0)

>gr.DrawLine(newPen(Color.Black, 1), 0, y,lrsk, y);

}

}//>drawaxes

publicvoiddrawgr(Colorclr,float []tmp)

{

>floatx,y;

>int і;

>intk = 0;

>for (і =maxx -xw; і <maxx; і++)

{

x =k++ *shx;

y =tmp[i] *shy;

>gr.DrawEllipse(newPen(clr, 1), x,my - y, 1, 1);

}

}//>drawgr

}//>graphic

privatevoidbutton2_Click(objectsender,EventArgs e)

{

g =panel1.CreateGraphics();

>graphicgra=newgraphic(g,panel1.Width,panel1.Height,0,3000,0,50);

>gra.drawaxes();

>gra.drawgr(Color.Green,tmpr);

>gra.drawgr(Color.Red,volt);

}

}


Додаток 2


Схожі реферати:

Навігація