Я пытаюсь воспроизвести результат функции fzero MATLAB в JAVA. После поиска я нашел библиотеку JOM (Java Optimization Modeler). Я написал очень простую программу, чтобы проверить ее эффективность, и я не могу найти правильное значение, я использую очень простую оценочную функцию: x - 100 с целью ее минимизации. Я хотел бы знать, ошибочен ли мой код или если вы могли бы предложить мне другую библиотеку, которая лучше работает? Приведенный ниже код нашел оптимальное решение равным 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,0 в интервале [0, Double.MAX_VALUE). Это потому, что функция монотонно возрастает и начинается с минимального значения -100. Чтобы решить уравнение, вам необходимо свести к минимуму абсолютное значение.
Однако есть ли функции, которые вы собираетесь решать непрерывно в течение интервала, который вы пытаетесь решить? В этом случае я бы рекомендовал вам использовать метод Newtons, который, как было показано, обладает хорошей производительностью для решения уравнений. Метод может быть реализован довольно просто, если у вас есть функция для уравнения, которое вы хотите решить (например, f (x) = x -100). Деривацию можно найти, используя различные приближения, некоторые из которых можно найти в википедии.
fzero
будет ближе всего к тому, что Matlab реализовал вfzero
. Однако знаковый бит является битом высшего порядка, что означает, что вы можете генерировать функцию abs с помощью побитовых операторов. Это может быть трудно сделать, но если вы можете справиться довольно легко, у вас есть несколько советов здесь .