如何在R中的isres函数中传递约束和目标函数中的参数?

时间:2014-05-12 07:33:14

标签: r nlopt

我想在r中的isres函数中传递约束和目标函数的参数值。 由于我可能需要使用非线性函数,我使用的是isres函数。 我的代码如下。

############## DATA PREPARETION ##########

per1 <- c(50,24,100,12,33,80,120,75,54,32)

per2 <- c(100,241,141,124,130,102,451,141,471,121)

############## CONSTRAIN FUNCTION DEFINATION ##########

constfunction <- function (per1,per2,x) {

  total <- 0 

  for (i in 1:length(per2)) {
    total <- per2[i]*x[i] + total
  }

  total <- total - 1000
  return (total)
}

############## OBJECTIVE FUNCTION DEFINATION ##########

objfunction <- function(per1, per2,x) {

  solution <- 0

  for (i in 1:length(per1)) {
    solution <- per1[i]*x[i] + solution
  }

  return(solution)

}

############## OPTIMIZATION ##########

n <- length(per1)

res0 <- isres ( x0=c(rep(0,n)),
                fn = objfunction,
                lower = c(rep(0,n)),
                upper = c(rep(1,n)),
                hin = NULL,
                heq = constfunction,
                maxeval = 100000,
                xtol_rel = 1e-06,
                nl.info = TRUE,
)

这会产生如下错误 参数“x”缺失,没有默认值。

由于x是可变的,我怎样才能在代码中提供x? 另外如何提供per1和per2?即如何在R?

中为isres中的目标函数和约束函数提供参数

1 个答案:

答案 0 :(得分:0)

你没有在函数objfunction和constfunction中给出isres中的x参数。

假设你有一个需要3个参数a,b,c的函数

f1 <- function(a, b, c){ 
   a + b + c 
}

如果在另一个函数中调用f1,则需要在函数内提供3个参数。

在我的例子中:

#
# Let's imagine from some calculation a get this 2 values
p.2 <- 9
p.3 <- 8
#
# I call lapply, and use f1 function:
lapply(1:3, f1, p.2, p.3)

如果你查看了lapply的声明,你会发现:

lapply(X, FUN, ...)
#
x -> vector
FUN -> function to be applied to each element of X
... -> any other parameter that FUN may need

因此f1从值1:3获得参数a,从p.2获得参数b,从p.3获得c