Почему функция GenSA не учитывает нижние границы для компонентов? - PullRequest
0 голосов
/ 21 мая 2019

Цитирование официальная документация функции GenSA из пакета GenSA от CRAN :

Использование

GenSA(par, fn, lower, upper, control=list(), ...)

Аргументы

  • par Вектор.Начальные значения для компонентов, подлежащих оптимизации.Значение по умолчанию - NULL, в этом случае значения по умолчанию будут сгенерированы автоматически.
  • fn Функция, которая должна быть свернута, с первым аргументом - вектор параметров, по которому должна происходить минимизация.Он должен возвращать скалярный результат.
  • lower Вектор с длиной par.Нижние границы для компонентов.
  • upper Вектор с длиной par.Верхние оценки для компонентов.

Очень хорошо.Таким образом, если я правильно понимаю, аргументы, переданные в fn, никогда не должны быть ниже или выше границ, указанных в lower и higher.

Это, похоже, не так:

library(GenSA)

GenSA(c(1.0/90, 1.0, 0.02), function(args){
  arg1 = args[1]; arg2 = args[2]; arg3 = args[3]
  print(args)
  if(arg2 <= 0) stop("WTF")
  0
}, lower=c(0, 1.0, 0), upper=c(Inf, Inf, 0.4))

Результаты выполнения этого кода не прощают:

[1] 0.01111111 1.00000000 0.02000000
[1] 0.0000000 0.0000000 0.2891973
Error in fn(par, ...) : WTF
Calls: GenSA -> <Anonymous> -> fn
Execution halted

Почему GenSA вызвал мою функцию со вторым компонентом, равным 0.0?Я подумал, что мне ясно, когда я сказал: lower=c(0, 1.0, 0)!

Я что-то неправильно понимаю?В чем моя ошибка?Как это можно заставить работать правильно?

1 Ответ

0 голосов
/ 21 мая 2019

Виновник:

upper=c(Inf, Inf, 0.4)

Удалите Inf s и установите это значение на upper=c(100, 100, 0.4), и нижние границы, наконец, будут выполнены.

Не знаю почему.

...