Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Программная реализация решения задачи потокораспределения в гидравлических сетях



Описание программы

В данной дипломной работе задача потокораспределения в гидравлических сетях решается методом поузловой увязки путем одностороннего прохода по всем вершинам. Для написания программы была использована инструментальная среда Delphi 7.0. Программы в Delphi создаются на основе современной технологии визуального проектирования, которая, в свою очередь, базируется на идеях объектно-ориентированного программирования. Delphi является наглядной и простой средой, имеет интуитивно-понятный интерфейс.

 

 Определенные в программе классы

 

Класс узла:

 

cHouse= class(TObject)

public

No: integer; // порядковый номер

XCoord: integer; //координата X расположения узла на экране

YCoord: integer; //координата У расположения узла на экране

Pressure: real; // давление

IsSet: boolean; //если true – давление задано (НФС)

Next: pointer; //указатель на следующий узел в цепочке

Prev: pointer; //указатель на предыдущий узел в цепочке

Name: AnsiString; // адрес узла

kind: AnsiString; // тип

function IsInside(x: integer; y: integer): boolean; // проверка нахождения курсора над узлом

//путем сравнения текущих координат курсора и областей экрана, занимаемых //узлом. В параметрах передаются координаты курсора. Возвращаемое значение: //true – если курсор над узлом, false – в противном случае

procedure Draw(); // процедура рисования узла на экране. В зависимости от того, задано ли        давление, рисует НФС или собственно узел

procedure Del(forDel: pointer); // процедура удаления узла из цепочки. В параметре //передается указатель на удаляемый узел

constructor cHouse(p: pointer); // задание начальных параметров узла

end;

 

Класс трубы:

 

cTube = class

public

StartHouse: pointer; // номер узла, из которого исходит труба

FinishHouse: pointer; // номер узла, в который входит труба

params: array[0..1] of real; //массив параметров трубы – диаметр и длина

Next: pointer; //указатель на следующую трубу в цепочке

Prev: pointer; //указатель на следующую трубу в цепочке

kind: integer; //тип трубы: 0 – труба, 1 – задвижка открыта, 2 – насос, 3 – задвижка закрыта

AddPress: real; //добавочное давление (когда тип - насос)

constructor cTube; // задание начальных параметров трубы

end;

 

Переменные:

Base: pointer; // указатель на первый узел в цепочке

BaseTube: pointer; //указатель на первую трубу в цепочке

E: real=0.1; // параметр точности вычислений

P1: array[0..4] of real; // массив параметров жидкости

BasePrice: real; //давление в НФС

maxD: real; // максимальный диаметр трубы

minD: real; // минимальный диаметр трубы

Константы:

 -максимально возможное число вершин графа, для которого проводится расчет

-максимально возможное число дуг графа, для которого проводится расчет,

AL-коэффициент, используемый в методе нахождения начального интервала, AL=1

-максимально возможное число параметров, характеризующих транспортируемую жидкость

-максимально возможное число параметров потока, характеризующих одновременно все дуги сети

E- Маленькое число, характеризующее точность решения данной задачи

EPS-маленькое число, характеризующее точность численного решения уравнения при нахождении P

Все описанные константы, кроме E, EPS, AL необходимы для описания размерности массивов в программе, причем числовые данные констант удовлетворяют требованиям контрольных примеров и их можно изменить при решении конкретного вида задач.

 

Исходные данные:

M, N, KX, KPP-переменные, имеющие тот же смысл, что и , , , , описанные в разделе констант, но их значения отражают характеристики расчетов конкретной заданной сети

P-массив, определяющий давление (начальное приближение) для всех узлов сети

[i]-номер вершины, являющийся началом дуги

 [i]- номер вершины, являющейся концом дуги

PP-массив, определяющий вершины, в которых задана величина P

Например, если PP[i]=0- давление P  не задано и его надо найти, если PP[i]=1- давление в вершине P  задано.

KK-массив, характеризующий параметры транспортируемой жидкости.

Результаты:

SH-счетчик итераций

P- массив, определяющий давление в узлах сети

J, K, I, S- целочисленные рабочие переменные, используемые для организации циклов

