# 洪峰沿河走，为何会变形？

把河段储水与上下游流量连起来。

专题：降雨到洪水。教学合成算例，待独立专业审稿。

## 河段不是一根瞬时传送管

上游流量开始上涨，下游不一定立刻同步。一部分水先留在河段里，随后再释放出去。要解释洪峰的延迟和变化，就要把河段储水也放进模型。

单河段、无侧向入流、无损失，I0=O0=0。每小时上游节点流量为[0,40,100,60,20,0]m³/s，之后为0；峰值滑块按比例缩放。节点之间按线性变化做梯形积分。

## 同样出流，可以有不同储水

涨水时，上游可能比下游流得更快；退水时，情况又会反过来。因此仅用下游流量描述河段储水，往往不够。马斯京根方法把上游和下游流量加权组合，作为一个简化的储水关系。

S=K[XI+(1−X)O]。K固定2小时，X为0—0.25，默认0.2。计算体积时K需换成7200秒。X无量纲，参数通常需要观测资料率定；本例不从河道断面推算。

## 把连续水量账本写成一步

一个时段内，平均入流减去平均出流，乘以时段长度，就是储水变化。用时段两端流量的平均值近似，再代入储水关系，就能求出下一时刻的下游流量。

D=2K(1−X)+Δt，C0=(Δt−2KX)/D，C1=(Δt+2KX)/D，C2=[2K(1−X)−Δt]/D。K与Δt均用小时；Δt=1h。递推O[n+1]=C0I[n+1]+C1I[n]+C2O[n]。

## 三个系数，也有边界条件

三个系数相加等于一，但这还不够。若系数出现负值，正的入流也可能带来不合理的负出流。我们限制滑块范围，让时间步长与参数满足非负条件，再观察过程线怎样变化。

系数非负的条件为2KX≤Δt≤2K(1−X)。本页K=2、Δt=1、X≤0.25满足条件。默认C0=1/21、C1=3/7、C2=11/21。这不是任意参数和步长都可靠的保证，也不代表无限精度。

## 洪峰削低，水是否丢失了

看见下游洪峰降低，不要马上说水变少了。把两条曲线的面积比较一下，还没有流出去的水，应该仍留在河段储量里。只有把剩余储量也加回账本，才能真正检查守恒。

计算到30小时，尾部出流可能仍非零。用梯形积分核对Vin−Vout=S30−S0；显示残余储水与守恒残差，避免误把截断尾部当作损失。默认上游总体积792000m³。

## 什么时候该换更完整的方程

这套方法适合用少量参数近似河段传播，却不能告诉我们每个断面的水位和流速。当回水、闸坝控制、漫滩或流态变化很重要时，需要更完整的水动力描述。下一专题会继续打开这些方程。

经典马斯京根是水文演算，与根据物理河道属性估计系数的Muskingum–Cunge不同。本演示不处理回水、支流、动态分段或漫滩；参数需要覆盖代表性洪水的率定和验证。

## 练习与解释

1. 计算S时K=2小时应怎样与m³/s配合？

答案：转换成7200秒。体积的时间单位必须匹配秒。

2. 下游体积暂小于上游，差额可能在哪里？

答案：河段剩余储量。本例Vin−Vout等于储量增量。

3. 三个系数和为1就足够吗？

答案：还需检查非负条件和适用范围。系数非负受K、X与Δt约束。

## 算例与依据

下载页面上的完整Python算例包，解压后运行 reproduce.py，无需第三方库。模型源为 rainfall_models.py，输出 reference.csv。

[参考资料](https://www.hec.usace.army.mil/confluence/hmsdocs/hmstrm/channel-flow/muskingum-model)，查阅日期2026-09-15。公式、参数和实现简化见正文；来源用于机理核对，不代表本算例经过来源机构认可。
