Найти значение, которое дает локальный максимум функции, которая принимает две входные переменные - PullRequest
1 голос
/ 09 марта 2020

Я задавал подобный вопрос ранее, но мой вопрос не был ясен. Вот еще одна попытка.

Предположим, у вас есть следующая функция, которая принимает два входа, 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)
}

Для всех возможных значений a в диапазоне [0, 100], I Я хочу найти значение b, которое максимизирует вывод функции выше, с ограничением, что b также должно быть значением в диапазоне [0, 100].

Другими словами, я хочу построить график b как функция a, такая, что b максимизирует выходное значение функции выше для данного значения a.

Как бы вы написали код для этого?

1 Ответ

3 голосов
/ 09 марта 2020

Прежде всего, я бы переписал функцию как функцию двух параметров, в этом порядке, 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)

enter image description here

...