水文频率计算——以P-Ⅲ型分布为例

水文频率计算的两个基本内容包括分布线型及参数估计。水文分析计算中使用的概率分布曲线俗称水文频率曲线,习惯上把由实测资料(样本)绘制的频率曲线称为经验频率曲线,而把由数学方程式所表示的频率曲线称为理论频率曲线。连续型随机变量的分布是以概率密度曲线和分布曲线来表示的,这些分布在数学上有很多的类型。我国工程水文学中常用的分布有正态分布、皮尔逊Ⅲ型分布以及对数正态分布等。

根据SL 44—2006《水利水电工程设计洪水计算规范》规定,频率曲线的线型一般选用皮尔逊Ⅲ型。

英国生物学家皮尔逊通过大量的分析研究,提出一种概括性的曲线族,包括13种分布曲线,其中第Ⅲ型被引入水文计算中,成为当前水文计算中常用的频率曲线。

皮尔逊第Ⅲ型曲线是一条一端有限,一端无线的不对称单峰的正偏的曲线,数学上称之为伽马分布,其概率密度函数为:
f ( x ) = β α Γ ( α ) ( x − a 0 ) a − 1 e − β ( x − a 0 ) f(x)=\frac{β^α}{\Gamma(\alpha)}(x-a_0)^{a-1}e^{-\beta(x-a_0)} f(x)=Γ(α)βα(xa0)a1eβ(xa0)
式中,Γ(α)为α的伽马函数;α,β,a0表征皮尔逊Ⅲ型分布的形状、尺度和位置的三个参数,α>0,β>0。

显然,参数α、β、a0一旦确定,该密度函数随之确定。可以证明,这三个函数与总体的三个统计参数

