лямбда — минимизация анонимной функции в переполнении стека

У меня есть циклическая программа на C ++, которая включает в себя создание функции (каждый раз, когда она отличается) и дальнейшую минимизацию ее. Составление функции осуществляется с помощью пакета GiNaC (символические выражения).
Я пытался минимизировать функции, используя Matlab fmincon функция, но она съела всю память при преобразовании строки в лямбда-функцию (функции довольно сложные). И мне никак не удавалось экспортировать функцию из C ++ в Matlab, кроме как в виде строки.
Есть ли способ составить сложную функцию (3 переменные, корень sin-cos-квадрат и т. Д.) И минимизировать ее, не определяя градиент самостоятельно, потому что я не знаю, как выглядят функции перед запуском программы?
Я также посмотрел на NLopt и, как я понял, программисты должны писать градиенты.

2

Решение

Большинство алгоритмов оптимизации требуют градиента. Однако, если невозможно «узнать» это напрямую, вы можете оценить это с учетом небольшого приращения каждой координаты. Если ваша функция F зависит от координат x вектор, вы можете аппроксимировать компонент I вашего вектора градиента G как

x1 = x;
x1[i] += dx;
G[i] = (F(x1) - F(x))/dx;

где dx это небольшой прирост. Хотя такой расчет является приблизительным, он обычно абсолютно полезен для минимального вывода при условии, что dx достаточно маленький.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]