2016-07-06 13 views
0

Ich beabsichtige nloptr Paket in einer for Schleife zu verwenden, wie unten:Passing Parameter objektive Funktion 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  
    } 

Neben den „Optimierungsparameter: alpha.beta“ von vorbeifahrenden auf die Fehlerfunktion (Minimierungsfunktion), Ich möchte auch senden n aus der for Schleife. Gibt es das überhaupt, um das zu tun?

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] 
} 

Die Einschränkung Funktion einfach ist und wie folgt definiert::

Die Fehler func ist definiert als

Const.func.oil <- function(alpha.beta) 
{ 
    cnst <- alpha.beta[2]-1 
    cnst 
} 

Also, wenn ich den obigen Code ausführen, ich einen Fehler

erhalten

Fehler in .checkfunargs (eval_f, arglist, "eval_f"): eval_f benötigt Argument 'n', aber das wurde nicht an 'übergeben nloptr 'Funktion.

Wie gebe ich "n" an die Fehlerfunktion weiter? Beachten Sie, dass "n" nicht optimiert werden soll. Es ist nur ein Index.

Antwort

1

Okay. Ich lese Online einige Beispiele und fand heraus, dass ich wahrscheinlich „n“ in der Definition von nloptr erwähnen kann selbst als:

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  
} 

Das ist für mich gearbeitet zu haben scheint. Daher setze ich dies als geschlossen.

+0

ja, das ist richtig, nloptr nimmt '...' als Eingabeargumente und übergibt sie an die Zielfunktion. –