используя boost :: bisect для ряда уравнений

Я только начал использовать повышение сегодня и нашел эта почта быть чрезвычайно полезным. Я пытаюсь использовать 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

Решение

Вы можете добавить элемент состояния / данных в 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;
}
1

Другие решения

Других решений пока нет …