2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Библиотека C++ для поиска min методом градиентного спуска
Сообщение17.01.2026, 14:08 
Здравствуйте.
Сейчас решаю задачу поиска минимума с помощью производных в Matlab, используя функцию fmincon. Те параметры, которые я пытаюсь найти, должны быть в определённых сегментах, других ограничений нет. Функция дифференцируема, используются только первые призводные. Мне кажется, что C++ должен работать быстрее, чем Matlab. Посоветуйте, пожалуйста, библиотеку с алгоритмами и примерами. Если есть такие библиотеки на Python (досутуп через Python, но внутренность написана на плюсах), то тоже было бы интересно узнать.

Если кто-то решал подобные задачи на Matlab, Python и C++, напишите, пожалуйста, изменилась ли скорость вычисления.

 
 
 
 Re: Библиотека C++ для поиска min методом градиентного спуска
Сообщение17.01.2026, 14:15 
Аватара пользователя
Просто градиентный спуск - любая библиотека для нейронок (tensorflow, pytorch). Правда там ничего кроме символьного дифференцирования и арифметики не будет, ограничения придется как-то достраивать руками.

 
 
 
 Re: Библиотека C++ для поиска min методом градиентного спуска
Сообщение17.01.2026, 14:59 
Igor_Dmitriev в сообщении #1715067 писал(а):
Мне кажется, что C++ должен работать быстрее, чем Matlab.

Igor_Dmitriev в сообщении #1715067 писал(а):
Если кто-то решал подобные задачи на Matlab, Python и C++, напишите, пожалуйста, изменилась ли скорость вычисления.

Matlab позволяет разрабатывать функции на С++, так называемые МЕХ-функции. У меня эти трюки только замедлили вычисления. Возможно потому, что большинство встроенных (built-in) функций MATLABа уже написаны на C/C++.

 
 
 
 Re: Библиотека C++ для поиска min методом градиентного спуска
Сообщение17.01.2026, 23:05 
Аватара пользователя
я в сообщении #61280 писал(а):
Есть серьёзная библиотека, DONLP2 (на C и Фортране), для решения задачи нелинейного программирования. Там используется метод SQP. Насколько я знаю, эта библиотека используется в Матлабе. Сам пробовал, правда, на задачах попроще --- мне понравилось.

Почти за 20 лет ссылка протухла (кто бы сомневался). Хотя поискать на просторах можно. Например, мне выдаёт что-то про "IMSL C Library".
Но выигрыша в скорости едва ли можно ожидать, используя эту библиотеку напрямую: Матлаб, R и прочие Питоны ведь тоже её же под капотом и используют.

 
 
 
 Re: Библиотека C++ для поиска min методом градиентного спуска
Сообщение19.01.2026, 06:29 
Аватара пользователя

(Gemini 3.5)

Код:
#include <iostream>
#include <cmath>
#include <iomanip>

// Функция, которую мы хотим минимизировать: f(x) = (x - 3)^2 + 5
double function(double x) {
    return std::pow(x - 3, 2) + 5;
}

// Производная функции (градиент): f'(x) = 2 * (x - 3)
double gradient(double x) {
    return 2 * (x - 3);
}

int main() {
    // Параметры алгоритма
    double x_current = 0.0;       // Начальное приближение
    double learning_rate = 0.1;   // Шаг обучения (alpha)
    double precision = 0.000001;  // Точность (критерий остановки)
    int max_iterations = 1000;    // Максимальное число итераций

    int iteration = 0;
    double x_next;

    std::cout << "Начало оптимизации..." << std::endl;
    std::cout << std::fixed << std::setprecision(6);

    while (iteration < max_iterations) {
        // Формула: x_next = x_current - alpha * f'(x_current)
        x_next = x_current - learning_rate * gradient(x_current);

        // Проверка условия сходимости (если изменение ничтожно мало)
        if (std::abs(x_next - x_current) < precision) {
            break;
        }

        x_current = x_next;
        iteration++;

        std::cout << "Итерация " << iteration << ": x = " << x_current
                  << ", f(x) = " << function(x_current) << std::endl;
    }

    std::cout << "\nМинимум найден в точке: " << x_current << std::endl;
    std::cout << "Значение функции в этой точке: " << function(x_current) << std::endl;
    std::cout << "Количество итераций: " << iteration << std::endl;

    return 0;
}

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group