均值:
x \frac{}{x} x
离差系数:
C v C_v Cv
偏态系数:
C s C_s Cs
具有下列关系:
{ α = 4 C s 2 β = 2 x C s C v a 0 = x ( 1 − 2 C v C s ) \begin{cases}\alpha=\frac{4}{C_s^2}\\ \beta=\frac{2}{\frac{}{x}C_sC_v}\\ a_0=\frac{}{x}(1-\frac{2C_v}{C_s})\end{cases} α=Cs24β=xCsCv2a0=x(1Cs2Cv)
水文计算中,一般需要推求指定频率P所对应的随机变量Xp,这要通过对密度曲线进行积分,求出等于或大于Xp的累积频率P值,即
P = F ( x p ) = P ( x ≥ x p ) = β α Γ ( α ) ∫ x p ∞ ( x − a 0 ) a − 1 e − β ( x − a 0 ) d x P=F(x_p)=P(x\geq x_p)=\frac{\beta^{\alpha}}{\Gamma(\alpha)}\int_{x_p}^{\infty}{(x-a_0)^{a-1}e^{-\beta(x-a_0)}}dx P=F(xp)=P(xxp)=Γ(α)βαxp(xa0)a1eβ(xa0)dx
但是由上式直接计算P非常麻烦,美国工程师福斯特通过变量转换,根据拟定的Cs值进行多次积分,并把结果制成专用表格(Φ值表),供水利工作者直接查用。引入变量:
Φ = x − x ‾ x ‾ C v \Phi=\frac{x-\overline{x}}{\overline{x}C_v} Φ=xCvxx
则变量Φ的均值为0,均方差为1,水文学中称为离均系数。这样经过标准化变换后,原被积分的函数中就只含有一个待定参数Cs,即
P ( Φ ≥ Φ p ) = ∫ Φ p ∞ f ( Φ , C s ) d Φ P(\Phi\geq{\Phi_p})=\int_{\Phi_p}^{\infty}f(\Phi,C_s)d\Phi P(ΦΦp)=Φpf(Φ,Cs)dΦ
根据估计的频率分布曲线和样本经验点据分布配合最佳来优选参数的方法叫做适线法(亦叫配线法)。该法自20世纪50年代开始即在我国水文频率计算中得到较为广泛应用,层次清楚,方法灵活,操作容易,目前已是我国水利水电工程设计洪水规范中规定的主要参数估计方法。它的实质是通过样本的经验分布去探求总体的分布。适线法包括传统目估适线法及计算机优化适线法

由此,本节以P—Ⅲ型分布为例,介绍如何使用Python完成适线法。示例分为均匀格纸(未添加海森格纸)的情形和非均匀格纸(添加海森格纸)的情形,并作对比。

示例数据来自某水文站1965年—1995年的年径流,如下表所示(该表格在文件为 shixianshuju.xlsx)。

YearFlow(m3/s)
19651676
1966601
1967562
1968697
1969407
19702259
1971402
1972777
1973614
1974490
1975990
1976597
1977214
1978196
1979929
19801828
1981343
1982413
1983493
1984372
1985214
19861117
1987761
1988980
19891029
19901463
1991540
19921077
1993571
19941995
19951840

实例1 均匀格纸(未添加海森格纸)

首先导入需要的库:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

读取表格:

df=pd.read_excel('shixianshuju.xlsx')
# print(df)

flow=list(df['Flow(m3/s)'])
flow_sort=sorted(flow,reverse=True)
# print(len(flow_sort))

特征值计算:

mean_flow=np.mean(flow)
std_flow=np.std(flow)
Cv=std_flow/mean_flow

得Cv=0.65,假定Cs=2Cv,查K值表,得出对应于频率P的Kp值乘以平均流量得出相应Qp值。

Kp1=list(df['Kp1'].dropna())
P1=list(df['P%'].dropna())
# print(Kp1)
Qp=[]
for q in Kp1:
    qi=q*mean_flow
    Qp.append(qi)

最后绘图:

x=P
y=flow_sort
plt.scatter(x,y,label='经验频率')
plt.scatter(P1,Qp)
plt.plot(P1,Qp,label='理论频率')
plt.text(x= 81,y= 3500,s="Cv=0.65\nCs=2Cv", bbox=dict(facecolor="white" ,alpha=0.5) )
plt.title('配线结果',fontsize=10)
plt.xlabel('频率%',fontsize=10)
plt.ylabel('流量(m3/s)',fontsize=10)
plt.legend()
plt.grid()
plt.show()

适线结果如下图所示:

在这里插入图片描述

完整代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df=pd.read_excel('shixianshuju.xlsx')
# print(df)

flow=list(df['Flow(m3/s)'])
flow_sort=sorted(flow,reverse=True)
# print(len(flow_sort))

xuhao=[]
P=[]
for i in range(1,32):
    p=100*(i/(len(range(1,31))+1))
    xuhao.append(i)
    P.append(p)
# print(len(P))

mean_flow=np.mean(flow)
std_flow=np.std(flow)
Cv=std_flow/mean_flow

# 得Cv=0.65,假定Cs=2Cv,查K值表,得出对应于频率P的Kp值乘以平均流量得出相应Qp值
Kp1=list(df['Kp1'].dropna())
P1=list(df['P%'].dropna())
# print(Kp1)
Qp=[]
for q in Kp1:
    qi=q*mean_flow
    Qp.append(qi)
# print(Qp)

import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']     # 显示中文
# 为了坐标轴负号正常显示。matplotlib默认不支持中文,设置中文字体后,负号会显示异常。需要手动将坐标轴负号设为False才能正常显示负号。
matplotlib.rcParams['axes.unicode_minus'] = False

x=P
y=flow_sort
plt.scatter(x,y,label='经验频率')
plt.scatter(P1,Qp)
plt.plot(P1,Qp,label='理论频率')
plt.text(x= 81,y= 3500,s="Cv=0.65\nCs=2Cv", bbox=dict(facecolor="white" ,alpha=0.5) )
plt.title('配线结果',fontsize=10)
plt.xlabel('频率%',fontsize=10)
plt.ylabel('流量(m3/s)',fontsize=10)
plt.legend()
plt.grid()
plt.show()

实例2 非均匀格纸(添加海森格纸)

导入需要的库:

from scipy.special import gdtrix, ndtri     #引入伽马累积分布函数的反函数与正态分布的分位数,
import matplotlib.pylab as plt
import numpy as np
import pandas as pd

定义概率密度计算函数与统计参数计算函数:

def xtrans(plist):  # plist传入的是一个p值列表数据,plist必须是概率值,返回的xplist也是一个列表数据
    xzero = ndtri(0.0001)
    xplist = []
    for i in range(len(plist)):
        xplisti = ndtri(plist[i] / 100)
        xplisti -= xzero
        xplist.append(xplisti)
    return xplist
def jlxs(plist, cs):
    aa = 4 / cs ** 2    #即公式中的阿尔法值
    tp = []  # 为求离均系数fp,tp是过渡
    fp = []
    for i in range(len(plist)):  # 离均系数fp
        tpi = round(gdtrix(1, aa, 1 - plist[i] / 100), 3)  # 采用了标准伽马分布,a=1
        fpi = round(cs * tpi / 2 - 2 / cs, 3)
        tp.append(tpi)
        fp.append(fpi)
    return fp  # 返回的fp也是一个列表数据

读取数据:

df=pd.read_excel('shixianshuju.xlsx')
Q=list(df['Flow(m3/s)'])

绘制坐标轴,建立海森格纸:

pstandard = [0.01,0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 3.0, 5.0, 10.0, 20.0,30.0, 40.0, 50.0, 60.0, 70.0,80.0, 90.0, 95.0, 97.0, 99.0, 99.5, 99.9]
x_axis = [str(i) + '' for i in pstandard]
x = xtrans(pstandard)
y_axis = np.linspace(0, round(max(Q) * 1.2, 2), 10, dtype=np.float32)

绘制原始数据的散点图:

qj = np.mean(Q)
qcv = np.std(Q) * np.sqrt(len(Q) / (len(Q) - 1)) / qj  # 无偏估计的cv值,标准差除均值
Q.sort(reverse=True)
# print(Q)
pq = [(i + 1) *100/ (len(Q) + 1) for i in range(len(Q))]  # Q的经验频率 P=m/(n+1),通过期望公式,见书本P50
# print(pq)
pqx = xtrans(pq)
plt.scatter(pqx, Q)

绘制预测的概率曲线,需要知道Cs、Cv以及均值:

n = 2  # 是自定义值
cs = n * qcv
qpredict = [qj * (qcv * m + 1) for m in jlxs(pstandard, cs)]

最后绘图:

plt.plot(x, qpredict, 'r', '-')
font2={'family':'SimHei','size':16,'color':'k'}
plt.title('P-III曲线拟合',fontdict=font2)
plt.xlabel('频率(%)',fontdict=font2)
plt.ylabel('流量(m^3/s)',fontdict=font2)
plt.text(x=5, y=2200, s="mean_value={:.2f}\nCv=0.65\nCs=2Cv".format(qj,cs, qcv), size = 15, family = "Times New Roman", color = "black", weight = "normal",bbox = dict(facecolor = "w", alpha = 1))
plt.show()

结果如下图所示:

在这里插入图片描述

完整代码如下:

from scipy.special import gdtrix, ndtri     #引入伽马累积分布函数的反函数与正态分布的分位数,
import matplotlib.pylab as plt
import numpy as np
import pandas as pd

def xtrans(plist):  # plist传入的是一个p值列表数据,plist必须是概率值,返回的xplist也是一个列表数据
    xzero = ndtri(0.0001)
    xplist = []
    for i in range(len(plist)):
        xplisti = ndtri(plist[i] / 100)
        xplisti -= xzero
        xplist.append(xplisti)
    return xplist
def jlxs(plist, cs):
    aa = 4 / cs ** 2    #即公式中的阿尔法值
    tp = []  # 为求离均系数fp,tp是过渡
    fp = []
    for i in range(len(plist)):  # 离均系数fp
        tpi = round(gdtrix(1, aa, 1 - plist[i] / 100), 3)  # 采用了标准伽马分布,a=1
        fpi = round(cs * tpi / 2 - 2 / cs, 3)
        tp.append(tpi)
        fp.append(fpi)
    return fp  # 返回的fp也是一个列表数据


df=pd.read_excel('shixianshuju.xlsx')
Q=list(df['Flow(m3/s)'])

# 坐标轴的绘制
# pstandard = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 3.0, 5.0, 10.0, 20.0, 25.0,30.0, 40.0, 50.0, 60.0, 70.0, 75.0, 80.0, 90.0, 95.0, 97.0, 99.0, 99.5, 99.9]
pstandard = [0.01,0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 3.0, 5.0, 10.0, 20.0,30.0, 40.0, 50.0, 60.0, 70.0,80.0, 90.0, 95.0, 97.0, 99.0, 99.5, 99.9]
x_axis = [str(i) + '' for i in pstandard]
x = xtrans(pstandard)
y_axis = np.linspace(0, round(max(Q) * 1.2, 2), 10, dtype=np.float32)
#print(x_axis, y_axis, sep='\n')
# print(x)
# 建立海森图纸张,需要知道Q的最大值来确定横坐标的上限
fig = plt.figure(figsize=(12,6))
ax1 = fig.add_subplot(111)
for i in range(len(x)):
    plt.vlines(x[i], 0, round(max(Q) * 1.2, 2), 'blue', '--')
for j in range(len(y_axis)):
    plt.hlines(y_axis[j], 0, max(y_axis), 'blue', '--')
plt.xticks(x, x_axis, color='black', rotation=0)
plt.yticks(y_axis, y_axis, color='black', rotation=0)
plt.ylim(0, round(max(Q) * 1.2, 2))
plt.xlim(0, round(max(x) + 0.1, 2))
plt.tick_params(labelsize=10)
# 绘制原始数据的散点图
qj = np.mean(Q)
qcv = np.std(Q) * np.sqrt(len(Q) / (len(Q) - 1)) / qj  # 无偏估计的cv值,标准差除均值
Q.sort(reverse=True)
# print(Q)
pq = [(i + 1) *100/ (len(Q) + 1) for i in range(len(Q))]  # Q的经验频率 P=m/(n+1),通过期望公式,见书本P50
# print(pq)
pqx = xtrans(pq)
plt.scatter(pqx, Q)
# 绘制预测的概率曲线,需要知道cs,cv,qj(均值)
n = 2  # 是自定义值
cs = n * qcv
qpredict = [qj * (qcv * m + 1) for m in jlxs(pstandard, cs)]
plt.plot(x, qpredict, 'r', '-')
font2={'family':'SimHei','size':16,'color':'k'}
plt.title('P-III曲线拟合',fontdict=font2)
plt.xlabel('频率(%)',fontdict=font2)
plt.ylabel('流量(m^3/s)',fontdict=font2)
plt.text(x=5, y=2200, s="mean_value={:.2f}\nCv=0.65\nCs=2Cv".format(qj,cs, qcv), size = 15,\
         family = "Times New Roman", color = "black", weight = "normal",\
         bbox = dict(facecolor = "w", alpha = 1))
plt.show()

3.2 水文数据分析——Mann-Kendall(MK)检验

Mann-Kendall

  • 29
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
P-III水文频率分析软件是一种用于水文学领域的专业软件。它能够根据历史水文数据和统计学方法,进行水文频率分析,从而推断不同概率的降雨及洪水等水文事件的发生概率。 P-III水文频率分析软件具有以下特点和功能: 1. 数据处理能力:软件可以处理大量的水文数据,包括降雨量、径流等信息,能够对数据进行清洗、整理和校正,确保数据的准确性和可靠性。 2. 分析和模建立:软件基于概率论和统计学原理,可以进行频率分析和概率模的建立。通过对历史水文数据的统计分析,可以得到不同概率的降雨和洪水的预测结果。 3. 统计分析功能:软件提供了丰富的统计分析功能,包括均值、方差、相关性等统计指标的计。用户可以通过这些统计指标来评估水文数据的特征和趋势。 4. 图形输出:软件可以生成各种图表和图形,直观地展示水文数据的分布和趋势。用户可以通过这些图形来理解和分析水文数据的特征和变化情况。 5. 预测功能:软件基于统计模,可以对未来的水文事件进行预测。用户可以根据软件提供的预测结果,制定相应的水资源管理和防洪措施。 总之,P-III水文频率分析软件是一种功能强大的专业工具,能够帮助水文学领域的专业人员进行水文频率分析和预测,为水资源管理和防洪工作提供科学依据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值