我使用 Visual Studio 2015 上的NLOPT库来解决涉及多参数目标函数和梯度向量的优化问题。缩短的代码如下所示:
#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()
-function 会产生以下错误:
boost::math::digamma(1.0 + 1.0/x[0])
如果我更改为etc ,则不会出现此错误boost::math::digamma(1.0 + 1.0/5.4)
。因此,当我取出参数 x[0] 时,它工作正常。当我使用另一个boost::math
-function 时会发生同样的错误,但如果我使用它的std::
-counterpart 则不会。
问:为什么我不能将boost::math
-functions 应用于优化的参数?是否有另一种方法来包含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);
}