Ребята, требуется помощь. В качестве дипломного проекта пишу программу для расчета кольцевых водопроводных сетей, которая должна выполнять следующие функции:
--Потокораспределение!
--Гидравлический рассчет и внутренняя увязка колец!
--Пьезометрический и обратный пьезометрический рассчеты (рассчет требуемого напора насосов и пьезометрических напоров во всех узлах соответственно).
Скриншот программы расположен здесь:
http://s55.radikal.ru/i149/0904/3f/f645f6254617.jpgМне требуется ваша помощь с увязкой... Прочитал вдоль и поперек учебник Абрамова, но так ни к чему и не пришел... В качестве рабочего алгоритма принял алгоритм внесения поправок в кольца с максимальной невязкой но это привело к абсолютно непредсказуемым результатам. В качестве источников идей использовал книгу Рассчет водопроводных сетей на микрокалькуляторах. Проблема возникла со следующим. Согласно книге гидравлическое сопротивление трубопровода находим как (формула ВНИИ ВОДГЕО):
Код
S=1.4e-7/D^5*(1.21/D+D/(1.21*Q))^0.3*Q*L
а программно как
S:=1.4e-7/Power(J.Diameter,5)*Power(1.21/J.Diameter+J.Diameter/(1.21*J.Q),0.3)*J.Q*J.L;
здесь Power - функция степени, возводит первый параметр в степень второго. J - объект представляющий магистраль в памяти, J.Q - расход на магистрали литры в секунду, J.L - длина магистрали в метрах, J.Diameter - диаметр магистрали, мм. Вопрос в следующем, правильно ли я выбрал размерности? Подставлять нужно в тех в которых я записал или нет?
Полностью алгоритм выглядит так:
Код
var R: TWaterRing;
J: TNodesJoint;
SQ,DQ,AQ,AV,AI: double;
I: Integer;
LoopCount: Integer;
FD: double;
begin
LoopCount:=0;
while not RingsList.RingFixUpGood do
begin
R:=RingsList.GetRingWithMaxDH;
R.UpdateJointsList;
SQ:=0;
for I := 0 to R.JointsList.Count - 1 do
begin
J:=TNodesJoint(R.JointsList.Objects[I]);
J.S:=1.4e-7/Power(J.Diameter,5)*Power(1.21/J.Diameter+J.Diameter/(1.21*J.Q),0.3)*J.Q*J.L;
SQ:=SQ+Abs(J.S);
end;
DQ:=R.DH/(2*SQ);
for I := 0 to R.JointsList.Count - 1 do
begin
J:=TNodesJoint(R.JointsList.Objects[I]);
J.Q:=J.Q-DQ;
J.DH:=J.S*J.Q;
end;
Inc(LoopCount);
Application.ProcessMessages;
if LoopCount>4000 then
break;
end;
end;
Небольшие комментарии.
Пока не увязаны все кольца в списке колец программа находит кольцо с максимальной увязкой и строит список магистралей (Joints) в нем. Потом вычисляет сумму гидравлических сопротивлений. И подставляет в формулу лобачева - кросса: DQ - поправка в расход по магистралям кольца = невязка по кольцу деленная на две суммы гидравлических сопротивлений. Далее перебирая все магистрали в кольце вносит в них поправки и считает потери напора заново. Далее опять переходит в начало цикла while и анализирует. Цикл будет выплняется до тех пор пока в списке не будет колец с невязкой больше 0.1 по модулю...
Помогите пожалуйста.