/// <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); } }
/// <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;
/// <summary> /// See <see cref="IPcgResidualConvergence.Initialize(PcgAlgorithmBase)"/> /// </summary> public void Initialize(PcgAlgorithmBase pcg) => denominator = Math.Sqrt(pcg.ResDotPrecondRes);
/// <summary> /// See <see cref="IPcgResidualConvergence.EstimateResidualNormRatio(PcgAlgorithmBase)"/> /// </summary> 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(IVectorView)"/>. /// </summary> public void Initialize(PcgAlgorithmBase pcg) => residualOld = pcg.Residual.Copy();