Реализуйте пользовательскую нелинейную минимизацию от символьной математики до C

Пытаясь решить проблему компьютерного зрения, я должен минимизировать нелинейную энергетическую функцию, реализуя ее в C ++. Хотя я не нашел библиотеку, которая бы помогала мне с конкретной функцией, у меня есть математика для этого. Итак, как лучше всего перейти от символической математики к коду C ++?

Пример: учитывая функции g (x): = x ^ 2 и f (x): = x + 2, давайте представим, что меня интересует преобразование f (g (x)) в C-код; очевидный код на С был бы у = х ^ 2 + 2; однако для сложной математики, включая якобианов и т. д., это не так просто, переводя на страницы и страницы операций.

Я уже пробовал Matlab и его модуль преобразования в C-код, но код далек от оптимизации (например: одни и те же операции повторяются много раз вместо повторного использования результата).

0

Решение

Существует NLopt библиотека, вызываемая из C ++, C, Matlab, Fortran, (…) для нелинейных оптимизаций. Реализация процедуры минимизации с использованием этой библиотеки может выглядеть так:

#include <nlopt.hpp>

nlopt::opt opt(nlopt::LD_MMA, 2);

std::vector<double> lb(2);
lb[0] = -HUGE_VAL; lb[1] = 0;
opt.set_lower_bounds(lb);

opt.set_min_objective(myfunc, NULL);

my_constraint_data data[2] = { {2,0}, {-1,1} };
opt.add_inequality_constraint(myconstraint, &data[0], 1e-8);
opt.add_inequality_constraint(myconstraint, &data[1], 1e-8);

opt.set_xtol_rel(1e-4);

std::vector<double> x(2);
x[0] = 1.234; x[1] = 5.678;
double minf;
nlopt::result result = opt.optimize(x, minf);
2

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

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

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