0

我想在 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中为目标函数和约束函数提供参数?

4

1 回答 1

0

您没有在 isres 中为函数 objfunction 和 constfunction 提供 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

于 2014-05-13T19:24:31.290 回答