2016-03-16 79 views
4

我有一個同時計算梯度和輸出的函數。我想根據一個目標函數來優化它。我如何將目標和漸變作爲列表傳遞給optimx?下面的例子說明了這個問題:R優化 - 將列表和梯度函數參數作爲列表傳遞

假設我想找到多項式的最小非負根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時,我想通過客觀和梯度作爲一個列表?

謝謝。

+0

我不認爲你可以真正從定義FN脫身,分別GR(即使這掩蓋就像在@ 42的答案中一樣)。通常,優化子程序將獨立於另一個函數調用每個函數,可能具有不同的參數。你不能假定每個fn的調用都可以匹配到一個gr的調用。 –

+0

注意到,感謝您的輸入。 – user3294195

回答

1

定義一個無參數的功能,可以提供兩種功能...調用時:

> 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 
相關問題