Beispiel #1
0
        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));
 }