Cholesky.CholeskySolver.Solve C# (CSharp) Method

Solve() public static method

public static Solve ( double A, double f ) : double[]
A double
f double
return double[]
        public static double[] Solve(double[,] A, double[] f)
        {
            int N = A.GetLength(0);
            double[,] B = new double[N, N];
            double[,] C = new double[N, N];
            int i, j, k;
            for (i = 0; i < N; ++i) //заполняем первый столбец В
                B[i, 0] = A[i, 0];
            for (j = 1; j < N; ++j) //заполняем первую строку С
                C[0, j] = A[0, j] / B[0, 0];
            C[0, 0] = 1;
            double sum;

            for (j = 1; j < N; ++j) //j=1, т.к. первый столбец заполнен
            {
                C[j, j] = 1; //главная диагональ
                //заполняем верхнюю часть С и нижнюю часть B
                for (i = 1; i < j; ++i) //i=1, т.к. первая строка заполнена
                {
                    sum = 0;
                    for (k = 0; k <= i - 1; ++k)
                        sum += B[i, k] * C[k, j];
                    C[i, j] = (A[i, j] - sum) / B[i, i];
                    B[i, j] = 0;
                }

                i = j; //этот случай считаем отдельно, чтобы не менять главную диагональ C
                sum = 0;
                for (k = 0; k <= i - 1; ++k)
                    sum += B[i, k] * C[k, j];
                B[i, i] = A[i, i] - sum;

                //заполняем верхнюю часть B и нижнюю часть C
                for (i = j + 1; i < N; ++i)
                {
                    sum = 0;
                    for (k = 0; k <= i - 1; ++k)
                        sum += B[i, k] * C[k, j];
                    B[i, j] = A[i, j] - sum;
                    C[i, j] = 0;
                }
            }

            // A*x == f
            // B*C*x == f
            // C*x == y     (1)
            // B*y == f     (2)
            double[] x = new double[N];
            double[] y = new double[N];
            // решаем (2)
            y[0] = f[0] / B[0, 0];
            for (i = 1; i < N; ++i)
            {
                sum = 0;
                for (k = 0; k <= i - 1; ++k)
                    sum += B[i, k] * y[k];
                y[i] = (f[i] - sum) / B[i, i];
            }

            // решаем (1)
            x[N - 1] = y[N - 1];
            for (i = N - 2; i >= 0; --i)
            {
                sum = 0;
                for (k = i + 1; k <= N - 1; ++k)
                    sum += C[i, k] * x[k];
                x[i] = y[i] - sum;
            }

            return x;
        }
CholeskySolver