2016-07-06 5 views
0

Iは以下のようにforループ内nloptrパッケージを使用する:渡すパラメータ目的関数を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は次のように定義されています。私は上記のコードを実行すると、私はエラー

を取得し、

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

:制約関数は、シンプルかつのように定義され

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

.checkfunargs(eval_f、arglist、 "eval_f")のエラー: eval_fには引数 'n'が必要ですが、これは ' nloptr '関数です。

「n」をエラー関数に渡すにはどうすればよいですか? 「n」は最適化されないことに注意してください。単なるインデックスです。

答えて

1

大丈夫です。私はオンラインのいくつかの例を読んで、と私はおそらく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  
} 

したがって、私はこれを閉じたものとして設定しています。

+0

はい、これは正しいです、nloptrは入力引数として '...'をとり、それらを目的関数に渡します。 –

関連する問題