Оболочка C ++, GSL (многомерная минимизация) - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь написать оболочку C ++ для алгоритма многомерной минимизации GSL.

Я нашел это хорошее решение для одномерного случая, которое, кажется, работает довольно хорошо, здесь .

template< typename F, typename U >  class gsl_function_fdf_pp : public gsl_function_fdf 
{
  public:
  gsl_function_fdf_pp(const F& kf, const U& kdf) : _f(kf), _df(kdf)
  {
    f   = &gsl_function_fdf_pp::invoke;
    df  = &gsl_function_fdf_pp::invoke2;
    fdf = &gsl_function_fdf_pp::invoke3;
    params=this;
  }
  private:
  const F& _f;
  const U& _df;

  static double invoke(double x, void *params) 
  {
    return static_cast<gsl_function_fdf_pp*>(params)->_f(x);
  }

  static double invoke2(double x, void *params) 
  {
    return static_cast<gsl_function_fdf_pp*>(params)->_df(x);
  }

  static void invoke3(double x, void * params, double* f, double* df)
  {
    (*f)  = static_cast<gsl_function_fdf_pp*>(params)->_f(x);
    (*df) = static_cast<gsl_function_fdf_pp*>(params)->_df(x);
  }
}; 

Есть ли способ изменить этот код так, чтобы он работал и для многомерного случая?В чем я не уверен, так это в том, как обращаться с векторным параметром (см. Определение структуры ниже).

Структура многоминутной функции, заданная в библиотеке GSL:

struct gsl_multimin_function_fdf_struct 
{
  double (* f) (const gsl_vector  * x, void * params);
  void (* df) (const gsl_vector * x, void * params,gsl_vector * df);
  void (* fdf) (const gsl_vector * x, void * params,double *f,gsl_vector * df);
  size_t n;
  void * params;
};
...