跳转至

水库防洪泄流调度

背景

水库可以在预报洪峰到来前提前泄流,腾出临时防洪库容,再随洪水过程 消退恢复蓄水。调度必须同时满足安全库容范围和有限泄流能力,并在事件 结束后保留合适的水量。

本例针对一条确定性的 10 天入流过程优化泄流,是一个具有明确体积和 流量单位的紧凑水资源最优控制问题。

水量平衡模型

\(S(t)\) 为水库库容,单位是百万立方米;\(q(t)\) 为受控泄流量,单位是 百万立方米/天。预报入流过程为

\[ q_{\mathrm{in}}(t) =3+18\exp\left[ -\left(\frac{t-4}{1.4}\right)^2 \right] \qquad \left[\mathrm{million\ m^3/day}\right]. \]

省略降水、蒸发、渗漏和非受控溢流后,集总水量守恒方程为

\[ \dot S(t)=q_{\mathrm{in}}(t)-q(t). \]

因此库容和泄流历程在整个时域内应满足

\[ S(t)-S(0)= \int_0^t\left[q_{\mathrm{in}}(s)-q(s)\right]\,\mathrm ds. \]

目标函数与约束

时域为 \(T=10\ \mathrm{days}\)。归一化目标函数使库容保持在 4000 万 m³ 参考值附近,同时避免泄流无必要地偏离 500 万 m³/天参考值:

\[ \min J=\int_0^{10} \left[ \left(\frac{S-40}{40}\right)^2 +0.025\left(\frac{q-5}{10}\right)^2 \right]\,\mathrm dt. \]

初始与终端库容相同:

\[ S(0)=S(10)=40\ \mathrm{million\ m^3}. \]

因此优化器不能通过在事件结束时留下一座空库来降低代价。运行约束为

\[ 20\le S(t)\le80\ \mathrm{million\ m^3}, \qquad 0\le q(t)\le15\ \mathrm{million\ m^3/day}. \]

变量、参数与单位

符号 含义 数值或单位
\(t\) 从预报起点计的时间 day
\(S\) 水库库容 百万 m³
\(q_{\mathrm{in}}\) 预报入流 百万 m³/day
\(q\) 受控下泄流量 百万 m³/day
\(S_{\min},S_{\max}\) 运行库容边界 \(20,\ 80\) 百万 m³
\(q_{\max}\) 泄流能力上限 \(15\) 百万 m³/day
\(J\) 归一化惩罚的积分 day

建模选择与适用边界

终端库容约束使不同 10 天调度具有可比性,并表示事件结束后的库存恢复 要求。目标函数先对两个量进行尺度化,因此权重不能直接解释为实际损失 价格。离散采用 \(100\times2\) Lobatto 网格,初始泄流猜测取预报平均入流。

模型假定洪水过程完全已知,只包含一个均匀库容和一个理想泄流口,没有 泄流变化率、河道演进延迟、尾水效应、溢洪道逻辑、蒸发、生态最小流量、 下游支流、预报不确定性或滚动时域更新。它展示确定性泄流调度方法,并非 可直接投入运行的防洪调度规则。

运行示例

python -m examples.reservoir_flood_control

保存图片且不打开窗口:

python -m examples.reservoir_flood_control --save reservoir-flood-control.png --no-show

独立数值验证

脚本在 4,001 个时刻重构解,检查库容与泄流边界,并对每个时域前缀上的 \(q_{\mathrm{in}}-q\) 独立作累计梯形积分。所报告的残差是上述守恒恒等式 在全时域内的最大绝对偏差,而不只是终端体积误差。

指标 验证值
目标函数 \(J\) \(0.09006368\)
最小库容 \(36.589691\ \mathrm{million\ m^3}\)
最大库容 \(43.411201\ \mathrm{million\ m^3}\)
最大泄流 \(15.000000\ \mathrm{million\ m^3/day}\)
全时域最大累计水量守恒残差 \(2.248\times10^{-2}\ \mathrm{million\ m^3}\)

累计残差为 0.02248 百万 m³,即约 22,480 m³,低于脚本设定的 0.03 百万 m³ 验证容差;它来自密集插值和数值求积,并不表示模型中存在 未说明的水源。洪水期间最大泄流达到泄流能力边界。

水库库容、预报入流与优化泄流,以及累计入流和累计泄流体积

源代码

完整可运行示例见: examples/reservoir_flood_control.py