用java代码优化非线性问题

计算科学 优化
2021-12-23 04:08:42

java中是否有一些包可以包含在eclipse中以解决非线性问题?我使用过 ipopt,但在运行时,有一条通知显示“注意:默认情况下,您正在使用 Ipopt 和 MUMPS 线性求解器。其他线性求解器可能更有效(请参阅 Ipopt 文档)。” 当我搜索使用非线性求解器来解决我的问题时。请帮我。

谢谢

3个回答

IPOPT 提供了自己的非线性求解器,这些求解器是其实现的内点方法的一部分。因此,这些求解器(实际上是内部类方法)将构建必须求解的线性系统,类似于准牛顿法。警告只是指出您使用的是默认求解器而不是像 Pardiso 或 HSL 库之类的东西,并且正如 WolfgangBangerth 指出的那样,使用不同的求解器不应影响您获得的解决方案(但会影响获得所需的时间该解决方案)。如果您已正确安装 IPOPT,那么该安装可能足以让您入门。

由于您的问题仅涉及一个变量并且在该变量中不受约束(是吗?),您应该考虑使用布伦特算法。您可以在Apache Commons Math中找到Brent算法的实现,请参阅此处的API 文档

如果您遇到更多变量和/或非线性约束的问题,您还可以考虑使用由 Michael Powell 开发的COBYLA算法。我已将算法从 FORTRAN 77 移植到 Java,请参见此处

Powell 还为无约束、有界约束和线性约束的两个或多个变量的非线性目标函数开发了更有效的算法。他的约束约束算法BOBYQA有一个 Java 实现,包含在 Apache Commons Math 中,请参阅此处的API 文档

您对要解决的问题不是很精确,但我知道一些提供数学编程功能的 Java 代码库。

JOptimizer应该能够处理各种凸问题。我对性能、准确性或错误一无所知——我只知道它存在。

ojAlgo(我写了这个)可以处理 LP、QP 和 MIP。当您遇到更小更简单的问题并需要纯 Java 实现时,它是为用例设计的。

Apache Commons Math 也有一个 LP(单纯形)求解器。