public void MakeStep(out int iter, out double residual) { if (!init) { throw new InvalidOperationException("Решатель не инициализирован, выполнение операции невозможно"); } currentIter++; //x_k = D^(-1)*(b-(L+U)x) var x_k = inverseDioganal.HadamardProduct(b.Add(L_Ux, -1)); double w = 1.0; double tempResidual = Double.MaxValue; while (w >= 0.1) { for (int i = 0; i < x.Size; i++) { x_temp[i] = w * x_k[i] + (1 - w) * x[i]; } L_Ux = A.LMult(x_temp, false, 0).Add(A.UMult(x_temp, false, 0)); //tempResidual = ||b - (Ux+Lx+Dx)|| / ||b|| tempResidual = A.Diagonal.HadamardProduct(x_temp).Add(L_Ux).Add(b, -1).Norm / norm_b; if (tempResidual < lastResidual) { break; } w -= 0.1; } lastResidual = tempResidual; for (int i = 0; i < x.Size; i++) { x[i] = x_temp[i]; } residual = lastResidual; iter = currentIter; }
public IVector LSolve(IVector x) { return(DInvert.HadamardProduct(x)); }
public IVector LMult(IVector x) { return(D.HadamardProduct(x)); }