C++ 如何使用boost二分法?

C++ 如何使用boost二分法?,c++,boost,C++,Boost,昨天我遇到了另一个boost函数的问题,但幸运的是你们帮我解决了它们。今天我需要知道如何正确使用二分法函数 这就是我认为它应该如何工作,但似乎我也错了。好的,我想使用: template <class F, class T, class Tol> std::pair<T, T> bisect( F f, T min, T max, Tol tol); 模板 std::pair 对分( F,, 丁敏, T max, 托尔);

昨天我遇到了另一个boost函数的问题,但幸运的是你们帮我解决了它们。今天我需要知道如何正确使用二分法函数

这就是我认为它应该如何工作,但似乎我也错了。好的,我想使用:

template <class F, class T, class Tol>
 std::pair<T, T> 
 bisect(
    F f, 
    T min, 
    T max, 
    Tol tol);
模板
std::pair
对分(
F,,
丁敏,
T max,
托尔);
但我的问题是宽容,因为我不知道如何纠正它。我试过了

double value = boost::math::tools::eps_tolerance<double>(0.00001);
double value=boost::math::tools::eps_公差(0.00001);
当找到二分法时,如何返回值?结果应该是函数中作为std::pair的一对数字,然后计算min+max/2


谢谢

这是
bisect
的一个示例用法。考虑求解方程<代码> x^ 2 -3x+ 1=0 < /代码>:

struct TerminationCondition  {
  bool operator() (double min, double max)  {
    return abs(min - max) <= 0.000001;
  }
};

struct FunctionToApproximate  {
  double operator() (double x)  {
    return x*x - 3*x + 1;  // Replace with your function
  }
};

// ...
using boost::math::tools::bisect;
double from = 0;  // The solution must lie in the interval [from, to], additionally f(from) <= 0 && f(to) >= 0
double to = 1;
std::pair<double, double> result = bisect(FunctionToApproximate(), from, to, TerminationCondition());
double root = (result.first + result.second) / 2;  // = 0.381966...
struct TerminationCondition{
布尔运算符()(双最小值,双最大值){

返回abs(最小-最大)注意
bisect
也支持lambda:

using boost::math::tools::bisect;
auto root = bisect
(
    [](double x){return x;},
    -1.0, 1.0,
    [](double l, double r){return abs(l-r) < 1e-8;}
);
使用boost::math::tools::bisect;
自动根=对分
(
[](双x){返回x;},
-1.0, 1.0,
[](双l,双r){返回abs(l-r)<1e-8;}
);

我假设我可以将函数替换为approximate(),只要它只返回一个值,我就可以使用哪个函数?或者我是将return xxx替换为调用另一个函数,如return Eval()对于第一个问题,你可以将函数转换成一个可以用一个双参数调用并返回双的函数。一个更干净的方法是用自己的函数替换xxx并保持函数的近似性。第二个问题是,你想把这个子句作为字符串输入还是硬编码为C++表达式?o第二个问题,基本上现在不在乎子句字符串或硬编码。示例子句的目的只是测试对分函数是否正常工作。编辑我的答案以反映您的测试表达式。如果您确保使用的各种函数都采用一个双参数并返回双参数,那么你可以去掉函数toapproximate并将其直接传递给bisect。bisect接受任何具有重载()运算符的函数或类,这些运算符满足此条件。编辑我的帖子就是为了反映这一点。
using boost::math::tools::bisect;
auto root = bisect
(
    [](double x){return x;},
    -1.0, 1.0,
    [](double l, double r){return abs(l-r) < 1e-8;}
);