在C++中使用 GSL 最小化

Using GSL Minimize in C++

本文关键字:GSL 最小化 C++      更新时间:2023-10-16

我在 GSL 中的最小化库时遇到了问题。我正在尝试在没有导数的情况下实现算法,但为了使用,我需要传递函数以最小化:

https://www.gnu.org/software/gsl/doc/html/multimin.html?highlight=minimization

我正在遵循他们那里的算法没有导数,但是当我尝试在我的成员类函数中使用时:my_func我得到这个:

"类::my_func"从类型"双(类::)(常量gsl_vector*,无效*("到类型"双(((常量gsl_vector,无效*(">

该算法似乎无法使用成员类函数。我的问题是如何绕过它并将成员类函数转换为普通(类似 C(函数?

GSL使用params将任意参数传递到函数中。使用指向对象的指针作为"参数"。

创建一个代理函数,一个类中的static成员函数,它接收params。在此函数中,将params转换为正确的类型(指向Class的指针(,并调用其中的成员函数。

如果您的my_funcpublic,则可以使用非成员("全局"(代理函数。

class Class
{
double my_func(const gsl_vector*) // the real function
{
...
}
static double static_my_func(const gsl_vector* v, void* params) // proxy function
{
Class* object = static_cast<Class*>(params);
return object->my_func(v);
}
};

如果你的实函数想要接收额外的参数,你必须以某种方式适应这一点,例如使参数成为你的Class的成员,或者(更复杂但更面向对象(创建一个临时struct,其中包含指向你的对象的指针和附加参数。