нужна помощь в понимании Apache Commons Math BracketFinder

#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 книги. Это может дать вам больше информации об используемых принципах брекетинга.