2016-07-06 32 views
0

我打算用nloptr包在一個for循環如下:將參數傳遞給nloptr目標函數 - R的

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  
    } 

除了傳遞「優化參數:alpha.beta」到誤差函數(最小化函數),我也想從for循環發送n。無論如何要做到這一點?

錯誤func被定義爲:

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 
} 

所以,當我運行上面的代碼,我得到一個錯誤

.checkfunargs(eval_f,arglist,「eval_f」)中的錯誤: eval_f需要參數'n',但尚未傳遞給' nloptr'功能。

如何將「n」傳遞給錯誤函數?請注意,「n」不會被優化。這只是一個索引。

回答

1

好的。我讀了一些在線的例子,結果發現,我也許可以提「N」中的定義,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"= 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  
} 

這似乎已經爲我工作。因此,我將此設置爲關閉。

+0

是的,這是正確的,nloptr將'...'作爲輸入參數並將它們傳遞給目標函數。 –