Цитирование официальная документация функции 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)
!
Я что-то неправильно понимаю?В чем моя ошибка?Как это можно заставить работать правильно?