# 电脑怎样一步步算出洪水？

把连续变化切成小步，看见误差、震荡与稳定。

前置课程：E02 线性水库。本期所有数值均为教学合成数据，待独立专业审稿。

## 一条曲线，怎样变成一串点？

上一期，我们直接用指数公式画出出流曲线。但许多模型没有这么方便的解析解。计算机常用的方法，是从当前状态出发，估计接下来一小段时间的变化，再重复这个过程。

采用恒定入流I=100m³/s、K=10分钟、Q(0)=0，比较解析解Q(t)=100[1−exp(−t/10)]与显式欧拉法。横轴用分钟，流量用m³/s，步长与K必须用相同时间单位。

## 用当前斜率，走完下一步

当前入流减去出流，再除以K，就是曲线此刻的斜率。把斜率乘上步长，加到当前出流上，就得到下一步。这个动作相当于沿着切线走，而真正的曲线，已经在悄悄弯转。

显式更新为Q[n+1]=Q[n]+r(100−Q[n])，r=Δt/K。第一步取Δt=5分钟，Q从0变为50m³/s，而解析解在5分钟为39.35m³/s。切线近似导致本例第一步偏高。

## 步子小一点，会怎样？

让时间步长从五分钟缩到一分钟。每一次沿切线走得更短，转弯时就更容易跟上真正的曲线。可是，计算次数也随之增加。我们追求的是经过检查的精度，而不是一味把步长调到最小。

Δt=1分钟时第一步为10m³/s，解析值9.516m³/s。显式欧拉是第一阶方法，在解足够光滑且其他条件满足时，步长减半通常使全局误差约减半。输入突变还需要切分时段处理，不能直接套光滑性结论。

## 为什么会来回震荡？

如果一步跨得太远，计算值可能直接越过目标。下一步斜率反向，又跨回另一边。对于这个线性方程，步长是K的一到两倍时，误差交替衰减。等于两倍时，误差不再衰减。再大一些，就可能越振越大。

令误差e[n]=Q[n]−100，则e[n+1]=(1−r)e[n]。渐近稳定条件为0<r<2。r=2时，本例出流在0和200之间交替；r=2.5时依次为0、250、−125、437.5，出现非物理解。

## 稳定，不等于足够准确

一个计算结果没有发散，并不说明它已经足够准确。稳定性、非负性和误差，是三个不同的问题。对这个显式更新，想保证非负输入和初值产生非负下一步，步长还需要不大于K。

0<r≤1时更新是旧出流与入流的凸组合，非负性有保证。1<r<2虽然渐近稳定，仍可能超调；本例初值为0时第一次就超过恒定入流。其他方程和求解器有各自的稳定条件，不能把Δt<K推广成所有水利模型的通用规则。

## 怎么知道步长选得合适？

先检查物理边界，再把步长减半，比较峰值、峰现时间和总水量是否还有明显变化。有解析解时直接对照，没有解析解时做收敛检查。下一期，我们把同样的问题从时间移到空间：流域该切成多少块？

本实验计算到60分钟，末步若不足设定步长则使用剩余时间，因此最后一步的r可能较小。浏览器显示原始数值，不把负数截成零。Python算例输出全部节点、解析值和误差。参考链接提供线性水库背景；本期离散式和稳定条件由文中方程直接推导。

## 练习与解释

1. 本例K=10分钟、Δt=25分钟，显式欧拉法怎样？

答案：可能出现负值和放大震荡。Δt/K=2.5，误差乘子为−1.5，绝对值大于1。

2. 结果不发散，能否直接认定足够准确？

答案：不能，还需误差和收敛检查。稳定性与精度不同，应缩小步长并比较关键结果。

3. 对本方程保证非负更新的充分条件是？

答案：0<Δt/K≤1。更新是旧出流和入流的凸组合时，非负性有保证。

## 算例与依据

[下载Python算例](case/reproduce.py)，同目录包含完整模型源码foundation_models.py。运行后生成reference.csv。

[官方技术资料](https://www.hec.usace.army.mil/confluence/hmsdocs/hmstrm/baseflow/linear-reservoir-model)，查阅日期2026-09-15。通用概念参考上述资料；本文简化公式、数据和结论适用范围在各节说明。
