public override BaseMatrix LUsq()
{
var newau = new double[au.Length][];
for (int i = 0; i < au.Length; i++)
newau[i] = au[i].Clone() as double[];
var newal = new double[al.Length][];
for (int i = 0; i < al.Length; i++)
newal[i] = al[i].Clone() as double[];
var matrPrec = new DiagonalMatrix(di.Clone() as double[], newal, newau, shift_l, shift_u);
// Здесь нужно разделить и верхний и нижные треугольники
for (int l_diags = 0; l_diags < shift_l.Length; l_diags++)
for (int j = 0, indl = shift_l[l_diags]; indl < al.Length; j++, indl++)
matrPrec.al[indl][l_diags] /= matrPrec.di[j];
for (int u_diags = 0; u_diags < shift_u.Length; u_diags++)
for (int inddi = 0, indu = shift_u[u_diags]; indu < au.Length; inddi++, indu++)
matrPrec.au[indu][u_diags] /= matrPrec.di[inddi];
HashSet<int> shift = new HashSet<int>(shift_l); // одинаковые смещения
shift.IntersectWith(shift_u);
if (shift.Count != 0)
for (int i = 1; i < di.Length; i++)
{
double sum = 0;
for (int k = 0; k < shift_l.Length; k++)
sum += matrPrec.al[i][k] * matrPrec.au[i][k];
double newdi = matrPrec.di[i] - sum;
matrPrec.di[i] = Math.Sqrt(newdi);
}
return matrPrec;
}