极度简单、皆可掌握的XAJ模型。 Rcpp版的XAJ模型为钟睿达师弟所写,使用请正确引用。

1. 输入

只需要输入以下三个变量:

  • prcp : 流域平均降水(mm/d)

  • ET0 : 流域平均潜在蒸散发(ET0)

  • Qobs : 流域出口点流量(m^3/s)

即可实现径流模拟。模拟过程中,XAJ_calibKGE为目标函数,采用sceua实现自动率参。

2. 模型训练

下文模拟的是2021年10月山西暴雨中心的汾河流域,河津站。以2012-2018年作为率定期,将该时段的所有数据拿来训练。可以看到KGE最终可达0.707。

library(hydroTools) # remotes::install_github("rpkgs/hydroTools")

infile = system.file("extdata/XAJ_input_Hejin_2012-2018.rda", package = "hydroTools")
load(infile)

df = input$data
res <- XAJ_calib(df$Qobs, df$prcp, df$ET0, date = df$date,
    input$area, dt = 24, maxn = 1000)
#> 325 best 0.477 function convergence 200 parameter convergence 9649.842 
#> 519 best 0.0861 function convergence 200 parameter convergence 9455.035 
#> 716 best -0.489 function convergence 200 parameter convergence 8643.057 
#> 906 best -0.593 function convergence 200 parameter convergence 6975.272 
#> 1097 best -0.642 function convergence 200 parameter convergence 6156.839

print(str(res), 2)
#> List of 4
#>  $ data        :Classes 'data.table' and 'data.frame':   2556 obs. of  5 variables:
#>   ..$ date: Date[1:2556], format: "2012-01-01" "2012-01-02" ...
#>   ..$ prcp: num [1:2556] 0 0.02 0.04 0.25 0.01 0 0.87 0.01 0 0 ...
#>   ..$ ET0 : num [1:2556] 0.28 0.77 0.715 0.35 0.275 ...
#>   ..$ Qobs: num [1:2556] 23.2 21.1 20.5 21.9 19.6 18.5 20.7 20.7 19.3 20.8 ...
#>   ..$ Qsim: num [1:2556] 0 -4.9 -3.9 -3.55 -3.19 ...
#>   ..- attr(*, ".internal.selfref")=<externalptr> 
#>  $ gof         : tibble [1 × 11] (S3: tbl_df/tbl/data.frame)
#>   ..$ R        : num 0.663
#>   ..$ pvalue   : num 2.78e-303
#>   ..$ R2       : num 0.439
#>   ..$ NSE      : num 0.247
#>   ..$ KGE      : num 0.643
#>   ..$ RMSE     : num 27.1
#>   ..$ MAE      : num 16.4
#>   ..$ Bias     : num -1.88
#>   ..$ Bias_perc: num -0.0705
#>   ..$ AI       : num 0.8
#>   ..$ n_sim    : int 2400
#>  $ model       :List of 3
#>   ..$ par : Named num [1:15] 1.46253 0.00941 19.91181 88.02784 47.71311 ...
#>   .. ..- attr(*, "names")= chr [1:15] "KC" "IM" "WUM" "WLM" ...
#>   ..$ area: num 38900
#>   ..$ dt  : num 24
#>  $ intermediate:'data.frame':    2556 obs. of  17 variables:
#>   ..$ date: Date[1:2556], format: "2012-01-01" "2012-01-02" ...
#>   ..$ E   : num [1:2556] 0.409 1.126 1.046 0.512 0.402 ...
#>   ..$ EU  : num [1:2556] 0.409 1.126 1.046 0.512 0.402 ...
#>   ..$ EL  : num [1:2556] 0 0 0 0 0 0 0 0 0 0 ...
#>   ..$ ED  : num [1:2556] 0 0 0 0 0 0 0 0 0 0 ...
#>   ..$ W   : num [1:2556] 124 123 122 122 121 ...
#>   ..$ WU  : num [1:2556] 15.5 14.4 13.4 13.1 12.8 ...
#>   ..$ WL  : num [1:2556] 70.4 70.4 70.4 70.4 70.4 ...
#>   ..$ WD  : num [1:2556] 38.2 38.2 38.2 38.2 38.2 ...
#>   ..$ R   : num [1:2556] 0 0 0 0 0 ...
#>   ..$ RS  : num [1:2556] 0.00 1.88e-04 3.77e-04 2.35e-03 9.41e-05 ...
#>   ..$ RI  : num [1:2556] 1.05592 -0.104926 0.010447 -0.001054 0.000106 ...
#>   ..$ RG  : num [1:2556] 7.30e-01 -7.25e-02 7.22e-03 -7.29e-04 7.34e-05 ...
#>   ..$ Q   : num [1:2556] 0 -4.9 -3.9 -3.55 -3.19 ...
#>   ..$ QS  : num [1:2556] 0.00 3.70e-07 1.45e-06 7.40e-06 1.44e-05 ...
#>   ..$ QI  : num [1:2556] 0 -4.01 -3.12 -2.78 -2.43 ...
#>   ..$ QG  : num [1:2556] 0 -0.885 -0.78 -0.774 -0.759 ...
#> NULL

从图来看,模型整体模拟结果尚可。但部分洪水过程无法捕捉到(如2018年春秋季节),怀疑是流域内水库放水的人为活动影响所致。

df_q = res$data[, c("date", "Qobs", "Qsim")]
df_prcp = res$data[, c("date", "prcp")]
# plot_calib(res$data, main = input$site)
plot_runoff(df_q, df_prcp, ylim2 = c(60, 0), legend.position = c(1, 0.6))

3. 模型验证

将2021年山西暴雨期间的气象数据输入,即可得到2021年山西暴雨洪水的模拟情况。这里暂且假设2021的气象数据newdata已知(用之前的数据df代替)。

newdata需包含如下变量:

  • prcp : 流域平均降水(mm / d)

  • ET0 : 流域平均潜在蒸散发(ET0)

  • date : (optional) 对应的时间信息

newdata带入即可得到验证期的径流模拟情况:

res_valid = XAJ_predict(res$model, newdata = df)
head(res_valid)
#> Key: <date>
#>          date  Qobs  prcp       ET0      Qsim
#>        <Date> <num> <num>     <num>     <num>
#> 1: 2012-01-01  23.2  0.00 0.2798821  0.000000
#> 2: 2012-01-02  21.1  0.02 0.7696797 -4.895675
#> 3: 2012-01-03  20.5  0.04 0.7152260 -3.899073
#> 4: 2012-01-04  21.9  0.25 0.3498458 -3.550606
#> 5: 2012-01-05  19.6  0.01 0.2750719 -3.190192
#> 6: 2012-01-06  18.5  0.00 0.3265188 -2.877882

安装方法

remotes::install_github("rpkgs/hydroTools")

使用请正确引用

  1. Dongdong Kong and Ruida Zhong (2021). hydroTools: Tools for hydrological model. R package version 0.1.4.

  2. Ruida Zhong, Dongdong Kong, Xiaohong Chen, Zhaoli Wang and Chengguang Lai (2021). VIC5: The Variable Infiltration Capacity (VIC) Hydrological Model. R package version 0.2.4. https://CRAN.R-project.org/package=VIC5

  3. Ruida Zhong (2018). XAJ: An R implementation of three-source Xinanjiang model by Renjun Zhao. R package version 0.0.1. https://github.com/Sibada/XAJ