#math #optimization #numerical-methods #numerical-analysis #apache-commons-math
#математика #оптимизация #численные методы #численный анализ #apache-commons-math
Вопрос:
Я начну с того, что мне кажется, что это должно быть легко… но для меня это не совсем очевидно. Я пытаюсь использовать BrentOptimizer для поиска локальных минимумов и максимумов функции. У меня есть представление об их периодичности, и я чувствую, что должен иметь возможность использовать BracketFinder для определения оптимумов, а затем отправлять их в BrentOptimizer.
Вот документация: http://commons.apache.org/math/api-2.2/org/apache/commons/math/optimization/univariate/BracketFinder.html
Итак, для простого случая рассмотрим:
f(x) = sin(x)
Мы знаем, что существует максимальное значение при Pi / 2 и минимальное значение при 3Pi / 2. Если бы я начинал с нуля и двигался по функции, как бы я искал этот корень в Pi / 2? Это действительно сводится к аргументам конструктора и начальным точкам. Существуют ли какие-либо рекомендации (при условии, что вы немного знаете о форме вашей функции), которые я могу использовать для разумной настройки этих параметров?
Спасибо
Ответ №1:
Вероятно, вы уже разобрались с этим, но метод брекетинга вообще не ожидает никаких начальных точек, цель BracketFinder
состоит в том, чтобы найти начальную догадку, которую вы должны применить при вызове BrentOptimizer. Должно быть нормально применять конструктор по умолчанию BracketFinder
.
После получения точек брекетинга используйте трехточечный optimize
метод, определенный в абстрактном базовом классе BaseAbstractUnivariateOptimizer, где min
, max
, startValue
берутся из BracketFinder
:s getLo()
, getHi()
и getMid()
, соответственно.
Реализация BracketFinder, очевидно, основана на реализации, найденной в Numerical Recipes, глава 10.1 в версии C книги. Это может дать вам больше информации об используемых принципах брекетинга.