r-求取两个输入变量的函数的局部最大值,每个变量的间隔不同



在两个输入具有不同间隔的情况下,如何找到下面函数的局部最大值?

f <- function(x, y) {
y/50*(100*x)^0.9 + (50-y)/y*(80*(10-x))^0.8
}
# interval for y = (0, 50)
# interval for x = (0, 10)

我研究过使用optim函数,但我不知道如何为这两个输入变量设置"par"、间隔和其他参数。

optim需要一个带有vector参数(+可选参数(的函数,即要使问题中给出的函数与optim一起工作,必须稍微更改该函数或使用某种包装函数,如:

# Function of two scalar inputs
f_xy <- function(x, y) {
y / 50 * (100 * x)^0.9 + (50 - y) / y * (80 * (10 - x))^0.8
}
# Wrapper or helper function with vector argument
f <- function(x) {
y <- x[2]
x <- x[1]
f_xy(x, y)
}
# Default optim with starting value c(x = 5, y = 20)
optim(c(5, 20), fn = f)

注意:默认情况下,optim执行最小化。

最大化:设置control = list(fnscale = -1)(感谢@aliastaire在评论中指出这一点。(

optim(c(5, 20), fn = f, control = list(fnscale = -1))

然而,对于问题中给出的函数,optim输出显示算法尚未收敛($convergence != 0((感谢@aliastaire在评论中指出这一点。(:

optim(c(5, 20), fn = f, control = list(fnscale = -1))
#> $par
#> [1] 1.591824e+00 3.861200e-34
#> 
#> $value
#> [1] 2.368542e+37
#> 
#> $counts
#> function gradient 
#>      501       NA 
#> 
#> $convergence
#> [1] 1
#> 
#> $message
#> NULL

在给定1$convergence的情况下,意味着达到了最大迭代次数。可以通过例如设置CCD_ 10来增加最大迭代次数来解决这个问题。然而,这并不能解决问题,因为optim仍然不能收敛。

最新更新