Java中单变量非线性函数的最小发现

时间:2013-04-14 14:00:44

标签: java mathematical-optimization numerical-methods

我正在寻找一种在Java中用MATLAB的fminsearch()做的简单方法。我不需要像fminsearch一样通用,在我的情况下,我只想找到单变量非线性函数的最小值(函数和参数值)。我不知道函数的解析表达式,但我可以很容易地评估它。

你知道一个执行此操作的库,还是一个我可以重新实现的简单算法?

注意:我看到apache的common-math似乎有类似的东西(UnivariateOptimizer),但大多数方法似乎都被弃用了,我找不到如何使用它的好解释。任何与此相关的提示也是受欢迎的。

谢谢!

1 个答案:

答案 0 :(得分:4)

Apache Commons Math通常是开始Java中数值计算的好地方。最好通过示例学习用法,查看各种类和方法的API documentationunit 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());
    ...
}