toop_project.src.Matrix.SparseMatrix.LLt C# (CSharp) Method

LLt() public method

public LLt ( ) : BaseMatrix
return BaseMatrix
        public override BaseMatrix LLt()
        {
            var new_al = al.Clone() as double[];
            var matrixLLt = new SparseMatrix(ia, ja, new_al, new_al, di.Clone() as double[]);
            for (int i = 0; i < matrixLLt.Size; i++)
            {
                int i0 = matrixLLt.ia[i];
                int i1 = matrixLLt.ia[i + 1];
                int k;
                double S = 0;
                for (k = i0; k < i1; k++)
                {
                    double Sl = 0;
                    int iind = i0;
                    int j = matrixLLt.ja[k];
                    int j0 = matrixLLt.ia[j];
                    int j1 = matrixLLt.ia[j + 1];
                    if (j1 - j0 != 0)
                    {
                        int jind = j0;
                        while (iind < k)
                        {
                            if (matrixLLt.ja[jind] > matrixLLt.ja[iind])
                                iind++;
                            else
                                if (matrixLLt.ja[jind] < matrixLLt.ja[iind])
                                jind++;
                            else
                            {
                                Sl += matrixLLt.al[iind] * matrixLLt.al[jind];
                                iind++;
                                jind++;
                            }
                        }
                    }
                    matrixLLt.al[k] = (matrixLLt.al[k] - Sl) / matrixLLt.di[j];
                    if (double.IsInfinity(matrixLLt.al[k]))
                        throw new Exception(String.Concat("Предобусловливание LU : деление на 0 для расчёта элемента (", i + 1, ",", j + 1, ")"));
                    if (double.IsNaN(matrixLLt.al[k]))
                        throw new Exception(String.Concat("Предобусловливание LUsq : неопределённость 0/0 для элемента (", i + 1, ",", j + 1, ")"));
                    S += matrixLLt.al[k] * matrixLLt.al[k];
                }
                matrixLLt.di[i] = Math.Sqrt(matrixLLt.di[i] - S);
                if (!(matrixLLt.di[i] == matrixLLt.di[i]))
                    throw new Exception(String.Concat("Предобусловливание LLt : NaN для элемента диагонали №", i));
            }
            return matrixLLt;
        }