Я написал простую реализацию алгоритма поиска корня Ньютона-Рафсона, который принимает начальное предположение init
, унарную функцию f
и допуск tol
в качестве аргументов, как показано ниже:
bool newton_raphson(double& init,
double(*f)(double),
double tol){
const int max_iter = 10000;
double next_x, soln = init;
int i = 0;
while(++i < max_iter){
next_x = soln - f(soln)/fp_x(f, soln);
if(fabs(next_x - soln) < tol){
init = next_x;
return true;
}
soln = next_x;
}
return false;
}
double fp_x(double(*f)(double),
double x){
const double h = 0.000001;
return (f(x + h) - f(x - h))/2.0/h;
}
Мой вопрос: хотя это прекрасно работает для унарных функций, я хотел бы изменить реализацию, чтобы она работала для функций f
, которые имеют более одного параметра, но все параметры, кроме одного, имеют постоянные значения. Чтобы уточнить: если у меня есть функция f(x) = 3x + 2, как показано ниже
double f(double x){
return (3*x + 2);
}
Тогда моя реализация работает. Однако я также хотел бы, чтобы это работало для любых функций с любым заданным количеством аргументов, но только первый аргумент является переменным. Итак, если у меня есть функция f(x,y) = 3x + 2y
double f(double x, double y){
return (3*x + 2*y);
}
Я хотел бы найти корень f(x,2) или f(x,3), используя ту же функцию, и так далее для n аргументов, а не только один или два (пожалуйста, не обращайте внимания на то, что функции, которые я показал в пример — простые линейные функции, это просто пример). Есть ли способ реализовать функцию для различного количества аргументов или мне нужно написать реализацию для каждого случая?
Спасибо,
НАКС
ПРИМЕЧАНИЕ
Как вы уже поняли, этот вопрос на самом деле не о ньютоне-рафсоне, но будет проще, если я использую его в качестве примера для фактического вопроса, который представляет собой единую реализацию для функций с разным количеством аргументов.
ОБНОВЛЕНИЕ
В нескольких ответах ниже для решения проблемы используются std::bind
и std::function
, что на самом деле лучше отвечает на мой вопрос, чем выбранный ответ; тем не менее, они представляют собой библиотечные классы/функции С++ 11 (что, не поймите меня неправильно, я настоятельно призываю каждого программиста С++ идти вперед и учиться), и на момент написания этой статьи я столкнулся с некоторыми проблемами. используя их; Eclipse Juno, использующий g++ 4.7 (совместимый с C++11), все еще каким-то образом не смог распознать std::function
, и поэтому я решил пойти и придерживаться проверенного ответа ниже, который также прекрасно работает.
n
, то разве это не справедливо, что вы должны возвращать все эти корни через контейнер? Или вы хотите вычислить 3-й корень, например, при каждом вызове? - person Koushik Shetty   schedule 18.03.2013