在nloptr
包中,类似的函数lbfgs()
似乎需要一个渐变函数。但如果我不提供渐变功能,它们也可以工作。
我的问题是:是nloptr
自动计算梯度函数,还是lbfgs()
不需要梯度函数?
如果目标函数很复杂,可以nloptr
自动计算梯度函数,还是必须由用户提供?
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")