我正在寻找一种在Java中用MATLAB的fminsearch()做的简单方法。我不需要像fminsearch一样通用,在我的情况下,我只想找到单变量非线性函数的最小值(函数和参数值)。我不知道函数的解析表达式,但我可以很容易地评估它。
你知道一个执行此操作的库,还是一个我可以重新实现的简单算法?
注意:我看到apache的common-math似乎有类似的东西(UnivariateOptimizer),但大多数方法似乎都被弃用了,我找不到如何使用它的好解释。任何与此相关的提示也是受欢迎的。
谢谢!
答案 0 :(得分:4)
Apache Commons Math通常是开始Java中数值计算的好地方。最好通过示例学习用法,查看各种类和方法的API documentation和unit test source code。
正如您所指出的,user guide中引用的优化类已弃用。它们仍然可以被调用,但最终它们将被逐步淘汰出库。由于我不知道的原因,正在进行的优化开发正在 optim 而不是 optimization 子包中进行。
对于单变量函数(局部最优)最小化, Apache Commons Math 提供了 Brent 方法的实现。用法在BrentOptimizer
的{{3}}中列出,我已从中复制了此摘录:
@Test
public void testSinMin() {
UnivariateFunction f = new Sin();
UnivariateOptimizer optimizer = new BrentOptimizer(1e-10, 1e-14);
Assert.assertEquals(3 * Math.PI / 2,
optimizer.optimize(new MaxEval(200),
new UnivariateObjectiveFunction(f),
GoalType.MINIMIZE,
new SearchInterval(4, 5)).getPoint(), 1e-8);
Assert.assertTrue(optimizer.getEvaluations() <= 50);
Assert.assertEquals(200, optimizer.getMaxEvaluations());
...
}