2017-05-02 8 views
0

nloptrパッケージでは、lbfgs()のような関数は勾配関数が必要なようです。しかし、私が勾配関数を与えなければ、それらも働きます。nloptr:lbfgs()は、最適化を行うときに明示的に勾配関数を提供する必要がありますか?

私の質問は:nloptrは自動的にグラジエント関数を計算するのですか?またはlbfgs()はグラデーション関数を必要としません。

目的関数が非常に複雑な場合、nloptrは自動的に勾配関数を計算できますか、それともユーザーが提供する必要がありますか? ?lbfgsから

library(nloptr) 

## example for auglag() 
x0 <- c(1, 1) 
fn <- function(x) { 
    (x[1] - 2)^2 + (x[2] - 1)^2 
} 

hin <- function(x) { 
    -0.25 * x[1]^2 - x[2]^2 + 1 # hin >= 0 
} 

heq <- function(x) { 
    x[1] - 2 * x[2] + 1 # heq == 0 
} 
## it works even gr = NULL 
auglag(x0, fn, gr = NULL, hin = hin, heq = heq, localsolver = "LBFGS") 

gr <- function(x) nl.grad(x, fn) 
## it also works, when provide the gradient function. 
auglag(x0, fn, gr = gr, hin = hin, heq = heq, localsolver = "LBFGS") 

答えて

1

が、我々はそれが提供されていない場合、この関数は実際に自動的に勾配を計算しないことをお読みください。

GR:関数fnの勾配; が指定されていない場合は数値で計算されます。 lbfgsのソースコードに掘り

、我々はそれがnl.grad機能でこれを行うことを参照してください。

if (is.null(gr)) { 
    gr <- function(x) nl.grad(x, fn) 
} 

nl.grad(または?nl.gradから)のソースコードから、それがあります関数が数値的に勾配を計算するためにcentral differencesを実行することを明確にしてください。この勾配を推定するアプローチは、単純な関数と複雑な関数の両方で同様に働くはずの2k近傍の点でk変数の関数を評価するだけです。

関連する問題