2017-08-26 1 views
0

ich einen Halbierungs Löser mit einem Funktionsnamen als Argument geschrieben haben und diese Funktion hat nur ein Argument:Funktionsname als Argument aber mit einer unterschiedlichen Anzahl von Argumenten

double Bisection(double(*func)(double), double xLower, double xUpper, double xEPS = 1e-9, double yEPS = 1e-9); 

Jetzt möchte ich diesen Solver in einer Beta bewerben inverse kumulative Wahrscheinlichkeitsfunktion, bei der die CDF bereits bekannt ist. Aber diese CDF hat drei Argument, wo die letzten beiden Argumente sind bekannt:

double CDF(double x, double alpha, double beta) 

Wie soll ich diese CDF als Argument des Solver durch die Anzahl der Argumente zu reduzieren?

Antwort

1

Der erste Schritt ist Ihre C-Style-Funktion Zeiger mit einer C++ std :: Funktion zu ersetzen:

double Bisection(std::function<double(double)> func, double xLower, double xUpper, double xEPS = 1e-9, double yEPS = 1e-9); 

Die Implementierung wird das gleiche wie zuvor. Jetzt können Sie std::bind() verwenden es zu nennen:

double alpha, beta, xLower, xUpper; // TODO: assign 
Bisection(std::bind(CDF, _1, alpha, beta), xLower, xUpper); 

Was std::bind() tut es Ihre drei Argument CDF-Funktion in einem Ein-Argument (_1) Funktion zu konvertieren, indem die zweite und dritte Argument an Variablen binden.

Sie nicht std::bind() mit Ihrem ursprünglichen C-Stil Funktionszeiger verwenden können, wie hier diskutiert: convert std::bind to function pointer

+1

Das ist wirklich eine großartige Lösung! –

Verwandte Themen