将参数传递给 nloptr objective 函数 - R
Passing parameters to nloptr objective function - R
我打算在 for
循环中使用 nloptr
包,如下所示:
for(n in 1:ncol(my.data.matrix.prod))
{
alpha.beta <- as.vector(Alpha.beta.Matrix.Init[,n])
opts = list("algorithm"="NLOPT_LN_COBYLA",
"xtol_rel"=1.0e-8, "maxeval"= 2000)
lb = vector("numeric",length= length(alpha.beta))
result <- nloptr(alpha.beta,eval_f = Error.func.oil,lb=lb,
ub = c(Inf,Inf),eval_g_ineq=Const.func.oil,
opts = opts)
Final.Alpha.beta.Matrix[,n] <- result$solution
}
除了将 "optimization parameters: alpha.beta
" 传递给误差函数(最小化函数)外,我还想从 for
循环中发送 n
。有没有办法做到这一点?
错误函数定义为:
Error.func.oil <- function(my.data.var,n)
{
my.data.var.mat <- matrix(my.data.var,nrow = 2,ncol = ncol(my.data.matrix.prod) ,byrow = TRUE)
qo.est.matrix <- Qo.Est.func(my.data.var.mat)
diff.values <- well.oilprod-qo.est.matrix #FIND DIFFERENCE BETWEEN CAL. MATRIX AND ORIGINAL MATRIX
Error <- ((colSums ((diff.values^2), na.rm = FALSE, dims = 1))/nrow(well.oilprod))^0.5 #sum of square root of the diff
Error[n]
}
约束函数简单,定义为:
Const.func.oil <- function(alpha.beta)
{
cnst <- alpha.beta[2]-1
cnst
}
所以,当我运行上面的代码时,我得到一个错误
Error in .checkfunargs(eval_f, arglist, "eval_f") :
eval_f requires argument 'n' but this has not been passed to the 'nloptr' function.
如何将 "n" 传递给错误函数?请注意,"n" 不会被优化。这只是一个索引。
好的。我在网上阅读了一些示例,发现我可以在 nloptr
本身的定义中提及 "n" 为:
for(n in 1:ncol(my.data.matrix.prod))
{
alpha.beta <- as.vector(Alpha.beta.Matrix.Init[,n])
opts = list("algorithm"="NLOPT_LN_COBYLA",
"xtol_rel"=1.0e-8, "maxeval"= 5000)
lb = c(0,0)
result <- nloptr(alpha.beta,eval_f = Error.func.oil,lb=lb,
ub = c(Inf,Inf),
opts = opts, n=n) #Added 'n' HERE
Final.Alpha.beta.Matrix[,n] <- result$solution
}
这似乎对我有用。因此,我将其设置为关闭。
我打算在 for
循环中使用 nloptr
包,如下所示:
for(n in 1:ncol(my.data.matrix.prod))
{
alpha.beta <- as.vector(Alpha.beta.Matrix.Init[,n])
opts = list("algorithm"="NLOPT_LN_COBYLA",
"xtol_rel"=1.0e-8, "maxeval"= 2000)
lb = vector("numeric",length= length(alpha.beta))
result <- nloptr(alpha.beta,eval_f = Error.func.oil,lb=lb,
ub = c(Inf,Inf),eval_g_ineq=Const.func.oil,
opts = opts)
Final.Alpha.beta.Matrix[,n] <- result$solution
}
除了将 "optimization parameters: alpha.beta
" 传递给误差函数(最小化函数)外,我还想从 for
循环中发送 n
。有没有办法做到这一点?
错误函数定义为:
Error.func.oil <- function(my.data.var,n)
{
my.data.var.mat <- matrix(my.data.var,nrow = 2,ncol = ncol(my.data.matrix.prod) ,byrow = TRUE)
qo.est.matrix <- Qo.Est.func(my.data.var.mat)
diff.values <- well.oilprod-qo.est.matrix #FIND DIFFERENCE BETWEEN CAL. MATRIX AND ORIGINAL MATRIX
Error <- ((colSums ((diff.values^2), na.rm = FALSE, dims = 1))/nrow(well.oilprod))^0.5 #sum of square root of the diff
Error[n]
}
约束函数简单,定义为:
Const.func.oil <- function(alpha.beta)
{
cnst <- alpha.beta[2]-1
cnst
}
所以,当我运行上面的代码时,我得到一个错误
Error in .checkfunargs(eval_f, arglist, "eval_f") : eval_f requires argument 'n' but this has not been passed to the 'nloptr' function.
如何将 "n" 传递给错误函数?请注意,"n" 不会被优化。这只是一个索引。
好的。我在网上阅读了一些示例,发现我可以在 nloptr
本身的定义中提及 "n" 为:
for(n in 1:ncol(my.data.matrix.prod))
{
alpha.beta <- as.vector(Alpha.beta.Matrix.Init[,n])
opts = list("algorithm"="NLOPT_LN_COBYLA",
"xtol_rel"=1.0e-8, "maxeval"= 5000)
lb = c(0,0)
result <- nloptr(alpha.beta,eval_f = Error.func.oil,lb=lb,
ub = c(Inf,Inf),
opts = opts, n=n) #Added 'n' HERE
Final.Alpha.beta.Matrix[,n] <- result$solution
}
这似乎对我有用。因此,我将其设置为关闭。