Python实现Hardy Cross法求解管网结果不满足带出流节点水量守恒
管网不满足节点出流守恒的定位与修复方案
- 最核心的bug是你给所有修正后的管段流量强制套了
abs()取绝对值。Hardy Cross法的计算基础是带方向的流量值,管段流量的正负直接代表流向,所有环校正量的叠加、水头损失的符号计算都依赖这个正负值。你把修正后可能出现的负流量全部拍平为正值,等于强行把所有管段的流向固定成初始设定的方向,完全抹掉了环校正过程对流向的修正作用,从根源上破坏了节点水量平衡的计算基础。 - 符号逻辑存在冗余错位。检查你环方程的水头损失项:比如a4的计算式开头多层嵌套负号,本质上是符号规则没有统一——Hardy Cross的环水头闭合方程要求,同一环内的管段水头损失,凡是流向和环定义的顺时针方向同向的取正,反向的取负,不需要在整个分子项外面额外套多层负号,很容易把符号搞反,最后导致环校正量算错,传递到节点上就会出现进出流量不匹配。
- 缺少迭代过程的节点守恒校验。从迭代启动的第一步开始,你就没有对带出流的节点做过水量平衡校验:初始流量分配必须严格满足“节点所有管段的带符号流量之和 = 节点出流/入流流量”,后续每次迭代修正管段流量后,也应该同步核对节点平衡误差,现在你只把环校正量的大小作为迭代终止条件,哪怕环的闭合差够小,也可能因为流量符号错误导致节点出流不守恒。
具体修复步骤
- 删除所有管段流量赋值后的
abs()函数,给每个管段提前定义统一的正向流向,反向流量直接保留负号参与后续计算,不要人为截断流量的方向信息。 - 重写所有环的水头损失分子项:严格按照统一的环方向规则判定每项的符号,去掉多层嵌套的冗余负号;同步核对每个公共管段的校正量叠加逻辑——比如同时属于环1和环2的BE管,两个环对它的校正量方向相反,需要按环的方向标记分别加减,这个部分你代码的叠加逻辑本身是对的,只是因为之前的abs()把符号搞乱了。
- 补上迭代终止的双校验条件:除了要求所有环的校正量绝对值小于0.001的阈值,还要遍历所有带出流的节点,计算节点的带符号流量和与节点出流值的差值,当这个差值也小于允许误差时再终止迭代。
- 修正代码里的语法笔误:你的打印语句
print("P_AB = ",GIVEN[0][3]*1000,"L/s"缺少一个右括号,运行时会触发语法报错。
注:Hardy Cross法本身是靠环的水头闭合差迭代逼近解,只要全程保留流量的方向信息,初始分配满足节点守恒,最终结果自然会同时满足环闭合和节点出流平衡的要求,不需要强制把流量转成正值。
内容的提问来源于stack exchange,提问作者John Rey Cuaresma
相关产品推荐
相关产品推荐

