Example #1
0
        /// <summary>
        /// See <see cref="IPcgBetaParameterCalculation.CalculateBeta(PcgAlgorithmBase)"/>.
        /// </summary>
        public double CalculateBeta(PcgAlgorithmBase pcg)
        {
            double nominator = pcg.ResDotPrecondRes - pcg.PrecondResidual.DotProduct(residualOld);

            residualOld.CopyFrom(pcg.Residual);
            return((nominator > 0.0) ? nominator / pcg.ResDotPrecondResOld : 0.0);
        }
        /// <summary>
        /// See <see cref="IPcgResidualUpdater.UpdateResidual(PcgAlgorithmBase, IVector)"/>
        /// </summary>
        public void UpdateResidual(PcgAlgorithmBase pcg, IVector residual)
        {
            //TODO: perhaps this should be done in an Initialize() method
            if (numIterationsBeforeCorrection == int.MinValue)
            {
                numIterationsBeforeCorrection = (int)Math.Floor(Math.Sqrt(pcg.Rhs.Length));
            }

            if ((pcg.Iteration % numIterationsBeforeCorrection == 0) && (pcg.Iteration != 0)) //The first iteration uses the correct residual.
            {
                // Calculate the exact residual: r = b - A * x
                ExactResidual.Calculate(pcg.Matrix, pcg.Rhs, pcg.Solution, residual);
            }
            else
            {
                // Normally the residual vector is updated as: r = r - α * A*d
                residual.AxpyIntoThis(pcg.MatrixTimesDirection, -pcg.StepSize);
            }
        }
 public void Initialize(PcgAlgorithmBase pcg) => denominator = Math.Sqrt(pcg.Rhs.Norm2());
 public double EstimateResidualNormRatio(PcgAlgorithmBase pcg) => Math.Sqrt(pcg.ResDotPrecondRes) / denominator;
 /// <summary>
 /// See <see cref="IPcgResidualUpdater.UpdateResidual(PcgAlgorithmBase, IVector)"/>
 /// </summary>
 public void UpdateResidual(PcgAlgorithmBase pcg, IVector residual)
 {
     // Normally the residual vector is updated as: r = r - α * A*d
     residual.AxpyIntoThis(pcg.MatrixTimesDirection, -pcg.StepSize);
 }
 /// <summary>
 /// See <see cref="IPcgBetaParameterCalculation.Initialize(PcgAlgorithmBase)"/>.
 /// </summary>
 public void Initialize(PcgAlgorithmBase pcg)
 {
 }                                                // Do nothing
 /// <summary>
 /// See <see cref="IPcgBetaParameterCalculation.CalculateBeta(PcgAlgorithmBase)"/>.
 /// </summary>
 public double CalculateBeta(PcgAlgorithmBase pcg) => pcg.ResDotPrecondRes / pcg.ResDotPrecondResOld;
Example #8
0
 /// <summary>
 /// See <see cref="IPcgResidualConvergence.Initialize(PcgAlgorithmBase)"/>
 /// </summary>
 public void Initialize(PcgAlgorithmBase pcg) => denominator = Math.Sqrt(pcg.ResDotPrecondRes);
Example #9
0
 /// <summary>
 /// See <see cref="IPcgBetaParameterCalculation.Initialize(IVectorView)"/>.
 /// </summary>
 public void Initialize(PcgAlgorithmBase pcg) => residualOld = pcg.Residual.Copy();