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;
}