Ich habe eine Funktion in C # geschrieben, die eine numerische Differenzierung vornimmt. Es sieht aus wie das:
public double Diff(double x)
{
double h = 0.0000001;
return (Function(x + h) - Function(x)) / h;
}
Ich möchte in der Lage sein, jede Funktion zu übergeben, wie in:
public double Diff(double x, function f)
{
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
Ich denke, dass dies mit Delegierten möglich ist (vielleicht?), Aber ich bin mir nicht sicher, wie ich sie verwenden soll.
Jede Hilfe wäre sehr dankbar.
In .Net (Version 2 und höher) gibt es einige generische Typen, die das Weitergeben von Funktionen als Delegierte sehr einfach machen.
Für Funktionen mit Rückgabetypen gibt es Func <> und für Funktionen ohne Rückgabetypen gibt es Action <>.
Sowohl Func als auch Action können so deklariert werden, dass sie 0 bis 4 Parameter annehmen. Zum Beispiel nimmt Func <double, int> ein double als Parameter und gibt ein int zurück. Die Aktion <double, double, double> verwendet drei Doubles als Parameter und gibt nichts zurück (void).
So können Sie Ihre Diff-Funktion für eine Func deklarieren:
Und dann nennen Sie es so, indem Sie ihm einfach den Namen der Funktion geben, die zur Signatur Ihrer Funktion oder Aktion passt:
Sie können die Funktion sogar in Übereinstimmung mit der Lambda-Syntax schreiben:
quelle
Func
undAction
aktualisiert, um bis zu 16 Parameter zu ermöglichen.Func<double, double>
, die die erste Ableitung der Eingabefunktion ist, natürlich numerisch berechnet.return x => (f(x + h) - f(x)) / h;
Sie könnten sogar eine Überladung schreiben, die dien
dritte Ableitung der Eingabefunktion zurückgibt.Verwendung:
quelle