首页 › 技术知识 › 工程笔记 › 算法笔记 › 率定曲线拟合:水位到流量的换算
算法笔记 水文 率定水位流量曲线拟合水文

率定曲线拟合:水位到流量的换算

Stage-Discharge Rating Curve Fitting

水位站的流量不是测出来的,是查"率定曲线"得到的。但率定曲线怎么拟合?幂律还是多项式?外推时怎么处理?这是水文数据处理的隐藏环节。

约 2084 字· 6 分钟阅读

率定曲线的物理基础

河道流量 Q 与水位 h 的关系:

  • Q = A × v(过水面积 × 流速)
  • 流速 v 受水位、坡度、糙率影响(曼宁公式 v = (1/n) × R^(2/3) × S^(1/2))
  • A 随 h 增大而增大(断面形状决定)

对天然河道,Q 与 h 的关系近似幂律:

  • Q = a × (h - h0)^b
  • h0 是"零流量水位"(断流水位)
  • a, b 是拟合参数,b 通常 1.5~2.5

拟合方法

方法一:幂律拟合

数据取对数后线性回归:

  • ln(Q) = ln(a) + b × ln(h - h0)

参数 a、b、h0 都要拟合。h0 不易直接确定,需要试错或物理意义(河床最低点)。

方法二:多项式拟合

Q = a0 + a1 × h + a2 × h² + ...

多项式拟合灵活,但外推时容易发散——高次多项式在数据范围外迅速偏离物理意义。

方法三:分段拟合

把水位范围分为低水、中水、高水三段,各段独立拟合:

  • 低水段:幂律,h 接近 h0 时 Q 趋于 0
  • 中水段:幂律或多项式
  • 高水段:幂律或线性(漫滩后线性化)

水文业务中最常用幂律分段拟合。

实战代码(Python)

```python import numpy as np from scipy.optimize import curve_fit

def rating_curve(h, a, b, h0): """幂律率定曲线 Q = a * (h - h0)^b""" return a * np.power(h - h0, b)

def fit_rating(water_levels, discharges, h0_init=None): """拟合率定曲线

water_levels: 实测水位 (m) discharges: 实测流量 (m³/s) h0_init: 零流量水位初值(可选,不提供则用最低水位 - 0.5) """ if h0_init is None: h0_init = np.min(water_levels) - 0.5

# 用对数变换估算初值 h_eff = water_levels - h0_init log_h = np.log(h_eff) log_Q = np.log(discharges) slope, intercept = np.polyfit(log_h, log_Q, 1) a_init = np.exp(intercept) b_init = slope

# 非线性拟合 popt, pcov = curve_fit( rating_curve, water_levels, discharges, p0=[a_init, b_init, h0_init], bounds=([0, 1, -np.inf], [np.inf, 5, np.max(water_levels)]) )

return popt # (a, b, h0)

模拟:实测数据

h = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]) Q = np.array([0.5, 1.2, 2.5, 4.5, 7.2, 10.8, 15.2, 20.5, 27.0]) a, b, h0 = fit_rating(h, Q) print(f"率定曲线: Q = {a:.3f} * (h - {h0:.3f})^{b:.3f}") print(f"零流量水位 h0 = {h0:.3f} m")

验证

h_test = np.array([2.2, 3.8, 4.8]) Q_pred = rating_curve(h_test, a, b, h0) print(f"预测流量: {Q_pred}") ```

外推的风险

率定曲线的最大问题是实测数据范围有限:

  • 平水期实测集中在低水段
  • 大洪水实测少(人员难到现场、设备量程不够)
  • 据率定曲线外推到百年洪水,误差可能 ±30%

外推的合理做法

  1. 物理约束:高水段不能偏离曼宁公式
  2. 断面模型:用断面地形 + 曼宁公式做高水段外推
  3. 相似流域类比:用相邻流域的高水段率定关系

不要纯数学外推——多项式在高水段可能给出负流量或过高流量。

率定曲线的时效性

河道会变化(冲淤、水草、人工改造),率定曲线不是一次定终身:

  • 稳定河床:1~2 年复测
  • 易冲淤河床:每场大洪水后复测
  • 施工期间:每季度复测

某站"率定曲线 5 年未复测"的流量数据,洪水期误差可能 ±30%——这是水文数据"看似完整实则不准"的典型。

一个被忽视的:h0 的稳定性

零流量水位 h0 不是常数:

  • 河床淤积:h0 上升
  • 河床冲刷:h0 下降
  • 拦河坝建设:h0 突变

每次复测率定曲线,h0 也要重新拟合。固定 h0 拟合 a、b 会让曲线偏离实际。

数据质量

率定数据的来源:

  • 流速仪测流:传统方法,人工操作,精度 ±5~10%
  • ADCP 走航测流:现代方法,精度 ±3~5%
  • 超声波时差法:固定式,连续测,精度 ±3~5%

拟合时要用各数据点的不确定度加权(精度高的权重大)。很多业务系统等权拟合,精度低的数据点会拉偏整条曲线。

结语

率定曲线是水文站的"核心算法",但常被简化为"调个拟合函数"。幂律分段拟合 + h0 重新估计 + 物理外推约束 + 周期复测,是水文数据处理的稳健配置。看似"完整"的流量数据,如果率定曲线 5 年未复测,洪水期可信度可能远低于宣称。