如何在R语言函数内编写多循环,利用历史值迭代计算z等水文相关指标
R实现带历史值依赖的迭代计算方案
实现逻辑
该计算属于典型的递推迭代场景,每一步的计算完全依赖前一步的水位、蓄水量、出流量结果,我们可以先提前预分配结果存储空间,再用for循环逐位计算即可,注意不要用R的保留字in作为变量名,避免语法报错。
完整实现代码
cal_water_level <- function(q, init_z = 190, init_s = 24011, time_step = 0.3) { # 预分配结果矩阵,行数和q的长度一致 n <- length(q) res <- matrix(NA, nrow = n, ncol = 4, dimnames = list(NULL, c("z", "q", "outflows", "storages"))) res[, "q"] <- q # 填入第一行初始结果 res[1, "z"] <- init_z res[1, "storages"] <- init_s res[1, "outflows"] <- 1.86 * sqrt((res[1, "z"] - 110) * 19.62) # 循环计算第2行到最后一行的结果 for (i in 2:n) { # 提取前一步的历史值 prev_z <- res[i-1, "z"] prev_s <- res[i-1, "storages"] prev_out <- res[i-1, "outflows"] prev_in <- res[i-1, "q"] # 计算当前步的各指标 curr_z <- prev_z + time_step * ((prev_in - prev_out) / prev_s) curr_out <- 1.86 * sqrt((curr_z - 110) * 19.62) ds <- time_step * ((prev_in + res[i, "q"])/2 - (prev_out + curr_out)/2) curr_s <- prev_s + ds # 填入当前步计算结果 res[i, "z"] <- curr_z res[i, "outflows"] <- curr_out res[i, "storages"] <- curr_s } return(res) } # 测试调用 q <- c(10, 15.83333, 21.66667) result <- cal_water_level(q) print(result, digits = 5)
运行输出
z q outflows storages [1,] 190.000 10.00000 73.6898 24011.0 [2,] 189.999 15.83333 73.6894 23992.8 [3,] 189.998 21.66667 73.6891 23976.3
和你给出的预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Hüsamettin Tayşi
相关产品推荐
相关产品推荐

