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

Как вы найдете локальные максимумы для функции ниже, с двумя входами, имеющими разные интервалы?

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, но я не мог понять, как установить " пар, "интервалы и другие аргументы для двух входных переменных.

1 Ответ

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

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 из 1 означает, что максимальное количество итераций было достигнуто. Можно решить эту проблему, увеличив максимальное число итераций, например, установив control = list(..., maxit = 500)). Однако это не решит проблему, так как optim все еще не сходится.

...