PD- вещественная рабочая переменная

PR, - вещественные рабочие массивы

 

Процедуры и функции, относящиеся к алгоритму расчета:

 

function QR1(PH: real; PK: real; P1: array of real; P2: array of real; kind: integer

; addit: real): real;

var QQ: real;

begin

QQ: =sqrt(abs(PH+addit-PK)/(P1[0]*P1[1]*P1[2]*P1[3]*P1[4]*P2[1]));

if (PH+addit< PK)

 then begin QR1: =-QQ; exit; end

else begin QR1: =QQ; exit; end;

end;

 

Здесь:

PH – давление в узле, из которого исходит труба;

PK – давление в узле, в который входит труба;

P1 – массив параметров жидкости;

P2 – массив параметров трубы;

Kind – вид трубы;

Addit – добавочное давление (задано только для типа «насос»)

Считается, что насос вырождается в трубу с увеличенным на величину накачиваемого насосом давления в начальном узле; открытая задвижка есть труба; закрытая задвижка – отсутствие связи между узлами

 

 

function Q(Press: real; C: cHouse): real;

var temp: cTube;

Q1, Q2: real;

begin

if (BaseTube=nil)

then begin Q: =0; exit; end;

temp: =cTube.Create;

pointer(temp): =BaseTube;

Q1: =0; Q2: =0;

while(1=1) do begin

if (temp.kind< > 3) then begin

if (temp.StartHouse=pointer(C))

then Q1: =Q1+QR1(Press, (cHouse(temp.FinishHouse)).Pressure, P1, temp.params, temp.kind, temp.AddPress);

if (temp.FinishHouse=pointer(C))

then Q2: =Q2+QR1( (cHouse(temp.StartHouse)).Pressure, Press, P1, temp.params, temp.kind, temp.AddPress);

end;

if (temp.Next=nil)

then break;

pointer(temp): =temp.Next;

end;

Q: =Q2-Q1;

end;

 

Здесь:

Press – давление в узле, для которого происходит расчет на данной итерации;

С – указатель на узел, для которого происходит расчет на данной итерации

Расчет не требуется, если kind=3 (задвижка закрыта), т.к. этот случай приравнивается к отсутствию трубы

Результат выполнения функции есть значение, характеризующее правильность рассчитанного давления (при условии Q< E)

 

 

function LOS (I: cHouse): real;

var Y, A, B, QA, QB, QY, DEL, PD: real;

temp: cTube;

begin

A: =100000000.0;

B: =0.0;

if (BaseTube=nil) then begin LOS: =0; end;

 temp: =cTube.Create;

pointer(temp): =BaseTube;

while(1=1)do begin

if (temp.kind< > 3) then begin

if (temp.StartHouse=pointer(I)) then begin

if (A> (cHouse(temp.FinishHouse).Pressure))

then A: =cHouse(temp.FinishHouse).Pressure;

if (B< (cHouse(temp.FinishHouse).Pressure))

then B: =cHouse(temp.FinishHouse).Pressure; end;

if (temp.FinishHouse=pointer(I)) then begin

if (A> ((cHouse(temp.StartHouse).Pressure)+temp.AddPress)) then

A: =cHouse(temp.StartHouse).Pressure+temp.AddPress;

if(B< ((cHouse(temp.StartHouse).Pressure)+temp.AddPress)) then

B: =cHouse(temp.StartHouse).Pressure+temp.AddPress; end;

end;

if (temp.Next=nil) then break;

pointer(temp): =temp.Next;

end;

QA: =Q(A, I);

QB: =Q(B, I);

if (QA=0.0) then PD: =A;

if (QB=0.0) then PD: =B;

if ((QA> 0)and(QB< 0))

then begin

Y: =B;

B: =A;

A: =Y;

Y: =QB;

QB: =QA;

QA: =Y;

end;

if ((QA< 0)and(QB> 0)) then

while ((abs(QA)> =EPS)or(abs(QB)> =EPS)) do begin

Y: =(A+B)/2.0;

QY: =Q(Y, I);

if (abs(QY)< EPS) then

begin

PD: =Y;

LOS: =PD;

exit;

end;

