lange Zeit Browser, erste Zeit hier fragen. Ich habe eine Reihe von Skripten für verschiedene numerische 1D-Integrationsmethoden geschrieben und diese in eine Bibliothek kompiliert. Ich möchte, dass diese Bibliothek so flexibel wie möglich ist in Bezug darauf, was sie integrieren kann.C++: Funktion übergeben mit einer beliebigen Anzahl von Parametern als Parameter
Hier ein Beispiel: ein sehr einfaches trapezförmiges Regelbeispiel, bei dem ich einen Zeiger auf die zu integrierende Funktion übergebe.
// 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;
}
Dies funktioniert gut für einfache Funktionen, die nur ein Argument. Beispiel:
double a = trap(sin,0,1);
Aber manchmal kann ich möchte etwas integrieren, die weitere Parameter, wie ein quadratisches Polynom hat. In diesem Beispiel würden die Koeffizienten vor der Integration vom Benutzer definiert werden. Beispielcode:
// arbitrary quadratic polynomial
double quad(double A, double B, double C, double x) {
return (A*pow(x,2) + B*x + C);
}
Idealerweise würde ich in der Lage sein, so etwas zu tun, um es zu integrieren:
double b = trap(quad(1,2,3),0,1);
Aber klar, das nicht funktioniert. Ich habe durch die Definition einer Klasse, um dieses Problem bekommen, dass die Koeffizienten als Mitglieder und die Funktion von Interesse als Mitglied Funktion hat:
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); }
};
jedoch dann meine Integrationsfunktion ein Objekt als Eingabe nehmen ändern muss statt ein Funktionszeiger:
// 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;
}
Dies funktioniert gut, aber die resultierende Bibliothek ist nicht sehr unabhängig, da es die Klasse Modell definiert werden, irgendwo muss. Außerdem sollte das Model im Idealfall von Benutzer zu Benutzer wechseln können, so dass ich es nicht in einer Header-Datei reparieren möchte. Ich habe versucht, Funktionsvorlagen und Funktoren zu verwenden, um dies zum Funktionieren zu bringen, aber es ist nicht sehr unabhängig, da wieder die Vorlage in einer Header-Datei definiert werden sollte (es sei denn, Sie möchten explizit instanziieren, was ich nicht).
Also zusammenfassend: Gibt es irgendeinen Weg, wie ich meine Integrationsfunktionen dazu bringen kann, beliebige 1D-Funktionen mit einer variablen Anzahl von Eingabeparametern zu akzeptieren, während sie trotzdem unabhängig genug bleiben, dass sie in eine eigenständige Bibliothek kompiliert werden können? Vielen Dank im Voraus für die Vorschläge.
['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) –