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