
水文模型代码与建模:VIC模型、集中式模型及LSTM径流预测模拟模型的优化与实现
水文模型这玩意儿玩的就是用代码把自然界的复杂水循环装进计算机。咱们搞建模的日常就是在
集中式和分布式模型之间反复横跳。先说说老牌选手VIC模型,这哥们擅长处理空间异质性,但配置起来那
叫一个酸爽。相比之下,新安江这类集中式模型简直就是新手村福利,三五行代码就能跑出像样的结果。
最近两年LSTM模型在径流预测圈杀疯了,给大家看个实战片段:
```python
class StreamLSTM(nn.Module):
def __init__(self, input_size=5):
super().__init__()
self.lstm = nn.LSTM(input_size, 64, num_layers=2, dropout=0.2)
self.fc = nn.Sequential(
nn.Linear(64, 32),
nn.ReLU(),
nn.Dropout(0.1),
nn.Linear(32, 1))
def forward(self, x):
out, (h_n, c_n) = self.lstm(x)
return self.fc(out[-1])
```
这段网络结构暗藏玄机:双LSTM层配合随机失活,既能捕捉长时序依赖又防过拟合。输入层5个特征
对应降水、气温、前期流量等关键因子,输出层直接怼径流量预测。注意最后只取时间序列末端的输出,这
个设计让模型自动关注关键时间窗。
参数优化这块儿,传统智能算法依然能打。比如SCE-UA这个老江湖,在GR4J模型率定时简直稳如老
狗:
```python
def calibrate_gr4j(params):
X1, X2, X3, X4 = params
simulated = gr4j_model.run(X1, X2, X3, X4)
return nse(observed, simulated)
optimizer = SCEUA(calibrate_gr4j, bounds=[(0,10), (-5,5), (10,600), (0.5,4)])