R BB 包 - 无法将参数传递给 objective 函数?

R BB package - no way to pass parameters to objective function?

我很想使用 R 包 BB 来求解非线性方程组,但语法似乎不允许将参数传递给方程组。非常奇怪,因为这会严重限制 nleqslv() 的一个非常有吸引力和强大的替代方案。

明确一点:"Normally",您希望求解器有一个 space 用于将参数传递给基础 objective 函数。例如。在 nleqslv:

out <- nleqslv(in_x, obj_fn, jac = NULL, other_pars1, other_pars2, method = "Broyden")

其中 "in_x" 是解的初始猜测向量,"other_pars1, other_pars2" 是 "obj_fn" 所需的附加固定参数(可以是标量、向量、矩阵等) .

另一方面,在 BBsolve 中,您只有

out <- BBsolve(in_x, obj_fn)

没有 space 可以放入 obj_fn 所需的所有 "other_pars1, other_pars2"。

创建一个函数,为您的 objective 函数添加 "attaches" 附加参数。这里的关键概念是 return 值本身就是一个函数:

gen_obj_fn <- function( obj_fn, other_pars1, other_pars2 )
{
  function(x) { obj_fn( x, other_pars1, other_pars2 ) }
}

gen_obj_fn 的输出现在可以直接传递给 BBsolve:

## Previous call using nleqslv():
out <- nleqslv( in_x, myFun, jac = NULL, myParam1, myParam2, ... )

## Equivalent call using BBsolve():
myObjF <- gen_obj_fn( myFun, myParam1, myParam2 )
is.function( myObjF )  ## TRUE
out <- BBsolve( in_x, myObjF )

您没有展示您是如何使用 BBsolve。正如我在评论中所说,BBsolve 当然接受额外的函数参数。 但是你必须说出这些论点。

查看此示例以了解如何执行您似乎想要的操作:

library(nleqslv)

f <- function(x,p1=3,p2=2) {
  y <- numeric(2)
  y[1] <- 10*x[1]+3*x[2]^2 - p1
  y[2] <- x[1]^2 -exp(x[2]) -p2
  y
}

xstart <- c(1,1)
nleqslv(xstart, f)

library(BB)
BBsolve(xstart,f)

尝试 p1p2 稍微不同的值:

nleqslv(xstart,f,p1=2.7,p2=2.1)
BBsolve(xstart,f,p1=2.7,p2=2.1)

两个函数找到相同的解决方案。