Python(休恩法和龙格-库塔法解常微分方程)求水箱排水和溢洪道水流及水路生化需氧量和水位波动

休恩法

在数学和计算科学中,休恩方法可能是指改进的或修正的欧拉方法(即显式梯形法则),或类似的两阶段龙格-库塔方法。 它以 Karl Heun 命名,是一种求解具有给定初始值的常微分方程 (ODE) 的数值过程。 这两种变体都可以看作是欧拉方法对两阶段二阶龙格-库塔方法的扩展。

计算初值问题数值解的过程:

y ′ ( t ) = f ( t , y ( t ) ) , y ( t 0 ) = y 0 y^{\prime}(t)=f(t, y(t)), \quad y\left(t_{0}\right)=y_{0} y(t)=f(t,y(t)),y(t0)=y0

通过休恩方法,是先计算中间值 y ~ i + 1 \tilde{y}_{i+1} y~i+1*,*然后在下一个积分点处的最终近似值 y i + 1 y_{i+1} yi+1

y ~ i + 1 = y i + h f ( t i , y i ) y i + 1 = y i + h 2 [ f ( t i , y i ) + f ( t i + 1 , y ~ i + 1 ) ] \begin{aligned}&\tilde{y}_{i+1}=y_{i}+h f\left(t_{i}, y_{i}\right) \\&y_{i+1}=y_{i}+\frac{h}{2}\left[f\left(t_{i}, y_{i}\right)+f\left(t_{i+1}, \tilde{y}_{i+1}\right)\right]\end{aligned} y~i+1=yi+hf(ti,yi)yi+1=yi+2h[f(ti,yi)+f(ti+1,y~i+1)]

其中 h h h 是步长, t i + 1 = t i + h t_{i+1}=t_{i}+h ti+1=ti+h

龙格-库塔法

在数值分析中,龙格-库塔方法是一系列隐式和显式迭代方法,其中包括欧拉方法,用于时间离散化 联立非线性方程的近似解。

龙格-库塔家族中最广为人知的成员通常被称为“RK4”、“经典龙格-库塔方法”或简称为“龙格-库塔方法”。

水箱排水

如图所示,我们考虑一个最初是空水箱的倒截锥形状,很像一个水桶。 需要找出水箱的水深 h h h 的变化,如果水箱充满水源 Q i n Q_{in} Qin,并且底部出口也以可变流量排出一部分积聚水流输出。 虽然可以控制 Q i n Q_{in} Qin,但从水箱流出的 Q o u t Q_{out} Qout 完全取决于桶中的水深 h h h

我们可以假设罐是均匀变细的,横截面高度为 h h h A h A_h Ah,从等于底部的面积 A b o t t o m A_{bottom} Abottom 到罐顶部的 A t o p A_{top} Atop变化。 因此, A h A_h Ah 可以用以下形式的线性函数表示为 A t o p A_{top} Atop A b o t t o m A_{bottom} Abottom

A h = A bottom  + A top  − A bottom  D h A_{h}=A_{\text {bottom }}+\frac{A_{\text {top }}-A_{\text {bottom }}}{D} h Ah=Abottom +DAtop Abottom h

溢洪道水流

溢洪道需要针对可能发生的最严重洪水进行设计,并根据该地区水文气象研究获得的集水区水文和降雨输入估算“设计洪水水位线”。 水库问题需要已知溢洪道流出量对于给定的流入过程线。 通过使用设计洪水过程线作为水库的入流,通过大坝溢洪道的出流,连同水库水位的上升,可通过以下连续性方程计算:

回水海拔剖面

溶解氧和生化需氧量

水位波动

回灌水位剖面

水质问题

Python解

水箱排水问题

import numpy as np
import matplotlib.pylab as plt
g = 9.81
Atop = 1.0
Abottom = 0.5
D = 0.75
Aoutlet = 0.005
Cd = 0.7

dt = 1 # Time step (in seconds
ntimes = int(time_simulation/dt)
print(ntimes)
h=np.zeros(ntimes) # Sequence of water depths in bucket
time = np.zeros(ntimes) # Time markers for plotting
h[0] = 0.0
for n in range (0,ntimes-1):
	 time[n+1] = time[n] + dt
	 if(time[n] <= time_control1):
		 Qin = Qin1
	 elif(time[n] > time_control1 and time[n] <=
		time_control2):
	 Qin = Qin2
	 else:
		 Qin = 0.0
	 Qout = Cd*Aoutlet*np.sqrt(2*g*h[n])
	 Area = Abottom + h[n]*(Atop-Abottom)/D
	 dhdt0 = (Qin - Qout)/Area
	 h1 = h[n]+dhdt0*dt
	 Qout1 = Cd*Aoutlet*np.sqrt(2*g*h1)
	 Area1 = Abottom + h1*(Atop-Abottom)/D
	 dhdt1 = (Qin - Qout1)/Area1
	 dhdt = 0.5*(dhdt0+dhdt1)
	 h[n+1] = dhdt*dt+h[n]
	 if(h[n+1] < 0.01): h[n+1] = 0.0

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(time, h)
ax.set_xlabel('Time (s)')
ax.set_ylabel('Water Depth (m)')
plt.show()

溢洪道水流

回水海拔剖面

溶解氧和生化需氧量

水位波动

回灌水位剖面

水质问题

源代码

参阅 - 亚图跨际

你可能感兴趣的:(Python,交叉知识,python,微分方程,休恩法,龙格库塔法,水文)