Я использую NLOPT библиотека в Visual Studio 2015 для задачи оптимизации, включающей многопараметрическую целевую функцию & градиент-вектор. Сокращенный код выглядит так:
#include "C:\C++\Boost\boost_1_55_0\boost\math\special_functions\digamma.hpp"double my_objective_function(unsigned length, const double *x, double *grad, void* dat) {
// pointer on data
double *dat_Ptr = static_cast<double*>(dat);
// objective function (shortened)
double obj = x[0]*std::tgamma(1 + 1/x[0]) + ...
// gradient-vector (shortened)
double grad[4];
grad[0] = -1.0*boost::math::digamma(1.0 + 1.0/x[0]) + ...
/*
further code
*/
С использованием NLOPT_LD_LBFGS
& призвание boost::math::digamma()
-функция выдает следующую ошибку:
Эта ошибка не появляется, если я изменяю boost::math::digamma(1.0 + 1.0/x[0])
в boost::math::digamma(1.0 + 1.0/5.4)
и т.д. Поэтому, когда я беру параметр х [0]
это работает нормально. Такая же ошибка возникает при использовании другого boost::math
-функция, но не если я использую его std::
-counterpart.
В: Почему я не могу подать заявку boost::math
-функции к параметрам, которые оптимизируются? Есть ли другой способ включить digamma()
-функция (кроме использования тейлоровского приближения)?
Спасибо за любую помощь. Я могу дать более подробную информацию, но код обширный, и я думаю, что я уже отфильтровал проблему под рукой.
РЕДАКТИРОВАТЬ: main()
который вызывает функцию выше.
#include "C:\C++\Boost\boost_1_55_0\boost\math\special_functions\digamma.hpp"#include <vector>
#include "nlopt.hpp"#include "myCSV.h" // CSV-Parser to read-in data for optimization
int main(){
// DATA IMPORT
ifstream file("C:/data.txt");
CSVRow row;
int j = 0;
double dat[50000];
while (file >> row)
dat[j] = stod(row[1]);
// OPTIMIZATION
nlopt_opt opt_object;
opt_object = nlopt_create(NLOPT_LD_LBFGS, (4));
double lb[4] = { 0.0, 0.0 , 0.0, 0.0};
nlopt_set_lower_bounds(opt_object, lb);
nlopt_set_max_objective(opt_object, my_objective_function, dat); // Call of the function defined in my 1st post
nlopt_set_xtol_rel(opt_object, 1e-8);
double x[4] = { 1,0.5,0.5,0.5 };
double maxf;
nlopt_optimize(opt_object, x, &maxf);
printf("Result: f(%g, %g, %g, %g) = %0.10g\n", x[0], x[1], x[2], x[3], maxf);
nlopt_destroy(opt_object);
}
Задача ещё не решена.
Других решений пока нет …