nleqslv:边界条件(“值不小于”)是否可能?

时间:2020-06-01 08:11:19

标签: r nonlinear-optimization

我有一个非线性优化问题,我使用软件包nleqslv来解决。上下文是:我搜索从2018年到2100年的路径,该路径满足以下条件:

  • 2018年的价值是固定的
  • 2019年的价值是固定的
  • “积分”值(曲线下的面积)是固定的
  • 在任何一年中,y值都不应低于特定值

最后一个条件是我遇到的问题:如何在nleqslv中实现呢?目前,最后一个值(2100年)固定为最小值-但这仅近似于我想要的条件(在某些年份中,y值低于我预期的最小边界值-210)。

到目前为止,这是我的代码:

library("nleqslv")
set.seed(123)

fun <- function(x){
  dat <- data.frame(emission = 2820, t = 0:82)
  for(i in 1:83) {
    dat$emission[i] <- log(dat$t[i]+1)*x[1]- x[2]*dat$t[i] - x[3] - sqrt(dat$t[i]+1)*x[4] 
    }
    ret <- numeric(4)
    ret[1] <- dat$emission[1] - 2820
    ret[2] <- dat$emission[83] + 210
    ret[3] <- sum(dat$emission) - 32200
    ret[4] <- dat$emission[2] - 2820 * 0.984
    return(ret)
}

xstart <- matrix(runif(80, min=-0.3, max=0.3), ncol = 4)

# optimization
opt_x <- searchZeros(xstart, fun,  method="Broyden", global="pwldog", control=list(btol=1e-6))

# check
dat <- data.frame(emission = 2820, t = 0:82, year = 2018:2100)
for(i in 1:83){
  dat$emission[i] <- log(dat$t[i]+1)*opt_x[[1]][1,1] -
    opt_x[[1]][1,2]*dat$t[i]- opt_x[[1]][1,3] - sqrt(dat$t[i]+1)*opt_x[[1]][1,4]
}

ggplot(data = dat, aes(y = emission/1000, x = year)) + geom_line()

# check: minimal emissions
min(dat$emission)

如何实现y值在任何一年都不会低于阈值(-210)的条件?

0 个答案:

没有答案