水库防洪泄流调度¶
背景¶
水库可以在预报洪峰到来前提前泄流,腾出临时防洪库容,再随洪水过程 消退恢复蓄水。调度必须同时满足安全库容范围和有限泄流能力,并在事件 结束后保留合适的水量。
本例针对一条确定性的 10 天入流过程优化泄流,是一个具有明确体积和 流量单位的紧凑水资源最优控制问题。
水量平衡模型¶
令 \(S(t)\) 为水库库容,单位是百万立方米;\(q(t)\) 为受控泄流量,单位是 百万立方米/天。预报入流过程为
省略降水、蒸发、渗漏和非受控溢流后,集总水量守恒方程为
因此库容和泄流历程在整个时域内应满足
目标函数与约束¶
时域为 \(T=10\ \mathrm{days}\)。归一化目标函数使库容保持在 4000 万 m³ 参考值附近,同时避免泄流无必要地偏离 500 万 m³/天参考值:
初始与终端库容相同:
因此优化器不能通过在事件结束时留下一座空库来降低代价。运行约束为
变量、参数与单位¶
| 符号 | 含义 | 数值或单位 |
|---|---|---|
| \(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 网格,初始泄流猜测取预报平均入流。
模型假定洪水过程完全已知,只包含一个均匀库容和一个理想泄流口,没有 泄流变化率、河道演进延迟、尾水效应、溢洪道逻辑、蒸发、生态最小流量、 下游支流、预报不确定性或滚动时域更新。它展示确定性泄流调度方法,并非 可直接投入运行的防洪调度规则。
运行示例¶
保存图片且不打开窗口:
独立数值验证¶
脚本在 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。