基于根区水量平衡的最优灌溉调度¶
背景¶
灌溉调度既要在干旱阶段保护作物,也要避免施加不必要的水量。降雨、作物需水、土壤储水和深层渗漏均随时间变化,而实际阀门无法瞬时改变流量。本例利用 14 天的天气预报,在总灌溉量与一个平滑的水分胁迫产量损失代理指标之间权衡。
状态量是高于萎蔫点的植物可利用水量。硬性储水下限用于防止严重缺水,软性胁迫惩罚则用于区分均满足硬约束的不同计划,并鼓励在最有价值的时段供水。
问题定义¶
令 \(S(t)\) 为根区储水量,\(i(t)\) 为灌溉率,\(u(t)=\dot i(t)\) 为阀门爬升指令。预报的有效降雨和作物潜在蒸散分别为
平滑吸水因子
在萎蔫点 \(S=0\) 时为零,在根区容量 \(S=C\) 时为一。实际蒸散为 \(ET_a=ET_p f(S)\)。深层渗漏采用
因此储水接近容量时,渗漏会快速上升。动力学为
无量纲目标函数为
第一项计入施水代价,第二项是基于水分胁迫的产量损失代理指标,第三项抑制阀门快速动作。第二项不是机理性的作物产量方程。
端点与路径约束为
变量、参数与单位¶
| 符号 | 含义 | 数值或单位 |
|---|---|---|
| \(t\) | 时间 | 天 |
| \(S\) | 高于萎蔫点的根区植物可利用水量 | mm |
| \(i\) | 灌溉率 | mm/天 |
| \(u=\dot i\) | 灌溉率爬升速度 | mm/天² |
| \(R\) | 有效降雨 | mm/天 |
| \(ET_p,ET_a\) | 潜在与实际蒸散 | mm/天 |
| \(D\) | 深层渗漏 | mm/天 |
| \(C\) | 根区容量 | \(110\) mm |
| \(S_{50}\) | 在 \(C\) 点归一化前的 Michaelis-Menten 储水尺度 | \(24\) mm |
| \(d_C\) | 根区满容量时的渗漏率 | \(2.2\) mm/天 |
| \(w_i\) | 灌溉权重 | \(0.030\) mm⁻¹ |
| \(w_s\) | 胁迫权重 | \(1.0\) 天⁻¹ |
| \(w_u\) | 爬升权重 | \(2.0\times10^{-4}\) 天³/mm² |
实现中实际优化的是缩放状态 \(S/C\),以改善数值条件;本文方程和结果均使用实际水深单位。
建模选择¶
灌溉率是状态量,而不是可以不连续跳变的直接控制量。优化其有界导数能够产生连续计划,并使首末零流量条件具有明确含义。脚本采用 \(140\times2\) Lobatto 网格和分段线性插值,因此节点间也能保持灌溉率非负。
令初末储水相同,便于比较整个预报窗口内的总入流和总损失。这只是本调度问题的水量记账条件,不表示天气或作物状态具有周期性。
独立验证¶
密集重构的解必须满足积分水量平衡
以及执行器平衡
脚本在 6,001 个时刻独立计算这两个等式,检查全部状态与执行器边界,并分别报告水量收支各项。
验证结果¶
| 指标 | 验证值 |
|---|---|
| 目标函数 \(J\) | \(1.74128841\) |
| 总灌溉量 | \(50.888617\) mm |
| 有效降雨量 | \(14.091008\) mm |
| 实际蒸散量 | \(63.918972\) mm |
| 深层渗漏量 | \(1.060678\) mm |
| 最小根区储水量 | \(55.962540\) mm |
| 密集网格水量平衡误差 | \(2.437\times10^{-5}\) mm |
| 密集网格执行器平衡误差 | \(1.288\times10^{-6}\) mm/天 |
| 最大密集路径越界量 | \(0\) |
积分总入流为 \(50.888617+14.091008=64.979625\) mm,总损失为 \(63.918972+1.060678=64.979650\) mm;两者的微小差值与独立报告的积分残差一致。

适用边界¶
本计算假设天气预报完全准确、根区空间均匀且可连续灌溉。模型未包含地表径流、输配与施用损失、离散灌溉窗口、水泵启停逻辑、分层土壤和预报不确定性。胁迫项只是平滑的产量代理指标。用于田间调度时,需要校准土壤与作物参数,并加入实际运行约束。
运行示例¶
无界面运行并保存图片:
system, phase = build_problem()
guess = initial_guess(phase)
solution = solve_problem(system, guess)
plot_solution(solution)
源代码¶
完整可运行示例见:
examples/irrigation_scheduling.py。