求取两个输入变量的函数的局部最大值,每个变量具有不同的区间
Find the local maximum of a function that takes two input variables, each with a different interval
如果两个输入具有不同的间隔,您将如何找到下面函数的局部最大值?
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)
(感谢@alistaire 在评论中指出这一点。)
optim(c(5, 20), fn = f, control = list(fnscale = -1))
然而,对于问题中给出的函数,optim
输出显示算法尚未收敛 ($convergence != 0
)(感谢@alistaire 在评论中指出这一点。):
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
在给定 $convergence
of 1
的情况下,表示已达到最大迭代次数。人们可以通过例如增加最大迭代次数来解决这个问题。设置 control = list(..., maxit = 500))
。但是,这并不能解决问题,因为 optim
仍然无法收敛。
如果两个输入具有不同的间隔,您将如何找到下面函数的局部最大值?
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)
(感谢@alistaire 在评论中指出这一点。)
optim(c(5, 20), fn = f, control = list(fnscale = -1))
然而,对于问题中给出的函数,optim
输出显示算法尚未收敛 ($convergence != 0
)(感谢@alistaire 在评论中指出这一点。):
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
在给定 $convergence
of 1
的情况下,表示已达到最大迭代次数。人们可以通过例如增加最大迭代次数来解决这个问题。设置 control = list(..., maxit = 500))
。但是,这并不能解决问题,因为 optim
仍然无法收敛。