Napisałem funkcję w C #, która wykonuje różniczkowanie numeryczne. To wygląda tak:
public double Diff(double x)
{
double h = 0.0000001;
return (Function(x + h) - Function(x)) / h;
}
Chciałbym móc przekazać dowolną funkcję, na przykład:
public double Diff(double x, function f)
{
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
Myślę, że jest to możliwe w przypadku delegatów (może?), Ale nie jestem pewien, jak ich używać.
Każda pomoc byłaby bardzo mile widziana.
Istnieje kilka typów ogólnych w .Net (v2 i nowsze), które bardzo ułatwiają przekazywanie funkcji jako delegaci.
Dla funkcji z typami zwracanymi istnieje Func <>, a dla funkcji bez typów zwracanych jest Action <>.
Można zadeklarować, że zarówno Func, jak i Action przyjmują od 0 do 4 parametrów. Na przykład Func <double, int> przyjmuje jeden double jako parametr i zwraca int. Akcja <double, double, double> przyjmuje trzy podwojenia jako parametry i nic nie zwraca (void).
Więc możesz zadeklarować swoją funkcję Diff, aby wziąć Func:
A potem nazywasz to tak, po prostu nadając mu nazwę funkcji, która pasuje do podpisu twojej Func lub Action:
Możesz nawet napisać funkcję w linii ze składnią lambda:
źródło
Func
iAction
zostały zaktualizowane, aby umożliwić maksymalnie 16 parametrów.Func<double, double>
pierwszej pochodnej funkcji wejściowej, oczywiście obliczonej numerycznie.return x => (f(x + h) - f(x)) / h;
Możesz nawet napisać przeciążenie, które zwróciło tęn
pochodną funkcji wejściowej.Stosowanie:
źródło