Eu escrevi uma função em C # que faz uma diferenciação numérica. Se parece com isso:
public double Diff(double x)
{
double h = 0.0000001;
return (Function(x + h) - Function(x)) / h;
}
Eu gostaria de poder passar em qualquer função, como em:
public double Diff(double x, function f)
{
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
Eu acho que isso é possível com os delegados (talvez?), Mas não sei como usá-los.
Qualquer ajuda seria muito apreciada.
Existem alguns tipos genéricos no .Net (v2 e posterior) que facilitam a passagem de funções como delegados.
Para funções com tipos de retorno, existe Func <> e para funções sem tipos de retorno, há Ação <>.
Pode-se declarar que Func e Ação levam de 0 a 4 parâmetros. Por exemplo, Func <double, int> recebe um double como parâmetro e retorna um int. A ação <double, double, double> usa três duplos como parâmetros e não retorna nada (nulo).
Assim, você pode declarar sua função Diff como tendo um Func:
E então você chama assim, simplesmente fornecendo o nome da função que se encaixa na assinatura do seu Func ou Action:
Você pode até escrever a função alinhada com a sintaxe lambda:
fonte
Func
eAction
foram atualizados para permitir até 16 parâmetros.Func<double, double>
que é a primeira derivada da função de entrada, calculada numericamente, é claro.return x => (f(x + h) - f(x)) / h;
Você pode até escrever uma sobrecarga que retorne an
derivada da função de entrada.Uso:
fonte