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")