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)
尝试 p1
和 p2
稍微不同的值:
nleqslv(xstart,f,p1=2.7,p2=2.1)
BBsolve(xstart,f,p1=2.7,p2=2.1)
两个函数找到相同的解决方案。
我很想使用 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)
尝试 p1
和 p2
稍微不同的值:
nleqslv(xstart,f,p1=2.7,p2=2.1)
BBsolve(xstart,f,p1=2.7,p2=2.1)
两个函数找到相同的解决方案。