我对C ++很陌生,所以请原谅我的无知。我正在寻找使用Boost库来执行一维优化。我正在使用brent_find_minima
函数,并查看了文档页面here。但是对于brent_find_minima
函数的输入,还需要给出另一个函数f
。
使用它的示例显示为here,但它们的函数只接受一个参数。即double f(double x){...}
,如果您想为f
提供其他参数,以便优化参数更改,例如double f(double x, int y, int z){...}
其中y
和z
可以为同一f
更改函数x
的结果{{1}}这是否可以在brent_find_minima阶段指定此内容?
鉴于我对C ++很陌生,任何显示如何完成/更改链接中给出的示例以接受多于1个参数的示例都将非常有用。
答案 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
。
如果情况并非如此,我并不相信布伦特的算法必然仍然是一种有效的方法。
#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