MATLAB fzero в JAVA с использованием JOM

1

Я пытаюсь воспроизвести результат функции 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());
Теги:
optimization

1 ответ

1
Лучший ответ

Я думаю, что здесь есть проблема, о которой вы не знали. Если вы снова подумаете об этом, вы увидите, что минимум уравнения действительно находится на 0,0 в интервале [0, Double.MAX_VALUE). Это потому, что функция монотонно возрастает и начинается с минимального значения -100. Чтобы решить уравнение, вам необходимо свести к минимуму абсолютное значение.

Однако есть ли функции, которые вы собираетесь решать непрерывно в течение интервала, который вы пытаетесь решить? В этом случае я бы рекомендовал вам использовать метод Newtons, который, как было показано, обладает хорошей производительностью для решения уравнений. Метод может быть реализован довольно просто, если у вас есть функция для уравнения, которое вы хотите решить (например, f (x) = x -100). Деривацию можно найти, используя различные приближения, некоторые из которых можно найти в википедии.

  • 0
    К сожалению, библиотека не поддерживает функцию ABS, есть ли способ легко минимизировать абсолютное значение с помощью этой библиотеки? Спасибо за ваше предложение, я его рассмотрю.
  • 1
    @ oro777 К сожалению, я не очень много работаю с Java, но я думаю, что оптимизация, выполняемая в библиотеке, должна быть намного тяжелее, чем просто поиск корня в любом случае. Я также предположил бы, что метод fzero будет ближе всего к тому, что Matlab реализовал в fzero . Однако знаковый бит является битом высшего порядка, что означает, что вы можете генерировать функцию abs с помощью побитовых операторов. Это может быть трудно сделать, но если вы можете справиться довольно легко, у вас есть несколько советов здесь .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню