用户需要输入:D、S、n、h。
输入h时,h必须小于等于D(直径)。如果h等于D,就是满管流,此时θ=2π,A=πr²,P=2πr,R=r/2,这与满管流的水力半径一致。
正确的步骤是:
1. 输入D、S、n、h。
2. 计算半径r=D/2。
3. 计算θ = 2 * arccos( (r - h)/r )
但需要注意,当h > r时,比如当h在圆的上半部分时,可能需要调整计算方式。例如,当h超过r时,液面在圆的上方,这时候可能需要用另一种方式计算θ。比如,当h = r + a,其中a < r,此时液面到圆心的距离是 h - r,但此时圆心角θ的计算可能需要调整。不过,通常无压流的水深不会超过直径,但用户可能需要处理h从0到D的情况。因此,需要确保当h在0到D之间时,计算正确。
不过,当h=0时,θ=0;当h=D时,θ=2π。但根据上面的公式,当h=D时,r - h = r - 2r = -r,所以cos(theta/2) = -r/r = -1,theta/2=π,theta=2π。这没问题。
当h= r(半满管),此时液面到圆心的距离是0,theta=2*arccos(0/r)=2*arccos(0)=2*(π/2)=π。此时面积A=r²/2 (π - 0) = π r² /2,即半圆面积,正确。
因此,公式是正确的。所以,当用户输入h时,可以计算theta = 2 * Math.acos( (r - h)/r )
但需要注意,当h>r时,例如h=1.5r,此时r - h = -0.5r,此时cos(theta/2) = (r - h)/r = -0.5,所以theta/2 = 2π/3,theta=4π/3。这个时候,液面在上半部分,对应的面积是圆面积减去原来的弓形面积?或者应该如何处理?
例如,当h > r时,例如h=1.5r,那么实际水深是D - h',其中h'是液面到管顶的距离?或者是否应该始终将h视为从管底到液面的高度?这里需要明确h的定义。假设h是从管底到液面的高度,因此当h=0时,管是空的;h=D时,管满。当h在r到D之间时,液面位于圆的上半部分,这时候计算得到的theta可能大于π。例如,当h=r时,theta=π;当h=2r(即D)时,theta=2π。
在这种情况下,不管h是小于还是大于r,公式都适用。因此,无论h在0到D之间,都可以用theta = 2 * Math.acos( (r - h)/r )
然后计算面积A和湿周P:
A = (r² / 2) * (theta - Math.sin(theta))
P = r * theta
R = A / P
然后,曼宁公式:Q = (A / n) * Math.pow(R, 2/3) * Math.sqrt(S)
流速v = Q / A
流量 Q: 0.000 m³/s
流速 v: 0.000 m/s