3

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

您是否知道执行此操作的库,或者我可以重新实现的简单算法?

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

谢谢!

4

1 回答 1

4

Apache Commons Math通常是开始在 Java 中进行数值计算的好地方。最好通过示例学习用法,查看API 文档和各种类和方法的单元测试源代码。

正如您所指出的,用户指南中引用的优化类已被弃用。它们仍然可以被调用,但最终它们当然会从库中被淘汰。由于我不知道的原因,正在进行的优化开发现在是在optim而不是优化子包中进行的。

对于单变量函数(局部最优)最小化,Apache Commons Math提供了Brent方法的实现。的单元测试中概述了用法BrentOptimizer,我从中复制了以下摘录:

@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());
    ...
}
于 2013-04-15T05:53:22.583 回答