if (QY> 0.0) then B: =Y else A: =Y;

end;

PD: =(A+B)/2;

LOS: =PD;

end;

 

Здесь:

I – указатель на узел, для которого происходит расчет на данной итерации

Результат выполнения функции есть значение давления в узле I на данной итерации

 

 

procedure TForm 1. Button 1 Click(Sender: TObject); //процедура расчета гидравлической сети //методом поузловой увязки. Вызывается путем нажатия на кнопку «Расчет»

var S, J: integer;

temp: cHouse;

begin

if (Base< > nil) then pointer(temp): =Base else exit;

while(1=1) do begin

if temp.IsSet=false then temp.Pressure: =0.0;

if (temp.Next=nil) then break;

pointer(temp): =temp.Next;

end;

P1[0]: =StrToFloat(StringGrid1.Cells[1, 1]);

P1[1]: =StrToFloat(StringGrid1.Cells[2, 1]);

P1[2]: =StrToFloat(StringGrid1.Cells[3, 1]);

P1[3]: =StrToFloat(StringGrid1.Cells[4, 1]);

P1[4]: =StrToFloat(StringGrid1.Cells[5, 1]);

S: =1;

while (S< > 0) do begin

S: =0;

if (Base< > nil) then pointer(temp): =Base else exit;

while(1=1) do begin

if (temp.IsSet=false) then

if (abs(Q(temp.Pressure, temp))> =E)

then begin

S: =S+1;

temp.Pressure: =LOS(temp);

end;

if (temp.Next=nil) then break;

pointer(temp): =temp.Next;

end;

end;

end;

 

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

 

Вычислительный эксперимент

Вычислительный эксперимент был проведен в нескольких вариантах

1.Задача была решена для графа линейной структуры (приложение А, рисунок 1).

Она была решена с помощью программы и вручную, результаты расчета совпали (приложение А, рисунок 2).

Входные данные:

N=5

M=4

P (0) =100

P (4) =20

Выходные данные:

P (1) =80

P (2) =60

P (3) =40

2.Задача была решена для графа произвольной структуры (приложение А, рисунок 3).Решение задачи проводилось с помощью программы и вручную. При сравнении результаты совпали.

Входные данные:

N=14

M=20

 

Количество вершин, в которых задано давление равно шести (приложение А, рисунок 4).

Результаты счета:

                             

                                                                 

                                                                  

Рисунок 3.2.1

3.После успешно пройденных этапов тестирования эта задача была решена для гидравлической сети реальной размерности. В качестве гидравлической сети был взят участок, осуществляющий водоснабжение Комсомольского района города Тольятти (приложение Б, рисунок 1).

Трубы в сети разной длины и диаметра, поэтому на форме они отображаются разным цветом(приложение Б, рисунок, 1 рисунок 2).

 

Входные данные:

 N=134

 M=148

Результаты счета:

Рисунок 3.2.2

В результате было рассчитано оптимальное давление для гидравлической сети Комсомольского района города Тольятти. Также была рассчитана стоимость воды для потребителей. Можно увидеть, что чем дальше находится потребитель от насосно-фильтровой станции, тем выше становится стоимость.

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

Заключение

Таким образом, в данной дипломной работе был применен метод поузловой увязки для решения задачи потокораспределения в гидравлических сетях с целью эффективного управления существующими трубопроводными сетями и проектирования новых трубопроводных систем. В процессе работы были исследованы существующие методы решения задачи потокораспределения в гидравлических сетях, проведен анализ их достоинств и недостатков. Далее из всех методов был выбран наиболее подходящий, а именно метод поузловой увязки. Также был проведен тщательный анализ этого метода и некоторых его модификаций. На основе этого метода был разработан алгоритм, позволяющий решать задачи эффективного управления и моделирования большими гидравлическими сетями в режиме реального времени, при этом от пользователя не требуется знания специфики используемых методов и определения начальных приближений. Программа была протестирована на линейном примере, а также с графом произвольной нелинейной структуры. Результаты совпали с результатами ручного расчета. Был проведен расчет конкретной сети. Эту программу можно также применять для расчета других трубопроводных систем, например, тепло-, газо-, нефтеснабжающих.

 

