我有一个同时评估梯度和输出的函数。我想针对目标函数进行优化。我该如何将目标函数和梯度作为列表传递给
假设我想找到多项式
这很好用,我得到了以下输出:
这导致以下错误返回:
optimx
?下面的示例说明了问题:假设我想找到多项式
x^4-3*x^2+2*x+3
的最小非负根。它的梯度是4*x^3 - 6*x + 2
。我使用optimx
中的nlminb
方法,如下所示。optimx(par = 100, method = "nlminb", fn = function(x) x^4 - 3*x^2 + 2*x + 3,
gr=function(x) 4*x^3 - 6*x + 2, lower = 0)
这很好用,我得到了以下输出:
p1 value fevals gevals niter convcode kkt1 kkt2 xtimes
nlminb 1 3 27 24 23 0 TRUE TRUE 0
现在假设我定义了一个名为fngr
的函数,它返回目标值和梯度值的列表:
fngr <- function(x) {
fn <- x^4 - 3*x^2 + 2*x + 3
gr <- 4*x^3 - 6*x + 2
return (list(fn = fn, gr = gr))
}
我尝试按如下方式调用optimx
:
do.call(optimx, c(list(par = 100, lower = 0, method="nlminb"), fngr))
这导致以下错误返回:
Error in optimx.check(par, optcfg$ufn, optcfg$ugr, optcfg$uhess, lower, :
Function provided is not returning a scalar number
当我想将目标和梯度作为列表传递时,定义fngr
和调用optimx
的正确方式是什么?
谢谢。
memoise
包,我想)。 - Ben Bolker