A one-bucket model of an Iowa river will fail honestly. Diagnosing WHERE it fails is the science.
Drawn before it is coded: inputs, states, parameters, and real units.
Time series the world provides: rain, potential evapotranspiration.
What the model remembers between days: storage in the bucket.
Numbers we choose or fit: the two k values.
Keep these three straight and any environmental model becomes readable.
Python
available = storage + max(precip, 0) actual_et = min(max(pet, 0), available) surplus = max(precip - actual_et, 0) quickflow = k_runoff * surplus storage = max(available - actual_et - quickflow, 0) baseflow = k_baseflow * storage flow = quickflow + baseflow
runoff_mm_per_day = Q_m3s * 86.4 / area_km2
Q = discharge (m3/s), from the USGS record
area = 3,271 sq mi = about 8,470 km2 at Iowa City
86.4 = seconds per day / 1e6 * 1000
result: same unit as precipitation
?
pandas reads the station ID "05454500" and prints 5454500. What happened, and where will it bite?
A search with a score, judged on a year the model has not seen.
NSE = 1 - sum((obs - sim)^2) / sum((obs - mean(obs))^2)
NSE = 1: perfect match
NSE = 0: you tied the mean
NSE < 0: the mean beats your model
the rival is always: just predict the mean
?
Two parameter pairs sit in the same RMSE valley. Name two ways to choose between them, and one reason to refuse to choose.
What Iowa does that one bucket cannot, and how the states say so.
Two years of Iowa City rain, temperature-based PET, observed runoff in mm/day.
Calibrate year 1, validate year 2, average the residual by month.
Late-winter and spring residuals point at snowmelt: the bucket has no snow store.
PET = 0.12 * max(T_mean, 0) [mm/day]
T_mean = daily mean temperature (deg C)
0.12 = a crude coefficient, not a law
monotonic with temperature: the right shape
ignores radiation, humidity, wind, crops
| This week | Next week | Bridge idea |
|---|---|---|
| A complete model-test cycle | Final project launch | Now do the whole arc on a question your group chooses |
?
If you could add ONE process to the bucket before rerunning, which buys the most realism per line of code? Defend your pick.