Прежде всего, я бы переписал функцию как функцию двух параметров, в этом порядке, b
и a
. Это потому, что базовая функция R optimize
оптимизирует свой первый аргумент. Из документации:
Функция optimize
ищет интервал от нижнего к верхнему минимуму или максимуму функции f
относительно ее первого аргумента.
По умолчанию необходимо свернуть, чтобы максимизировать, установить соответствующий аргумент в TRUE
.
Затем, чтобы максимизировать значения a
в интервале [0, 100]
, запустить оптимизацию функция для последовательности значений 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)