在一系列方程式上使用 boost::bisect
using boost::bisect on a series of equations
我今天才开始使用 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 以外的值。我该怎么做?
非常感谢!
您可以向 FunctionToApproximate
添加一个 state/data 成员以保存您要在每次调用中减去的值:
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;
}
我今天才开始使用 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 以外的值。我该怎么做?
非常感谢!
您可以向 FunctionToApproximate
添加一个 state/data 成员以保存您要在每次调用中减去的值:
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;
}