public double[,] DfDx(ArrayFunctionWithArrayOfVariables Func, double[] x) { ///<sumary> /// retruns an array with all derivatives of the function /// </summary> int n = x.Length; int m = Func(x).Length; double[,] D = new double[m, n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { D[i, j] = DfDx(Func, x, i, j, 1.0E-2D, 1.0E-14D); } } return(D); }
public double DfDx(ArrayFunctionWithArrayOfVariables Func, double[] x, int FuncIndex, int xIndex, double InitialStepSize, double Precision) { double precision = Precision; // precision to evaluate derivative double h = InitialStepSize; // initial step size double c = 10.0D; // factor do divide h (i.e., h_new =h_old/c) double eps = 1.0E-100D; // small number int maxSteps = 100; // maximum times to divid h double devOld, devNew; // old derivative double calcPrecision; // new derivative // calculate initial derivative devOld = this.DfDx(Func, x, FuncIndex, xIndex, h); devNew = devOld; for (int i = 0; i < maxSteps; i++) { // reduce h h /= c; // calculate new derivative devNew = this.DfDx(Func, x, FuncIndex, xIndex, h); //calculate precision if (Math.Abs(devNew) > eps) { calcPrecision = Math.Abs((devNew - devOld) / devNew); } else { // don't divide by devNew if devNew is small calcPrecision = Math.Abs(devNew - devOld); } // stop if precision is met if (calcPrecision < precision) { //Console.Write("number of steps = "+i.ToString()+"\n"); //Console.Write("Calculated precision = "+calcPrecision.ToString()+"\n"); return(devNew); } devOld = devNew; } return(devNew); }
public double DfDx(ArrayFunctionWithArrayOfVariables Func, double[] x, int FuncIndex, int xIndex, double h) { int n = x.Length; double[] XPrev = new double[n]; double[] XNext = new double[n]; double Prev, Next; for (int i = 0; i < n; i++) { XPrev[i] = x[i]; XNext[i] = x[i]; if (i == xIndex) { XPrev[i] -= h; XNext[i] += h; } } Prev = Func(XPrev)[FuncIndex]; Next = Func(XNext)[FuncIndex]; return((Next - Prev) / (2.0D * h)); }
public double DfDx(ArrayFunctionWithArrayOfVariables Func, double[] x, int FuncIndex, int xIndex) { return(DfDx(Func, x, FuncIndex, xIndex, 1.0E-2D, 1.0E-14D)); }