public override BaseMatrix LUsq()
{
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];
int k;
double S = 0;
for (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];
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("Предобусловливание LUsq : неопределённость 0/0 для элемента (", j + 1, ",", i + 1, ")"));
matrixILU.al[k] = (matrixILU.al[k] - Sl) / matrixILU.di[j];
if (double.IsInfinity(matrixILU.al[k]))
throw new Exception(String.Concat("Предобусловливание LU : деление на 0 для расчёта элемента (", i + 1, ",", j + 1, ")"));
if (double.IsNaN(matrixILU.al[k]))
throw new Exception(String.Concat("Предобусловливание LUsq : неопределённость 0/0 для элемента (", i + 1, ",", j + 1, ")"));
S += matrixILU.au[k] * matrixILU.al[k]; // диагональ в U!!!!!
}
matrixILU.di[i] = Math.Sqrt(matrixILU.di[i] - S);
if (!(matrixILU.di[i] == matrixILU.di[i]))
throw new Exception(String.Concat("Предобусловливание LUsq : NaN для элемента диагонали №", i));
}
return matrixILU;
}