Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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));
        }
Exemple #4
0
 public double DfDx(ArrayFunctionWithArrayOfVariables Func, double[] x, int FuncIndex, int xIndex)
 {
     return(DfDx(Func, x, FuncIndex, xIndex, 1.0E-2D, 1.0E-14D));
 }