JAVA 中的 MATLAB fzero 使用 JOM

MATLAB fzero in JAVA using JOM

我正在尝试在 JAVA 中重现 fzero 的 MATLAB 函数的结果。 四处搜索后,我找到了库 JOM(Java Optimization Modeler)。 我写了一个非常简单的程序来测试它的效率,但我找不到正确的值,我使用了一个非常简单的评估函数:x - 100 和 objective 来最小化它。我想知道我的代码是否有误,或者您是否可以建议我另一个做得更好的图书馆? 下面的代码发现最佳解决方案是 0.0,我期待 100。

    /* Create the optimization problem object */
    OptimizationProblem op = new OptimizationProblem();
    op.addDecisionVariable("x", false, new int[] { 1 , 1 }, 0 , Double.MAX_VALUE);
    /* Sets the objective function */
    op.setObjectiveFunction("minimize", "x-100");
    op.solve("ipopt");
    if (!op.solutionIsOptimal ()) throw new RuntimeException ("An optimal solution was not found");
    System.out.println (op.getPrimalSolution("x").toValue());
    System.out.println("Total cost obtained: " + op.getOptimalCost());

我认为这里有一个问题你没有考虑到。如果您再次考虑它,您会发现方程的最小值实际上是区间 [0,Double.MAX_VALUE) 中的 0.0。这是因为该函数是单调递增的,并且从最小值 -100 开始。求解方程需要最小化绝对值。

但是,您要求解的函数在您尝试求解的时间间隔内是否连续?在那种情况下,我建议您使用 Newtons method, which have been shown to have good performance for equation solving. The method can be implemented quite easy if you have a function for the equation you wants to solve (eg f(x) = x-100). The derivate can be found using different approximations, which some of them can be found on wikipedia.