![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Программная реализация решения задачи потокораспределения в гидравлических сетях ⇐ ПредыдущаяСтр 4 из 4
Описание программы В данной дипломной работе задача потокораспределения в гидравлических сетях решается методом поузловой увязки путем одностороннего прохода по всем вершинам. Для написания программы была использована инструментальная среда 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-массив, определяющий давление (начальное приближение) для всех узлов сети
PP-массив, определяющий вершины, в которых задана величина P Например, если PP[i]=0- давление 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; Просмотров: 187; Нарушение авторского права страницы