P3分布推求设计频率年降水量的python程序

水文上常用皮尔逊三型分布(P3分布)推算设计频率的水文变量,比如降水量、流量、径流量,等等。本文给出了一个利用P3分布推算设计频率下的年降水量的python程序。

P3分布的概率密度函数如下:

f(x)=\tfrac{\beta ^{\alpha }}{\Gamma (\alpha )}(x-x_{0})^{\alpha -1}e^{-(x-x_{0})\beta }

其中:

\alpha =\tfrac{4}{Cs^{2}}

\beta =\tfrac{2}{E(x)CsCv}

x_{0}=E(x)(1-\tfrac{2Cv}{Cs})

Cv是变差系数,\large Cv=\tfrac{\sigma }{\bar{x}},Cs是偏态系数。

以下是程序全部代码,代码运行所需文件已经上传。

import pandas as pd
import math as mt
import numpy as np


ws=pd.read_excel('年降水量系列.xlsx')
pdata=ws.iloc[:,1]#导入降水系列数据

#计算样本统计参数
mean=np.mean(pdata) #降水系列的均值
std=np.std(pdata) #降水系列的标准偏差
Cs=pdata.skew() #降水系列的偏态系数
Cv=std/mean #降水系列的变差系数
max=max(pdata) #最大值
min=min(pdata) #最小值

#计算P3分布统计参数
alpha=4/Cs**2 #参数alpha
beta=2/(mean*Cs*Cv) #参数beta
x0=mean*(1-2*Cv/Cs) #参数x0

pmp=max+3*std #构造极端最大降水量
pseq=[i for i in range(mt.ceil(pmp/10)*10,mt.floor(x0/10)*10,-10)] #构造降水等差序列
seq=[i for i in range(1,len(pseq)+1)] #将降水等差序列排序

quantiles=[]#计算p3分布各分位点的概率密度函数值
for i in range(len(pseq)):
    quantile=beta**alpha/mt.gamma(alpha)*(pseq[i]-x0)**(alpha-1)*mt.exp(-(pseq[i]-x0)*beta)
    quantiles.append(quantile)
    
probabilities=[]#计算各分位点之间的区间概率
probabilities.append(0)
for i in range(1,len(quantiles)):
    probability=(quantiles[i-1]+quantiles[i])*(pseq[i-1]-pseq[i])/2
    probabilities.append(probability)
    
accum_probblts=[]#计算累计概率
for i in range(len(probabilities)):
    accum_probblts.append(sum(probabilities[:i+1]))

def Linterpo(x,y,xi):
    if xi<x[0]:
        yi=y[0]+(xi-x[0])/(x[0]-x[1])*(y[0]-y[1])
    if xi>x[-1]:
        yi=y[-1]+(xi-x[-1])/(x[-1]-x[-2])*(y[-1]-y[-2])
    else:
        for j in range(len(x)):
            if xi>=x[j] and xi<x[j+1]:
                yi=y[j]+(xi-x[j])/(x[j+1]-x[j])*(y[j+1]-y[j])
    return yi

p=[1/10000,1/1000,1/100,1/50,1/30,1/20,1/10,1/5] #设计频率
for i in range(len(p)):
    pp=round(Linterpo(accum_probblts,pseq,p[i]),1)
    print(str(round(p[i]*100,1))+'%设计频率的年降水量是'+str(pp)+'mm')

程序运行结果如下:

### 回答1: 首先,我们需要确定数列的通项公式。假设数列的第n项为an,第n-1项为an-1,第n-2项为an-2。那么根据递推公式,可以得到 an = f(an-1, an-2) 以下是一个示例程序,求斐波那契数列的通项: ``` def fibonacci(n): if n == 1 or n == 2: return 1 else: return fibonacci(n-1) + fibonacci(n-2) for i in range(1, 11): print(fibonacci(i)) ``` 这个程序使用递归来实现斐波那契数列的通项公式,递归会继续调用函数直到n=1或n=2为止,然后返回1。然后在主程序中使用for循环输出1-10项的斐波那契数列。 需要注意,如果n很大,这种递归方式会很慢,因为它会导致重复计算。可以使用循环来优化程序。 ### 回答2: 可以使用递归或循环的方式编写一个根据数列递推求其通项的Python程序。 方法一:使用递归函数 递归函数是指在函数调用时调用自己的函数。编写程序时,可以使用递归函数来实现数列的递推求通项。 ```python def recursive_formula(n): # 设置递归的终止条件,当n为0或1时,直接返回相应的值 if n == 0: return 0 elif n == 1: return 1 else: # 其他情况下使用递归调用函数自身进行递推 return 2 * recursive_formula(n - 1) + 3 * recursive_formula(n - 2) # 输入需要计算通项的数列项数 n = int(input("请输入需要计算通项的数列项数: ")) # 调用递归函数获取结果 result = recursive_formula(n) print("数列第{}项的通项为:{}".format(n, result)) ``` 方法二:使用循环求解 除了递归函数,我们还可以使用循环的方式来递推计算数列的通项。 ```python def iterative_formula(n): # 初始化数列的前两项 a, b = 0, 1 # 使用循环进行递推 for i in range(2, n+1): c = 2 * b + 3 * a a, b = b, c return b # 输入需要计算通项的数列项数 n = int(input("请输入需要计算通项的数列项数: ")) # 调用循环函数获取结果 result = iterative_formula(n) print("数列第{}项的通项为:{}".format(n, result)) ``` 以上两种方法都可以用来编写一个根据数列递推求其通项的Python程序。具体选择哪种方法可以根据实际需求和数列的复杂度进行选择。 ### 回答3: 下面是一个根据数列递推求其通项的 Python 程序的示例: ```python def calculate_nth_term(sequence): length = len(sequence) if length <= 1: return "该数列无法递推" diff = sequence[1] - sequence[0] if all(sequence[i + 1] - sequence[i] == diff for i in range(length - 1)): return "该数列是等差数列,通项公式为:an = a1 + (n-1)*d" ratio = sequence[1] / sequence[0] if all(sequence[i + 1] / sequence[i] == ratio for i in range(length - 1)): return "该数列是等比数列,通项公式为:an = a1 * r**(n-1)" return "该数列既不是等差数列也不是等比数列,无法求通项" sequence = [1, 3, 5, 7, 9] nth_term = calculate_nth_term(sequence) print(nth_term) ``` 该程序首先检查数列的长度,如果长度小于等于1,则无法递推,直接返回结果。接着该程序通过计算数列中相邻两个元素的差值,判断数列是否是等差数列。如果是等差数列,即所有相邻元素的差值都相等,将返回该数列的通项公式。如果数列不是等差数列,则程序会计算数列中相邻两个元素的比值,判断数列是否是等比数列。如果是等比数列,即所有相邻元素的比值都相等,将返回该数列的通项公式。如果数列既不是等差数列也不是等比数列,则无法求得通项公式。在示例中,数列[1, 3, 5, 7, 9]是等差数列,所以程序会返回等差数列的通项公式。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值