R 优化-将目标和梯度函数参数作为列表传递

R 优化-将目标和梯度函数参数作为列表传递,r,optimization,R,Optimization,我有一个函数,可以同时计算梯度和输出。我想根据一个目标函数来优化它。如何将目标和梯度作为列表传递给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,

我有一个函数,可以同时计算梯度和输出。我想根据一个目标函数来优化它。如何将目标和梯度作为列表传递给
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))
}
这返回了以下错误:

Error in optimx.check(par, optcfg$ufn, optcfg$ugr, optcfg$uhess, lower,  : 
  Function provided is not returning a scalar number
当我想将目标和梯度作为列表传递时,定义
fngr
和调用
optimx
的正确方法是什么


谢谢。

定义一个无参数函数,它可以用合适的名称提供这两个函数。。。调用时:

> fngr <- function() {
+   fn <- function(x) {x^4 - 3*x^2 + 2*x + 3}
+   gr <- function(x) {4*x^3 - 6*x + 2}
+   return (list(fn = fn, gr = gr))
+ }
> do.call(optimx, c(list(par = 100, lower = 0, method="nlminb"), fngr() ))
                                    notice the need to call it ------^^
       p1 value fevals gevals niter convcode kkt1 kkt2 xtimes
nlminb  1     3     27     24    23        0 TRUE TRUE  0.002

>fngr我不认为你真的可以不单独定义fn和gr(即使这在@42-的答案中被模糊了)。通常,优化子程序将独立于其他函数调用每个函数,可能使用不同的参数。你不能假设每个FN的调用都可以匹配到GL的一个调用。注意,感谢输入。方法迟了,但是我会考虑它是否值得函数(有一个代码> MyoISIS/<代码>包,我想)
> fngr <- function() {
+   fn <- function(x) {x^4 - 3*x^2 + 2*x + 3}
+   gr <- function(x) {4*x^3 - 6*x + 2}
+   return (list(fn = fn, gr = gr))
+ }
> do.call(optimx, c(list(par = 100, lower = 0, method="nlminb"), fngr() ))
                                    notice the need to call it ------^^
       p1 value fevals gevals niter convcode kkt1 kkt2 xtimes
nlminb  1     3     27     24    23        0 TRUE TRUE  0.002