所以我必须把我的R代码改写成C++。考虑到Rcpp包,这相对容易。我在解决优化问题时遇到了一个问题。我打电话给:

optimum_optim = optim(par=A, fn=negative_LL, gr=negative_grad_LL, .c = c, .t = t, .i = i, .N = N, method = 'BFGS')

鉴于我已经将negative_LLnegative_grad_LL函数改写为C++文件,我想从R调用BFGS优化的基本例程:它是OpTim.c的vmmin函数。
我有一个问题,我不能理解这个函数的签名它是:
vmmin(int n0, double *b, double *Fmin, optimfn fminfn, optimgr fmingr,
      int maxit, int trace, int *mask,
      double abstol, double reltol, int nREPORT, void *ex,
      int *fncount, int *grcount, int *fail)

并不是说我没有花任何精力去寻找-我只是找不到一个描述。。。有人能在我的特殊情况下帮助调用这个函数吗(告诉我参数是什么)?

最佳答案

听起来你已经在使用这个建议了,但是你需要更深入一点:"Use the source, Luke"
我的出发点是,从R控制台,简单地输入

optim

这将打印该函数的R源代码。我看到它在叫
.External2(C_optim, par, fn1, gr1, method, con, lower, upper)

我最喜欢的R源代码镜像是this GitHub repo。如果你去那里,搜索“optim”,只过滤C结果,我们会找到最热门的,src/library/stats/src/optim.c。然后我们可以看到C-leveloptim()(第177行)是如何工作的(第295行)。
初始化这些参数的方式如下
int n           length(par)
double *b       vect(npar); dpar[i] = REAL(par)[i] / (OS->parscale[i])
double *Fmin    0.0
optimfn fn      function defined in the C code
optimgr gr      function defined in the C code
int maxit       asInteger(getListElement(options, "maxit"))
int trace       asInteger(getListElement(options, "trace"))
int *mask       mask = (int *) R_alloc(npar, sizeof(int));
                for (i = 0; i < npar; i++) mask[i] = 1;
double abstol   asInteger(getListElement(options, "abstol"))
double reltol   asInteger(getListElement(options, "reltol"))
int nREPORT     asInteger(getListElement(options, "REPORT"));
void *ex        OptStruct OS; /* tons of stuff done to this */
int *fncount    0
int *grcount    0
int *fail       0

我还没有把所有的细节都放在这里,但我相信这应该足以帮助你弄清楚如何在自己的函数中使用这些东西,一旦你发现了另一件事:在vmmin()中的控件列表。如果您注意到上面的optim()调用中有一个参数名为optim()。这在R代码中定义为
con <- list(trace = 0, fnscale = 1, parscale = rep.int(1, npar),
        ndeps = rep.int(1e-3, npar),
        maxit = 100L, abstol = -Inf, reltol = sqrt(.Machine$double.eps),
        alpha = 1.0, beta = 0.5, gamma = 2.0,
        REPORT = 10, warn.1d.NelderMead = TRUE,
        type = 1,
        lmm = 5, factr = 1e7, pgtol = 0,
        tmax = 10, temp = 10.0)

尽管这些元素可以由.External2()参数中的用户输入重写,如果签出con,您将看到
“control”参数是一个可以提供以下任何组件的列表:
“跟踪”。。。
C函数引用这个名为control的列表,您可以在上面构建的表中多次看到它被引用。

10-04 14:38