示例#1
0
        public static void Calculate_YGradient(Vector[] X, double[] Y, out Vector Center_X, out Vector[] DX, out double Center_Y, out Vector Gradient)
        {
            int    N       = X.Length;
            Vector X_c     = Vector.Average(X);
            Vector Sum_DX  = new Vector(2);
            double Sum_Y   = 0.0D;
            Vector Sum_YDX = new Vector(2);

            DX = new Vector[N];
            for (int i = 0; i < N; i++)
            {
                DX[i]   = new Vector(2);
                DX[i]   = X[i] - X_c;
                Sum_DX += DX[i];
            }
            OOPTools_Math.Matrix_Jagged M = new OOPTools_Math.Matrix_Jagged(2, 2);
            for (int i = 0; i < N; i++)
            {
                M += OOPTools_Math.Matrix_Jagged.TensorProduct(DX[i], DX[i]);
            }
            Matrix_Jagged A = new Matrix_Jagged(3, 3);

            A.Values[0][0] = Convert.ToDouble(N);
            A.Values[0][1] = Sum_DX.Values[0];
            A.Values[0][2] = Sum_DX.Values[1];
            A.Values[1][0] = Sum_DX.Values[0];
            A.Values[1][1] = M.Values[0][0];
            A.Values[1][2] = M.Values[0][1];
            A.Values[2][0] = Sum_DX.Values[1];
            A.Values[2][1] = M.Values[1][0];
            A.Values[2][2] = M.Values[1][1];

            double DetA;

            A.SolveLinearSystem_LUDecomp(out DetA);
            Gradient = new Vector(2);
            if (DetA < 1.0E-20)
            {
                Center_Y = ArrayTools.Average(Y);
            }
            else
            {
                for (int i = 0; i < N; i++)
                {
                    Sum_Y   += Y[i];
                    Sum_YDX += Y[i] * DX[i];
                }
                Vector b = new Vector(3);
                b.Values[0] = Sum_Y;
                b.Values[1] = Sum_YDX.Values[0];
                b.Values[2] = Sum_YDX.Values[1];

                Vector x = A.SolveLinearSystem_BackSub(b);
                Center_Y           = x.Values[0];
                Gradient.Values[0] = x.Values[1];
                Gradient.Values[1] = x.Values[2];
            }
            Center_X = X_c;
        }
示例#2
0
 public double Average(Vector u)
 {
     return(ArrayTools.Average(u.Values));
 }
示例#3
0
 public double Average()
 {
     return(ArrayTools.Average(Values));
 }
示例#4
0
 /// <summary>
 /// Return the average of the components in the vector (or this vector)
 /// </summary>
 /// <param name="u"></param>
 /// <returns></returns>
 public double Average(double[] u)
 {
     return(ArrayTools.Average(u));
 }