代码之家  ›  专栏  ›  技术社区  ›  ben

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

  •  0
  • ben  · 技术社区  · 7 年前

    我渴望使用R包BB来求解非线性方程组,但语法似乎不允许将参数传递给方程组。非常奇怪,因为这将严重限制nleqslv()的其他非常吸引人和强大的替代品。

    明确地说:“通常情况下”,您希望解算器有一个空间,用于将参数传递给基础目标函数。例如,在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)
    

    没有空间放置obj_fn要求的所有“other_PAR1,other_PAR2”。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Artem Sokolov    7 年前

    创建一个函数,将其他参数“附加”到目标函数中。这里的关键概念是返回值本身是一个函数:

    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 )
    
        2
  •  0
  •   Bhas    7 年前

    您还没有展示如何使用 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)
    

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