我有一个非线性优化问题,我使用软件包nleqslv
来解决。上下文是:我搜索从2018年到2100年的路径,该路径满足以下条件:
最后一个条件是我遇到的问题:如何在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)的条件?