He escrito una función en C # que hace una diferenciación numérica. Se parece a esto:
public double Diff(double x)
{
double h = 0.0000001;
return (Function(x + h) - Function(x)) / h;
}
Me gustaría poder pasar cualquier función, como en:
public double Diff(double x, function f)
{
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
Creo que esto es posible con los delegados (¿tal vez?) Pero no estoy seguro de cómo usarlos.
Cualquier ayuda sería muy apreciada.
Hay un par de tipos genéricos en .Net (v2 y posteriores) que hacen que pasar funciones como delegados sea muy fácil.
Para funciones con tipos de retorno, existe Func <> y para funciones sin tipos de retorno hay Acción <>.
Se puede declarar que Func y Action toman de 0 a 4 parámetros. Por ejemplo, Func <double, int> toma un doble como parámetro y devuelve un int. La acción <doble, doble, doble> toma tres dobles como parámetros y no devuelve nada (nulo).
Entonces puede declarar su función Diff para tomar un Func:
Y luego lo llamas así, simplemente dándole el nombre de la función que se ajusta a la firma de tu Func o Action:
Incluso puede escribir la función en línea con la sintaxis lambda:
fuente
Func
yAction
se han actualizado para permitir hasta 16 parámetros.Func<double, double>
que sea la primera derivada de la función de entrada, calculada numéricamente, por supuesto.return x => (f(x + h) - f(x)) / h;
Incluso podría escribir una sobrecarga que devolviera lan
derivada th de la función de entrada.Uso:
fuente