找到一个值,该值给出采用两个输入变量的函数的局部最大值
Find a value that gives the local maximum of a function that takes two input variables
我之前问过类似的问题,但我的问题不清楚。这是另一个尝试。
假设您有以下接受两个输入 a 和 b 的函数。
inputs <- c(a, b)
y <- function(inputs) {
a <- inputs[1]
b <- inputs[2]
output <- a/100 * (20 * b)^0.8 + (100 - a) / 100 * (10 * (100 - b))^0.8
return(output)
}
对于范围 [0, 100] 中 a 的所有可能值,我想找到使上述函数输出最大化的 b 值,但 b 也必须是范围 [0, 100].
换句话说,我想将 b 绘制为 a 的函数,这样对于给定的 a 值,b 最大化上述函数的输出值。
你会如何为此编写代码?
首先,我会按照 b
和 a
的顺序将函数重写为两个参数的函数。这是因为 R 基函数 optimize
优化了它的第一个参数。来自文档:
The function optimize
searches the interval from lower to upper for a
minimum or maximum of the function f
with respect to its first
argument.
默认是最小化,最大化设置各自的参数为TRUE
。
然后,为了最大化区间 [0, 100]
运行 中 a
的值,优化函数针对一系列 a
值。结果存储在列表中,强制为 data.frame 并绘制。
y <- function(b, a) {
output <- a/100 * (20 * b)^0.8 + (100 - a) / 100 * (10 * (100 - b))^0.8
output
}
a <- seq(0, 100, by = 0.1)
max_list <- lapply(a, function(.a){
optimize(y, interval = c(0, 100), .a, maximum = TRUE, tol = .Machine$double.eps^0.5)
})
max_data <- do.call(rbind.data.frame, max_list)
row.names(max_data) <- NULL
head(max_data)
# maximum objective
#1 9.302363e-09 251.1886
#2 9.302363e-09 250.9375
#3 9.302363e-09 250.6863
#4 9.302363e-09 250.4351
#5 9.302363e-09 250.1839
#6 9.302363e-09 249.9327
plot(objective ~ maxima, max_data)
我之前问过类似的问题,但我的问题不清楚。这是另一个尝试。
假设您有以下接受两个输入 a 和 b 的函数。
inputs <- c(a, b)
y <- function(inputs) {
a <- inputs[1]
b <- inputs[2]
output <- a/100 * (20 * b)^0.8 + (100 - a) / 100 * (10 * (100 - b))^0.8
return(output)
}
对于范围 [0, 100] 中 a 的所有可能值,我想找到使上述函数输出最大化的 b 值,但 b 也必须是范围 [0, 100].
换句话说,我想将 b 绘制为 a 的函数,这样对于给定的 a 值,b 最大化上述函数的输出值。
你会如何为此编写代码?
首先,我会按照 b
和 a
的顺序将函数重写为两个参数的函数。这是因为 R 基函数 optimize
优化了它的第一个参数。来自文档:
The function
optimize
searches the interval from lower to upper for a minimum or maximum of the functionf
with respect to its first argument.
默认是最小化,最大化设置各自的参数为TRUE
。
然后,为了最大化区间 [0, 100]
运行 中 a
的值,优化函数针对一系列 a
值。结果存储在列表中,强制为 data.frame 并绘制。
y <- function(b, a) {
output <- a/100 * (20 * b)^0.8 + (100 - a) / 100 * (10 * (100 - b))^0.8
output
}
a <- seq(0, 100, by = 0.1)
max_list <- lapply(a, function(.a){
optimize(y, interval = c(0, 100), .a, maximum = TRUE, tol = .Machine$double.eps^0.5)
})
max_data <- do.call(rbind.data.frame, max_list)
row.names(max_data) <- NULL
head(max_data)
# maximum objective
#1 9.302363e-09 251.1886
#2 9.302363e-09 250.9375
#3 9.302363e-09 250.6863
#4 9.302363e-09 250.4351
#5 9.302363e-09 250.1839
#6 9.302363e-09 249.9327
plot(objective ~ maxima, max_data)