设计计算差异的函数的方法

时间:2015-02-04 02:15:05

标签: c# delegates

我正在尝试计算特定函数的数值微分。此功能可能会有所不同(例如,可以是直线或圆)。

我的第一个想法是定义一个通用函数:

delegate double Function(double arg);
static double Derivative(Function f, double arg)
{
    double h = 10e-6; 
    double h2 = h*2;
    return (f(arg-h2) - 8*f(arg-h) + 8*f(arg+h) - f(arg+h2)) / (h2*6);
}

对于直线:

double LinearLine(double arg)
{
    double m = 2.0; double c = 1.0;
    return m*arg + c;
}

我打电话:

Function myFunc = new Function(LinearLine);
Derivative(myFunc, 3); //Derivative at x=3

但是,在此方法中,我需要将mc硬编码到LinearLine()函数中。

或者,如果我将mc传递到LinearLine参数列表:LinearLine(double m, double c),我将不得不每次都重写Derivative()函数返回值我称之为不同的功能。 (例如Circle(double radius, double x, double y))。

我的问题是在这种情况下,设计这样一个类/函数的好方法是什么?

1 个答案:

答案 0 :(得分:0)

注意:此答案仅适用于构造传递给Derivative的函数,并且对隐式函数没有帮助(ja72为linked

您可以使用lambda表达式定义函数:

  Func<float,float> myFunc = x = > 3 * x + 7;

你也可以curry functions将n-ary函数转换为n-1-ary函数:

  float TwoArg(float x, float y) { return x * y; }
  Func<float,float> twoArg2 = x => TwoArg(x, 2);