0

我使用 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);
}
4

0 回答 0