Решение линейных / квадратичных уравнений в Java - PullRequest
0 голосов
/ 01 июня 2018

У меня есть набор "линейных" уравнений с ограничениями на основе этой статьи , чтобы найти градиент m и задержку b1 от целевой функции следующим образом:

Функция цели= 2y - ((24538 + 1660b1) / 566400) x - 2b1> = 0

Ограниченные функции =

  • y - ((12,7-b1) / 480) x - b1> = 0
  • y - ((19,9-b1) / 1180) x-b1> = 0
  • (19,9-b1) / 1180)> = 0,01
  • (12.7-b1) / 480)> = 0,01

Проблема заключается в том, что, поскольку он использует 3 переменные (x, y, b1), а b1 умножается на x, это как-то делает его квадратичным программированием иЯ запутался, как решить эту проблему или даже представить ее в коде, используя несколько библиотек Java, таких как ojalgo или JOptimizer.

Как решить эту проблему программно, используя вышеупомянутые библиотеки?

1 Ответ

0 голосов
/ 01 июня 2018

Ваши функции не квадратичные, насколько я понимаю.(Возможно, перенесите этот вопрос на math.stackexchange.com).

Я использовал JOptimizer и нашел его очень способным и быстрым для линейных задач, но никогда не использовал его для нелинейных задач,Однако на сайте JOptimizer есть примеры различных нелинейных задач, которые он может решить.

В поддержку этого в JOptimizer есть класс ConvexMultivariateRealFunction, который вы можете использовать для представления своих функций.По сути, в вашей реализации класса вы кодируете функции, которые возвращают значение функции, ее градиент и матрицу Гессиана для любого заданного набора входных данных функции.

Как сделать все это для вашегоОтдельные функции - это математический вопрос, а также вопрос о том, удовлетворяют ли ваши функции ограничениям, на которые способен JOptimizer (например, функции должны быть дважды дифференцируемыми).

Вот пример ConvexMultivariateRealFunction(снято с веб-сайта JOptimizer).Вы можете видеть, что реализация value содержит разделение между независимыми переменными плюс возведение в степень - так что определенно не линейный!

inequalities[1] = new ConvexMultivariateRealFunction() {

            public double value(DoubleMatrix1D X) {
                double y0 = X.getQuick(0);
                double y1 = X.getQuick(1);
                double t =  X.getQuick(2);
                return t * (Math.pow(y0 / t - c0, 2) + Math.pow(y1 / t - c1, 2) - Math.pow(R, 2));
            }

            public DoubleMatrix1D gradient(DoubleMatrix1D X) {
                double y0 = X.getQuick(0);
                double y1 = X.getQuick(1);
                double t =  X.getQuick(2);
                double[] ret = new double[3];
                ret[0] = 2 * (y0/t - c0);
                ret[1] = 2 * (y1/t - c1);
                ret[2] = Math.pow(c0, 2) + Math.pow(c1, 2) - Math.pow(R, 2) - (Math.pow(y0, 2) + Math.pow(y1, 2))/Math.pow(t, 2);
                return F1.make(ret);
            }

            public DoubleMatrix2D hessian(DoubleMatrix1D X) {
                double y0 = X.getQuick(0);
                double y1 = X.getQuick(1);
                double t =  X.getQuick(2);
                double[][] ret = {
                    {                2/t,                   0, -2*y0/Math.pow(t,2)}, 
                    {                  0,                 2/t, -2*y1/Math.pow(t,2)}, 
                    {-2*y0/Math.pow(t,2), -2*y1/Math.pow(t,2),  2*(Math.pow(y0,2) + Math.pow(y1,2))/Math.pow(t,3)}};
                return F2.make(ret);
            }

            public int getDim() {
                return 3;
            }
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...