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

问题要求

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

理论建模

1.1 临界水深求解

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

迭代法计算水深

1.2 正常水深求解

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

正常水深迭代法

1.3 沿程各点水深求解

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

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

步骤一

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

步骤二

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

步骤三

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

# 计算水面深度
# 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

步骤四

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

# 初始水深
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米

步骤五

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

# 计算临界水深
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米进行计算一次水深)。

# 分为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

步骤七

汇总数据,并显示。

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])}')

数据结果

断面编号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
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: python代码:import numpy as npdef waterline(x, y): n = len(x) p = np.zeros(n) for i in range(1, n): for j in range(0, i): if y[i] != y[j]: p[i] = (y[i] - y[j]) / (x[i] - x[j]) return pfortran代码:subroutine waterline(x, y, n, p) implicit none integer, intent(in) :: n real, intent(in) :: x(n), y(n) real, intent(out) :: p(n) integer :: i, j do i = 1, n p(i) = 0. do j = 1, i-1 if (y(i) .ne. y(j)) then p(i) = (y(i) - y(j))/(x(i) - x(j)) endif end do end do end subroutine waterline ### 回答2: 特征线法是一种求解弯曲表面线的数值方法,可用于求解水面线等各种曲线问题。下面提供了使用Python和Fortran实现特征线法求水面线代码示例。 Python代码示例: ```python import numpy as np def characteristic_line_method(h_initial, dx, dt, t_max, h_boundary): nx = int(1 / dx) # 空间网格数 nt = int(t_max / dt) # 时间步长数 # 初始化水面线数组 h = np.zeros((nt+1, nx+2)) h[0, :] = h_initial # 迭代计算特征线 for n in range(nt): for i in range(1, nx+1): # 计算特征线斜率 dhdt = (h[n, i] - h[n, i-1]) / dx d2hdt2 = (h[n, i+1] - 2*h[n, i] + h[n, i-1]) / dx**2 # 更新水面线高度 h[n+1, i] = h[n, i] - dt * (dhdt * (1 + dhdt**2)**(-0.5) + d2hdt2) # 边界条件 h[n+1, 0] = h_boundary[0] h[n+1, nx+1] = h_boundary[1] return h # 设置初始条件和参数 h_initial = np.array([0.5, 1.0, 0.8, 0.6, 0.7, 0.9]) # 水面线初始高度 dx = 0.1 # 空间步长 dt = 0.001 # 时间步长 t_max = 1.0 # 最大时间 h_boundary = (0.5, 0.5) # 边界条件 # 求解水面线 h_result = characteristic_line_method(h_initial, dx, dt, t_max, h_boundary) print(h_result) ``` Fortran代码示例: ```fortran program characteristic_line_method implicit none integer, parameter :: nx = 10 ! 空间网格数 integer, parameter :: nt = 100 ! 时间步长数 real, parameter :: dx = 0.1 ! 空间步长 real, parameter :: dt = 0.001 ! 时间步长 real, parameter :: t_max = 1.0 ! 最大时间 real :: h_initial(nx), h_new(nx) real :: h_bound(2) = (/0.5, 0.5/) ! 边界条件 integer :: i, n ! 设置初始条件 do i = 1, nx h_initial(i) = 0.5 end do ! 迭代计算特征线 do n = 1, nt do i = 1, nx ! 计算特征线斜率 h_new(i) = h_initial(i) - dt * ((h_initial(i) - h_initial(i-1)) / dx / ((1 + (h_initial(i)-h_initial(i-1))**2)**0.5) & + (h_initial(i+1) - 2*h_initial(i) + h_initial(i-1)) / dx**2) ! 更新水面线高度 h_initial(i) = h_new(i) end do end do ! 输出水面线 do i = 1, nx write(*, *) h_initial(i) end do end program characteristic_line_method ``` 以上是使用Python和Fortran分别实现的特征线法求解水面线代码示例。对于特征线法的详细数值算法细节,可以参考相关的文献和资料。 ### 回答3: 特征线法是用于求解流体问题中的水面线的一种数值计算方法。下面给出了用Python和Fortran编写的特征线法求解水面线代码示例。 Python代码示例: ```python import numpy as np import matplotlib.pyplot as plt def characteristic_line_method(h0, L, b, dx, dt, T): # 初始化水面线数组 x = np.arange(0, L+dx, dx) h = np.zeros(len(x)) h[0] = h0 # 迭代计算水面线 for t in np.arange(0, T, dt): for i in range(1, len(x)): h[i] = 0.5 * ((h[i-1] + h[i+1]) - b * dt / dx * (h[i+1] - h[i-1])) return x, h # 配置参数 h0 = 1.0 # 初始水面高度 L = 10.0 # 河道长度 b = 0.1 # 河道平均底坡 dx = 0.1 # 空间步长 dt = 0.01 # 时间步长 T = 10.0 # 计算时间 # 调用特征线法求解水面线 x, h = characteristic_line_method(h0, L, b, dx, dt, T) # 可视化结果 plt.plot(x, h) plt.xlabel('x') plt.ylabel('h') plt.title('Characteristic Line Method') plt.grid() plt.show() ``` Fortran代码示例: ```fortran program characteristic_line_method implicit none integer, parameter :: n = 100 ! 空间网格点数 integer, parameter :: m = 1000 ! 时间网格点数 real(8), parameter :: h0 = 1.0 ! 初始水面高度 real(8), parameter :: L = 10.0 ! 河道长度 real(8), parameter :: b = 0.1 ! 河道平均底坡 real(8), parameter :: dx = L / n ! 空间步长 real(8), parameter :: dt = 0.01 ! 时间步长 real(8), parameter :: T = dt * m ! 计算时间 real(8), dimension(0:n) :: x, h ! 网格点位置和水面高度 integer :: i, j ! 循环变量 ! 初始化水面高度 x = [(i*dx, i=0,n)] h = 0.0 h(1) = h0 ! 迭代计算水面高度 do j = 1, m do i = 2, n h(i) = 0.5 * ((h(i-1) + h(i+1)) - b * dt / dx * (h(i+1) - h(i-1))) end do end do ! 输出结果 do i = 1, n write(*, *) x(i), h(i) end do end program characteristic_line_method ``` 注意:以上代码示例仅供参考,实际使用时需要根据具体问题进行适当调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值