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

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

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

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


person cDc    schedule 22.11.2013    source источник


Ответы (1)


существует библиотека 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);
person 4pie0    schedule 22.11.2013
comment
Это очень интересная библиотека, я рассмотрю ее, но это не ответ на мой вопрос. Как преобразовать символьную математику (например: f(x)=x+2) в код C (для нашего примера очевидно, что y=x+2; это код C, который мне нужен, но для сложной математики, включая якобианы и т. д., это не так просто)... - person cDc; 22.11.2013
comment
Ваш вопрос непонятен, NLopt допускает любую (конечно, в какой-то степени) математику, загляните в нее - найдете все ответы. Как реализовать якобиан? Это обычная матрица, просто матрица (частных производных) - person 4pie0; 22.11.2013
comment
Извините, если все еще неясно, я не знаю, как сделать это более ясным. Вот еще один пример небольшой функции в Maxima, для которой якобианское выражение занимает несколько страниц дисплея: X:[x0,x1,x2]$ R:[r0,r1,r2]$ C:[c0,c1,c2 ]$ p:[p0,p1]$ theta2:RR$ theta:sqrt(theta2)$ ct:cos(theta)$ st:sin(theta)$ w:R/theta$ P:XC$ cr:w~P $ dt:wP$ ptC:express(Pct+crst+w*(1-ct)*dt)$ pt:[fptC[1]/ptC[3], fptC[2]/ptC[3]]-p$ j:jacobian([pt],[R[1],R[2],R[3],C[1],C[2 ],С[3],f])$ - person cDc; 22.11.2013
comment
Я был бы рад обсудить это более подробно в частном порядке, если вы можете (мой адрес электронной почты находится в профиле), спасибо! - person cDc; 22.11.2013