Написах проста реализация на алгоритъма за намиране на корен на newton raphson, който приема първоначално предположение 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 аргумента, а не само за един или два (моля, игнорирайте идеята, че функциите, които показах в примерът са прости линейни функции, това е само пример). Има ли някакъв начин да внедря функцията за различен брой аргументи или трябва да напиша изпълнение за всеки случай?
Благодаря,
NAX
ЗАБЕЛЕЖКА
Както можете да разберете досега, този въпрос всъщност не е за newton-raphson, но го улеснява, ако го използвам като пример за действителния въпрос, който е единична реализация за функции с различен брой аргументи.
АКТУАЛИЗАЦИЯ
Няколко отговора по-долу използват std::bind
и std::function
за решаване на проблема, което всъщност по-добре отговаря на моя въпрос, отколкото избрания отговор; те обаче са класове/функции на библиотеки c++11 (което, не ме разбирайте погрешно, е нещо, което силно призовавам всеки програмист на c++ да продължи напред и да научи) и по време на това писане се сблъсках с някои проблеми използването им; Eclipse Juno, използващ g++ 4.7 (който е съвместим с c++11), все още по някакъв начин не успя да разпознае std::function
и затова реших да се придържам към отметнатия отговор по-долу, който също работи добре.
n
тогава не е ли честно да трябва да върнете всички тези корени през контейнер? или искате да изчислите 3-тите корени, например, при всяко повикване? - person Koushik Shetty   schedule 18.03.2013