public static double?PartialDerivative(FunctionHandler f, LimSign xSign, uint index = 1, double precision = 1E-3, params double[] points) //返回一个多元函数在某点的指定趋向方向的偏导数值;index指示要求偏微分的自变量序号,从1开始;precision过大会引入较大误差,precision过小会导致数值结果不稳定 { if (f == null) { throw new ArgumentNullException("Function Null"); } if ((points == null) || (points.Length == 0)) { throw new ArgumentNullException("Variable Null"); } double res = 0; if (index-- == 0) { index = 0; } precision = Math.Abs(precision); try { if (xSign == LimSign.Negative) { precision = -precision; } double[][] fi = new double[5][]; for (int i = 0; i < 5; i++) { fi[i] = (double[])points.Clone(); fi[i][index] += i * precision; } res = (-25 * f(fi[0]) + 48 * f(fi[1]) - 36 * f(fi[2]) + 16 * f(fi[3]) - 3 * f(fi[4])) / (12 * precision); //五点公式 } catch (Exception) //导数不存在或其他错误 { //MessageBox return(null); } return(res); }
public LimVariable(double _p, LimSign _s) { this.Value = _p; this.Sign = _s; }