長時間のブラウザ、初めての質問者です。私は、さまざまな1D数値統合メソッドを実行するためのスクリプトを作成し、それらをライブラリにコンパイルしました。私は、そのライブラリが可能な限り柔軟に統合できることを考えています。C++:パラメータとして任意の数のパラメータを持つ関数を渡す
ここに私は例を挙げます:統合する関数へのポインタを渡す非常に単純な台形ルールの例です。
// Numerically integrate (*f) from a to b
// using the trapezoidal rule.
double trap(double (*f)(double), double a, double b) {
int N = 10000;
double step = (b-a)/N;
double s = 0;
for (int i=0; i<=N; i++) {
double xi = a + i*step;
if (i == 0 || i == N) { s += (*f)(xi); }
else { s += 2*(*f)(xi); }
}
s *= (b-a)/(2*N);
return s;
}
これは、1つの引数しか取らない単純な関数には最適です。例:
double a = trap(sin,0,1);
しかし、二次多項式のようなパラメータが多いものを統合したいことがあります。この例では、係数は統合前にユーザによって定義される。コード例:理想的
// arbitrary quadratic polynomial
double quad(double A, double B, double C, double x) {
return (A*pow(x,2) + B*x + C);
}
、私はそれを統合するために、このような何かを行うことができるようになります動作しません
double b = trap(quad(1,2,3),0,1);
しかし、明確に。しかし、その後、私の統合機能は、入力としてオブジェクトを取るために変更する必要がある
class Model {
double A,B,C;
public:
Model() { A = 0; B = 0; C = 0; }
Model(double x, double y, double z) { A = x; B = y; C = z; }
double func(double x) { return (A*pow(x,2)+B*x+C); }
};
の代わりに:私は、メンバ関数としてのメンバーとして係数を持つクラスや興味のある機能を定義することによってこの問題を回避得ています関数ポインタ:
// Numerically integrate model.func from a to b
// using the trapezoidal rule.
double trap(Model poly, double a, double b) {
int N = 10000;
double step = (b-a)/N;
double s = 0;
for (int i=0; i<=N; i++) {
double xi = a + i*step;
if (i == 0 || i == N) { s += poly.func(xi); }
else { s += 2*poly.func(xi); }
}
s *= (b-a)/(2*N);
return s;
}
これはうまくいきますが、結果として得られるライブラリは、クラスModelをどこかで定義する必要があるため、あまり独立していません。また、モデルはユーザーからユーザーに変更できるようにするのが理想的です。そのため、ヘッダーファイルで修正する必要はありません。私は関数テンプレートと関数を使用してこれを動作させようとしましたが、テンプレートはヘッダファイルに定義する必要があります(明示的にインスタンス化しない限り、テンプレートはあまり独立していません)。
まとめ:可変数の入力パラメータを持つ任意の1D関数を受け入れるための統合関数を得ることができますが、スタンドアロンライブラリにコンパイルできるほど十分に独立していますか?事前に感謝の意を表します。
['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind) –