我使用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
&amp;调用boost::math::digamma()
- 函数会产生以下错误:
如果我将boost::math::digamma(1.0 + 1.0/x[0])
更改为boost::math::digamma(1.0 + 1.0/5.4)
等,则不会出现此错误。因此,当我使用参数x [0]时
它工作正常。当我使用另一个boost::math
- 函数时会发生同样的错误,但如果我使用std::
- 对应函数则不会。
问:为什么我不能将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);
}