在C ++中使用NLOPT优化过程调用digamma()函数

时间:2016-09-11 15:55:31

标签: c++ boost nlopt

我使用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() - 函数会产生以下错误:Error

如果我将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);
}

0 个答案:

没有答案