当前位置:   article > 正文

【EPANET】自动分配水量_给水自动分配流量

给水自动分配流量

灵感引用自王永等人研究论文:

王永,信昆仑,吕存阵,陶涛.应用EXCEL的VBA宏功能实现EPANET中的用水量自动分配[J].给水排水,2009,45(S1):466-469.DOI:10.13789/j.cnki.wwe1964.2009.s1.081.

以下是论文中通过软件EPANET导出的其节点数据和管段数据:

 

以下是论文代码:

  1. Public sub demand()
  2. const totalq As Double =2812.16 '2812.16为总流量
  3. const nodei AS Integer =6
  4. const nodej AS Integer =1292
  5. const pipei AS Integer =1304
  6. const pipej AS Integer =2167 '节点和管段的范围
  7. Dim i, j As Integer
  8. Dim sumq,suml As Double
  9. Dim strNode As String
  10. Dim strNode1,strNode2 As String
  11. sumq=0
  12. suml=0
  13. For i=nodei to nodej
  14. sumq=sumq+Cells(i,3)
  15. Next i
  16. ' 计算节点的集中流量demand
  17. ' Cells(m,n) 表示第m行第n列的数据
  18. For j=pipei To pipej
  19. suml=suml+Cells(j,4)
  20. Next j
  21. ' 计算管段的总长度length
  22. For i=nodei To nodej
  23. '对节点进行流量分配
  24. strNode = Cells(i,1) '节点ID
  25. strNode = Trim(strNode) '去除头部和尾部空格
  26. For j =pipei To pipej
  27. strNode1 = Cells(j,2)'管段连接的头结点
  28. strNode2 = Cells(j,3)'管段连接的尾结点
  29. strNode1 = Trim(strNode1)
  30. strNode2 = Trim(strNode2)
  31. If strNode =strNode1 or strNode=strNode2
  32. Then Cells(i,3)=Cells(i,3)+(totalq-sumq)*Cells(j,4)/suml/2
  33. '比流量=(总流量-集中流量)/总长度 即(totalq-sumq)/suml
  34. '需要的流量=比流量*配水长度/2 即sumq/2
  35. End If
  36. Next j
  37. Next i
  38. End Sub

代码分析:

时间复杂度为:O(m+n+m*n),即O(n^2)

空间复杂度为:O(1)

总结:

其实代码内核很简单,就是通过遍历节点流量和管段长度,来计算比流量,最后通过计算比流量和配水长度来计算各节点的节点流量。

代码是在EXCEL中调用VBA宏来实现。

本人在论文源代码的基础上进行了注释说明,同时进行了两处修改:

① 把原先for循环的起始点和终止点改为了常量,这样便于维护;

② 同时此代码还有一个问题,那就是不能判断配水长度,即 第34行代码suml/2 中默认管网全部为双向配水,个人认为可以在之后在双循环内部添加一个判断语句,即判断是否是单向供水,若是,则在原有基础上减去即可一份比流量即可,但是在EPANET的软件中无法导出单向供水的数据,故此处也是一个难点。

此论文为本人学习过程的一个记录,希望在之后的学习过程中能在此代码基础上进行修正,若有侵权,请联系我立马删。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/216042
推荐阅读
相关标签
  

闽ICP备14008679号