1

Я застрял при применении алгоритма NROPTR ISRES к нелинейной проблеме с ограничениями неравенства. Я сформулировал это так:Формулировка ограничений неравенства в алгоритме ISRES NLOPTR

library(nloptr) 
fn <- function(x) { 
(x[1]-10)^2 + 5*(x[2]-12)^2 + x[3]^4 + 3*(x[4]-11)^2 + 10*x[5]^6 + 7*x[6]^2 + x[7]^4 - 4*x[6]*x[7] - 10*x[6] - 8*x[7] 
} 

hin <- function(x) { 
h <- numeric(4) 
h[1] <- 127 - 2*x[1]^2 - 3*x[2]^4 - x[3] - 4*x[4]^2 - 5*x[5] 
h[2] <- 282 - 7*x[1] - 3*x[2] - 10*x[3]^2 - x[4] + x[5] 
h[3] <- 196 - 23*x[1] - x[2]^2 - 6*x[6]^2 + 8*x[7] 
h[4] <- -4*x[1]^2 - x[2]^2 + 3*x[1]*x[2] -2*x[3]^2 - 5*x[6] +11*x[7] 
return(h) 
} 

x0 <- c(1, 2, 0, 4, 0, 1, 1) 

isres(x0 = x0, fn = fn, hin = hin) 

я получаю сообщение, которое говорит: «Ошибка в матче (гин): аргумент„таблица“отсутствует, не по умолчанию»

Я предполагаю, что я не делаю что-то с ограничениями неравенства. Не могли бы вы рассказать мне, как это решить? Большое большое спасибо!

ответ

2

Это не совсем ответ. Но я сейчас не могу комментировать.

Я думаю, что проблема не ваши ограничения, но функция isres. Если вы посмотрите в код функции (просто наберите isres в консоли), старт выглядит следующим образом:

function (x0, fn, lower, upper, hin = NULL, heq = NULL, maxeval = 10000, 
      pop.size = 20 * (length(x0) + 1), xtol_rel = 1e-06, nl.info = FALSE, 
      ...) 
{ 
    opts <- list() 
    opts$maxeval <- maxeval 
    opts$xtol_rel <- xtol_rel 
    opts$population <- pop.size 
    opts$algorithm <- "NLOPT_GN_ISRES" 
    fun <- match.fun(fn) 
    fn <- function(x) fun(x, ...) 
    if (!is.null(hin)) { 
    .hin <- match(hin) 
    hin <- function(x) (-1) * .hin(x) 
    } 
... 

Теперь обратите внимание на строку .hin <- match(hin). Функция соответствия является базой R и должна принимать два аргумента, то есть: x и table, поскольку он выполняет x %in% table (отметьте ?match в документации R для получения дополнительной информации). Но isres не предоставляет таблицу функции.

Как она стоит знать, у вас есть 3 варианта решения вашей проблемы:

  • (I) Использование nloptr непосредственно с алгоритмом "NLOPT_GN_ISRES".
  • (II) Мантайнер пакета сказал мне, что ошибка, вероятно, уже известна. Таким образом, вы, вероятно, хорошо, если используете пакет разработки на github вместо версии CRAN. Обратите внимание, что пакет не скомпилировался на моем компьютере
  • (III) Подождите, пока ошибка не будет исправлена. Который должен быть довольно скоро, поскольку они теперь знают о проблеме.
+2

Я думаю, что автор функции 'isres' означал' match.call', а не 'match'. –

+0

Ах. Очень проницательный. Я напишу письмо сопровождающему пакета. – Daniel

+0

@Ahnaf Пожалуйста, не забывайте отмечать мой вопрос как ответ, если вы считаете, что это так, и дайте мне отзыв, если вы считаете, что это не так. – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^