1

关于多维最小化算法的gsl库文档如下:

您必须提供 n 个变量的参数函数,以供最小化器操作。您可能还需要提供一个计算函数梯度的例程和一个同时计算函数值和梯度的第三个例程。

提供的示例定义了如下功能(我省略了问题的具体细节,替换为...):

函数f本身

double
my_f (const gsl_vector *v, void *params)
{
  ...
  return rv;
}

f, df= (df/dx, df/dy)的梯度。

void
my_df (const gsl_vector *v, void *params, gsl_vector *df)
{
  ...
  gsl_vector_set(df, ...);
  gsl_vector_set(df, ...);
}

最后,第三个函数同时计算f两者df

void
my_fdf (const gsl_vector *x, void *params, double *f, gsl_vector *df)
{
  *f = my_f(x, params);
  my_df(x, params, df);
}

这三个是一个struct类型的成员gsl_multimin_function_fdf的成员,最终传递给最小化器。

有几种情况,一旦计算了函数值,它的导数可能更容易计算,例如: Let f(x,y) = exp(x * g(y)),其中g(y)计算可能很昂贵,那么简单df/dx = g(y) f(x,y)使用g(y) = log(f)/x.

现在,据我从示例中了解到,最小化器需要独立定义函数及其导数,而第三个定义看起来像一个虚拟包装器。

是否可以以某种方式定义这些函数,使得函数及其导数实际上可以在同一范围内计算?

编辑:

在文档中,关于fdf,它指出

此函数提供了对单独函数的优化,f(x)并且g(x)- 同时计算函数及其导数总是更快。

然而,我不确定如何。扫描表头,发现定义了三个宏,这三个函数各一个

#define GSL_MULTIMIN_FN_EVAL_F(F,x) (*((F)->f))(x,(F)->params)
#define GSL_MULTIMIN_FN_EVAL_DF(F,x,g) (*((F)->df))(x,(F)->params,(g))
#define GSL_MULTIMIN_FN_EVAL_F_DF(F,x,y,g) (*((F)->fdf))(x,(F)->params,(y),(g))

根据所使用的优化算法,这似乎是交替调用的。有人可以确认一下吗?回到我最初的问题,这是否意味着库用户必须检查以找出使用什么方法才能利用同时计算函数值及其梯度的可能性?

4

1 回答 1

2

GSL 要求三个函数,(a) 一个计算,(b),另一个计算梯度,和 (c) 一个计算两者,原因与您关心的完全相同:

有几种情况,一旦计算了函数值,它的导数可能更容易计算。

换句话说,在一个范围内同时计算值和梯度比单独计算值和梯度更容易。但是,如果最小化器只需要梯度,或者如果最小化器只需要值,那么评估两者将是不必要的昂贵。

因此,您应该相信 GSL,它知道自己想要什么。只要最小化器需要知道特定点值和梯度,它就会调用第三个函数,如果它只需要知道值或梯度它就会调用第一个或第二个函数。

由您决定是否希望第三个函数执行一些利用特定问题的智能计算,或者您是否希望它成为一个简单的包装器。

于 2014-02-17T17:06:29.293 回答