在一系列方程

时间:2018-05-06 01:43:29

标签: c++ boost bisect

我今天刚刚开始使用boost,发现this post非常有帮助。我试图使用boost :: bisect来解决一系列值的参数方程。如果我想要求值为0.8,则以下方法有效:

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

//declare constants
const double Y_r = 0.2126;
const double Y_g = 0.7152;
const double Y_b = 0.0722;

struct FunctionToApproximate  {
  double operator() (double x)  {
      return (pow (x, 2.4) * Y_r) + (pow ((x*0.6)+0.4, 2.4) * Y_g) + (1 * Y_b) - 0.8;
  }
};

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

using boost::math::tools::bisect;

std::pair<double, double> result = bisect(FunctionToApproximate(), 0.0, 1.0, TerminationCondition());

double root = (result.first + result.second) / 2;

我想将它包装在一个循环中,这样我就能解决0.8以外的值。我该怎么做呢?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以将状态/数据成员添加到FunctionToApproximate以保留您希望在每次调用中减去的值:

struct FunctionToApproximate  {
    FunctionToApproximate(double val) :val(val){}
    double operator() (double x)  {
        return (pow (x, 2.4) * Y_r) + (pow ((x*0.6)+0.4, 2.4) * Y_g) + (1 * Y_b) - val;
    }
    double val;
};

然后将循环中的计算包装起来应该是直接的。

for(double i = 0.1; i <= 1.0; i+=1.0) {
    std::pair<double, double> result = bisect(FunctionToApproximate(i), 0.0, 1.0, TerminationCondition());

    double root = (result.first + result.second) / 2;
}