以下に示すように、初期推定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
ますが、1つのパラメーターを除くすべてが定数値を持ちます。明確にするために:以下に示すように、関数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)のルートを見つけたいのですが、1つまたは2つだけでなく、n個の引数についても同様です(例は単純な線形関数です。これは単なる例です)。さまざまな数の引数に対して関数を実装する方法はありますか、それともすべての場合に実装を作成する必要がありますか?
ありがとう、
NAX
ノート
これまでにわかるように、この質問は実際にはニュートンラプソンに関するものではありませんが、引数の数が異なる関数の単一の実装である実際の質問の例として使用すると簡単になります。
アップデート
以下のいくつかの回答は、問題を解決するために使用std::bind
しstd::function
ます。これは、選択した回答よりも実際に私の質問にうまく対処します。ただし、これらはc ++ 11ライブラリのクラス/関数であり(誤解しないでください。これは、すべてのc ++プログラマーに先に進んで学習することを強くお勧めします)、この記事の執筆時点では、いくつかの問題に直面していました。それらを使用する; g ++ 4.7(c ++ 11準拠)を使用するEclipse Junoは、まだ何らかの理由で認識できなかったためstd::function
、以下のチェック済みの回答を使用することにしました。これもうまく機能します。