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; }
public double Average(Vector u) { return(ArrayTools.Average(u.Values)); }
public double Average() { return(ArrayTools.Average(Values)); }
/// <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)); }