我正在尝试计算特定函数的数值微分。此功能可能会有所不同(例如,可以是直线或圆)。
我的第一个想法是定义一个通用函数:
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
但是,在此方法中,我需要将m
和c
硬编码到LinearLine()
函数中。
或者,如果我将m
和c
传递到LinearLine
参数列表:LinearLine(double m, double c)
,我将不得不每次都重写Derivative()
函数返回值我称之为不同的功能。 (例如Circle(double radius, double x, double y)
)。
我的问题是在这种情况下,设计这样一个类/函数的好方法是什么?
答案 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);