前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >B2型水面线计算(含python代码)

B2型水面线计算(含python代码)

原创
作者头像
用户8282247
修改2021-08-09 11:03:21
1.9K0
修改2021-08-09 11:03:21
举报

问题要求

一棱柱体渠道,断面为矩形,已知流量为30m^3/s ,底坡为0.25,粗糙系数0.025,底宽为5m ,渠道长度为56m ,试计算不同位置对应的水深和流量(要求断面间距为8m

理论建模

1.1 临界水深求解

本程序中利用迭代法求临界水深的值,对于计算机来说更容易实现这个过程。通过水力学教材中的推导,当断面为等腰梯形时,临界水深在迭代法中的公式为:

迭代法计算水深
迭代法计算水深

1.2 正常水深求解

正常水深的求解与临界水深类似,都是采用易于使用计算机求解的迭代法。正常水深在迭代法中的公式为:

正常水深迭代法
正常水深迭代法

1.3 沿程各点水深求解

求解途中各点水深我们采用试算法的方法,其主体思想是一次次试算,根据设置的正常水深数值不断增加,当求出的水平距离与实际的水平距离相等或十分接近时即求出水深。具体公式原理如下:

初始设置一个水深的值,然后逐步试算,当s=8m 与实际的相差距离接近甚至相等时的水深即为所求水深。

步骤一

代码语言:javascript
复制
所需要导入的库为:数学库、绘图库
代码:
import math
import matplotlib.pyplot as plt

步骤二

代码语言:javascript
复制
所需要的存储数据的变量有:相同距离的水深(列表)、各位置的坡度(列表)
代码:
# 水深列表
h_Number=[]
# 坡度列表
J_Number=[]

步骤三

所需要的内部添置函数:计算水面函数、计算临界深度、计算水利坡度、计算平均水利坡度、计算能量E、计算S变化、计算流速。

代码语言:javascript
复制
# 计算水面深度
# b代表水面宽度、n代表粗糙度、Q代表流量、i代表坡度、h代表水深。
def H_0(b,n,Q,i,h):
    return 1/b*(n*Q/math.sqrt(i))**0.6*(b+2*h)**0.4

# 计算临界深度
# Q代表流量、g为重力加速度(程序在此处默认为9.8)、b代表水面宽度。
def h_k(Q,g,b):
    return (1.0843*Q**2/(g*b**2))**(1/3)

# 计算水利坡度
#  Q代表流量、b代表水面宽度、h代表水深、n代表粗糙度。
def J(Q,b,h,n):
    A=b*h
    X=b+2*h
    R=A/X
    C=R**(1/6)/n
    return 1.0*Q**2/(C**2*R*A**2)

# 计算平均水利坡度
# J1代表前者水利坡度、J2代表后者水利坡度。
def averge_J(J1,J2):
    return (J1+J2)/2

# 计算能量E
#  h代表水深、 Q代表流量、b代表水面宽度。
def E(h,Q,b):
    return h+(1.0*Q**2/(2*g*(b*h)**2))

# 计算S变化
# h0代表初始水深、h1代表当下水深、i代表坡度、b代表水面宽度、 Q代表流量、J1代表前者水利坡度、J2代表后者水利坡度。
def del_s(h0, h1, i, b, Q, J1, J2):
    return (E(h1,Q,b)-E(h0,Q,b))/(i-averge_J(J1,J2))

# 计算流速
#  b代表水面宽度、 h代表水深。
def Water_Speed(b,h):
    A = b*h
    return Q/A

步骤四

利用迭代方式求解初始水深。

代码语言:javascript
复制
# 初始水深
h_0=0
# 宽度为b
b=5
# 粗超度
n=0.025
# 流量
Q=30
# 坡度
i=0.25
# 重力加速度
g=9.8
迭代计算方法计算初始水深代码:
# 计算初始水深
while 1:
    a=h_0-H_0(b,n,Q,i,h_0)
    if a<=0.00001 and a>=0.000001:
        break
    else:
        h_0=h_0+0.00001
# 计算得到初始水深为1.5851679915806967米

步骤五

计算临界水深,确定曲面类型

代码语言:javascript
复制
# 计算临界水深
h_k=h_k(Q,g,b)
# 得到h_k>h_0,图像为b1型,水深减少
# 初始数据存入列表中
h_Number.append(h_k)
J_Number.append(J(Q, b, h_k, n))

步骤六

分段计算(每7米进行计算一次水深)。

代码语言:javascript
复制
# 分为7段,56米,距离8米
for j in range(7):
    # 由于水深减少,故初始h_i+1=h_i,但不储存在列表中
    h = h_Number[j]
    while 1:
        # 临时水利坡度计算
        J_new = J(Q, b, h, n)
        # 计算相同距离del_s,用s变量临时存储
        s = del_s(h_Number[j], h, i, b, Q, J_new, J_Number[j])
        if s <= 8.009 and s >= 7.96:
            # 符合条件,存入列表保存,退出循环
            h_Number.append(h)
            J_Number.append(J_new)
            break
        elif h <= h_0:
            # 符合条件,存入列表保存,退出循环
            h_Number.append(h_0)
            J_Number.append(J_new)
            break
        else:
            h = h - 0.00001

步骤七

汇总数据,并显示。

代码语言:javascript
复制
s = [0, 8, 16, 24, 32, 40, 48, 56]
for j in range(8):
    print(f'断面编号{j+1} 距离进口距离{s[j]}   水深{h_Number[j]}  流速{Water_Speed(b,h_Number[j])}')

数据结果

代码语言:javascript
复制
断面编号1 距离进口距离0   水深1.5851679915806967  流速3.785087783672016
断面编号2 距离进口距离8   水深0.758767991577961  流速7.907555493375763
断面编号3 距离进口距离16   水深0.6427379915784891  流速9.335063554069215
断面编号4 距离进口距离24   水深0.5903579915787275  流速10.163324771728558
断面编号5 距离进口距离32   水深0.5626779915788535  流速10.66329248663916
断面编号6 距离进口距离40   水深0.5470279915789247  流速10.968360106549182
断面编号7 距离进口距离48   水深0.5378679915789664  流速11.155153483638966
断面编号8 距离进口距离56   水深0.5324079915789912  流速11.26955285213784

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题要求
  • 理论建模
    • 1.1 临界水深求解
      • 1.2 正常水深求解
        • 1.3 沿程各点水深求解
        • 步骤一
        • 步骤二
        • 步骤三
        • 步骤四
        • 步骤五
        • 步骤六
        • 步骤七
        • 数据结果
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档