Как называется этот алгоритм оптимизации?

У меня есть недокументированный код, который мне нужно понять, чтобы исправить ошибку. Следующий метод называется optimization и предназначен для нахождения максимума очень сложной функции f. К сожалению, при некоторых обстоятельствах он не работает (т. Е. Достигает строки «Достигнута максимальная итерация»).

Я уже пытался написать несколько модульных тестов, но это не сильно помогло.

Поэтому я хочу понять, как на самом деле работает этот метод, и реализует ли он конкретный и хорошо известный алгоритм оптимизации. Может быть, тогда я смогу понять, подходит ли это для решения требуемых уравнений.

public static double optimization(double x1, double x2, double x3, Function<Double, Double> f, double epsilon) {
    double y1 = f.apply(x1);
    double y2 = f.apply(x2);
    double y3 = f.apply(x3);

    double a = (   x1*(y2-y3)+   x2*(y3-y1)+   x3*(y1-y2)) / ((x1-x2)*(x1-x3)*(x3-x2));
    double b = (x1*x1*(y2-y3)+x2*x2*(y3-y1)+x3*x3*(y1-y2)) / ((x1-x2)*(x1-x3)*(x2-x3));
    int i=0;
    do {
        i=i+1;

        x3=x2;
        x2=x1;
        x1=-1.*b/(2*a);

        y1=f.apply(x1);
        y2=f.apply(x2);
        y3=f.apply(x3);

        a = (   x1*(y2-y3)+   x2*(y3-y1)+   x3*(y1-y2))/((x1-x2)*(x1-x3)*(x3-x2));
        b = (x1*x1*(y2-y3)+x2*x2*(y3-y1)+x3*x3*(y1-y2))/((x1-x2)*(x1-x3)*(x2-x3));
    } while((Math.abs(x1 - x2) > epsilon) && (i<1000));
    if (i==1000){
        Log.debug("Max iteration reached");
    }
    return x1;
}

судя по названию epsilon, кажется, что он выполняет какую-то операцию в пределах некоторой допустимой ошибки эпсилон, это как выполнение некоторых вычислений, сужающих результат, пока он не станет Math.abs(x1 - x2) < epsilon), но только до 1000 взаимодействий

Eugene 13.09.2018 11:49

Если вы не понимаете, что делает функция, посмотрите, где и как она используется, это может дать вам некоторое представление о том, что она должна делать.

tkausl 13.09.2018 11:50

Код показывает, что делает функция, о чем вы спрашиваете?

m0skit0 13.09.2018 11:51

Какие значения / функции окружающий код передает как параметр Function<Double, Double> f?

deHaar 13.09.2018 11:52

@tkausl Я знаю, что предполагается максимум искать в f. Я просто не получаю как, он работает, и если f должен соответствовать каким-либо конкретным требованиям.

Stanley F. 13.09.2018 11:52

@deHaar Вызывающие передают математические функции из кинетики, включая вложенные многочлены 36-й и 45-й степени с коэффициентами, считываемыми из файла.

Stanley F. 13.09.2018 12:02

@ m0skit0 Предположим, что это минимальный воспроизводимый пример: double d(double x) { return x*x; } Я вижу, что он умножает число на себя. Но я прошу имя «квадратная функция» (или более подробное описание (например, как это работает) в случае моего более сложного кода).

Stanley F. 13.09.2018 12:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
13
7
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, это Последовательная параболическая интерполяция.

Одна из подсказок - замена самой старой из трех оценок положением экстремума,

    x3= x2;
    x2= x1;
    x1= -1. * b / (2 * a);

Метод может потерпеть неудачу, если оценки не достигают экстремальной конфигурации (в частности, в точке перегиба).

Вот и все. Этот метод также не работает, если функция является мультимодальной, как в моем случае. Помимо максимума, у него также есть полюс, который оптимизация пытается найти при некоторых обстоятельствах (и, таким образом, стремится к бесконечности).

Stanley F. 17.09.2018 06:20

@StanleyF .: к счастью, с арифметикой с плавающей запятой достижение бесконечности не занимает вечность ;-)

Yves Daoust 17.09.2018 09:00

Другие вопросы по теме