Список литературы

1. Абрамов Н.Н. Теория и методика расчета систем подачи и распределения воды. М: Стройиздат.1972

2. Абрамов Н.Н., Поспелова М.Н., Сомов Н.А., Варапаев В.И., Каримов Д.Х. Расчет водопроводных сетей. М.: Стройиздат, 1983.

3. Аликашкин Я.И., Юшкин А.Р. Применение ЭВМ для гидравлических расчетов водопроводных сетей. Городское хозяйство Москвы. 1960 №11.с 17-18.

4. Андрияшев М.М. Техника расчета водопроводной сети. М.: Сов. законодательство, 1932.

5. Белан А.Е. Универсальный метод гидравлического расчета кольцевых водопроводных сетей.-Изв.вузов. Ж-л Строительство и архитектура. 1964. №4. с. 69-73.

6. Берж К. " Теория графов и ее применение", М., ИЛ, 1962;

7. БСЭ. 3 издание. 1978. Т.30. с. 100.

8. Васильченко Н.П. Расчет кольцевых водопроводных сетей путем нахождения полных поправочных расходов. – Изв.вузой. Ж-л Строительство и архитектура. 1964.№6. с. 80-90.

9. Вишневский К.П. Механизация расчета кольцевых водопроводных сетей.- Водоснабжение и санитарная техника. 1961. №4. с. 20-24.

10. Гальперин Е.М., Зайко В.А., Ермолаев Е.Е. Выбор наилучшего варианта проекта системы подачи и распределения воды (с применением ЭВМ): Методические указания для студентов специальности 290800 – Водоснабжение и водоотведение. Самарск. гос. арх. – строит. академия. Самара 1999. с. 46

11. Гальперин Е.М. Надежность функционирования кольцевой водопроводной сети // Водоснабжение и санитарная техника. 1987. №4.

12. Гидравлические и технико-экономические расчеты систем подачи и распределения воды (программное обеспечение для персональных компьютеров): Методические указания. Ч.1 /Сост.: Гальперин Е.М., Зайко В.А., Коваленко А.Г.. СамГАСА. Самара, 1997.

13. Дарахвелидзе П. Г., Марков Е. П. Программирование в Delphi 7. – СПб.: БХВ-Петербург, 2004.

14. Евдокимов А.Г., Дубровский В.В., Тевяшев А.Д. Потокораспределение в инженерных сетях. Харьков: Стройиздат. 1978.

15. Евдокимов А.Г., Тевяшев А.Д. Оперативное управление потокораспределением в инженерных сетях. Харьков: Высшая школа. 1980.

16. Кандзюба С. П., Громов В. Н. Delphi 6/7. Базы данных и приложения. Лекции и упражнения. – СПб.: ооо «ДиаСофтЮП», 2002.

17. Коваленко А.Г. Математические модели рассредоточенного рынка. Известия академии наук. Теория и системы управления. №4, 2001.

18. Коваленко А.Г. О математическом моделировании рассредоточенного рынка. СамГу.

19. Меренков А.П., Хасилев В.Я. Теория гидравлических цепей. М.: Наука, 1985.

20. Расчет водопроводных сетей. М.: Стройиздат. 1983

21. СНиП 2. 04.02-84. Водоснабжение. Наружные сети и сооружения. М: Стройиздат, 1984.

22. Толмачева М.К., Хасилев В.Я. Программа расчета многокольцевых гидравлических сетей увязочным методом. М.: ГИПРОТИСГОССТРОЯ СССР.1965.

23. Фаронов В.В. Delphi Программирование на языке высокого уровня. Питер, 2003.

24.  Цай С., Рязанцев Г.К. Принцип минимума и оптимальная политика управления вентиляционными и гидравлическими сетями. Алма-Ата: Наука. 1968

Приложение А

Рисунок  А.1

Рисунок  А.2

Рисунок  А.3

Рисунок А.4

Приложение Б

Рисунок  Б.1

Рисунок  Б.2


Поделиться:



Последнее изменение этой страницы: 2020-02-16; Просмотров: 161; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.105 с.)
Главная | Случайная страница | Обратная связь