向brent_find_minima添加其他参数

时间:2014-03-01 19:16:12

标签: c++ boost

我对C ++很陌生,所以请原谅我的无知。我正在寻找使用Boost库来执行一维优化。我正在使用brent_find_minima函数,并查看了文档页面here。但是对于brent_find_minima函数的输入,还需要给出另一个函数f

使用它的示例显示为here,但它们的函数只接受一个参数。即double f(double x){...},如果您想为f提供其他参数,以便优化参数更改,例如double f(double x, int y, int z){...}其中yz可以为同一f更改函数x的结果{{1}}这是否可以在brent_find_minima阶段指定此内容?

鉴于我对C ++很陌生,任何显示如何完成/更改链接中给出的示例以接受多于1个参数的示例都将非常有用。

2 个答案:

答案 0 :(得分:2)

始终可以提供仿函数而不是函数。 在这种情况下,指定的函数从brent_find_minimize函数调用一个参数。如果你想要包含更多参数,你需要编写这样的仿函数:

struct f
{
    f(int y, int z) : _y(y), _z(z) { }
    // you may need a copy constructor and operator= here too ...

    double operator()(double x) 
    {  
        return _y*sin(x) + _z + x * cos(x);
    }
    int _y, _z;
};

然后你可以这样传递:

 Result r2 = boost::math::tools::brent_find_minima( f(10, 20), 3.0, 4.0, 20);

希望这有帮助。

答案 1 :(得分:2)

如果你想传递y,z的固定值,你可以只使用一个绑定表达式:

double f(double x, int y, int z) 
{ return (y*sin(x) + z + x * cos(x)); }

brent_find_minima(std::bind(f, _1, 3, 4), 3.0, 4.0, 20);

3, 4传递y, z

如果情况并非如此,我并不相信布伦特的算法必然仍然是一种有效的方法。

查看 Live On Coliru

#include <iostream>
#include <sstream>
#include <string>

#include <functional> // functional
using namespace std::placeholders;

#include <boost/math/tools/minima.hpp>

double f(double x, int y, int z) 
{ return (y*sin(x) + z + x * cos(x)); }

int main(int argc, char** argv)
{
    typedef std::pair<double, double> Result;
    // find a root of the function f in the interval x=[3.0, 4.0] with 20-bit precision
    Result r2 = boost::math::tools::brent_find_minima(std::bind(f, _1, 3, 4), 3.0, 4.0, 20);
    std::cout << "x=" << r2.first << " f=" << r2.second << std::endl;
    return 0;
}

// output:
// x=3.93516 f=-0.898333