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