我首先要说这感觉应该很容易......但对我来说并不完全是显而易见的。我正在尝试使用BrentOptimizer来查找函数的局部最小值和最大值。我知道这些的周期性,我觉得我应该能够使用BracketFinder来包围最佳效果,然后将其发送到BrentOptimizer。
因此,对于一个简单的案例,请考虑:
f(x) = sin(x)
我们知道Pi / 2最大,3Pi / 2最小。如果我从0开始并沿着函数移动,我将如何在Pi / 2中寻找根?它真正归结为构造函数参数和初始点。是否有任何最佳实践(假设您对函数的形状有一点了解),我可以用它来合理地设置这些参数?
由于
答案 0 :(得分:0)
你现在可能已经对此进行了排序,但是包围方法根本没有预期任何初始点,BracketFinder
的意图是找到你应该在调用{{{{ 3}}。在BracketFinder
中应用默认构造函数应该没问题。
收到包围点后,请使用抽象基类BrentOptimizer中定义的三点optimize
方法,其中min
,max
,startValue
分别取自BracketFinder
:s getLo()
,getHi()
和getMid()
。
BaseAbstractUnivariateOptimizer实现显然基于本书C版本的第{10.1}章BracketFinder中找到的实现。这可以为您提供更多关于所使用的包围原则的背景信息。