/// <summary> /// Check residuals of generalized symmetric eigenvalue problem. /// </summary> /// <param name="A">The matrix A.</param> /// <param name="B">The matrix B.</param> /// <param name="result">The eigensolver result.</param> /// <param name="symmetric">Indicates, whether the problem is symmetric.</param> /// <param name="print">If true, print residuals.</param> /// <returns>True, if all residuals are below threshold.</returns> public static bool CheckResiduals(SparseMatrix A, SparseMatrix B, IEigenSolverResult result, bool symmetric, bool print) { if (symmetric) { return(CheckResiduals(A, B, result.ConvergedEigenValues, result.EigenValuesReal(), result.EigenVectorsReal(), print)); } return(CheckResiduals(A, B, result.ConvergedEigenValues, result.EigenValues, result.EigenVectors, print)); }
/// <summary> /// Check residuals of eigenvalue problem. /// </summary> /// <param name="A">The matrix.</param> /// <param name="result">The eigensolver result.</param> /// <param name="print">If true, print residuals.</param> /// <returns>True, if all residuals are below threshold.</returns> public static bool CheckResiduals(SparseMatrix A, IEigenSolverResult result, bool print) { int N = A.RowCount; var m = result.ConvergedEigenValues; var v = result.EigenValues; var X = result.EigenVectors; if (print) { Console.WriteLine(); Console.WriteLine(" Lambda Residual"); } var x = new Complex[N]; var y = new Complex[N]; bool ok = true; for (int i = 0; i < m; i++) { var lambda = v[i].Real; X.Column(i, x); Vector.Copy(x, y); // y = A*x - lambda*x A.Multiply(1.0, x, -lambda, y); double r = Vector.Norm(y); if (r > ERROR_THRESHOLD) { ok = false; } if (print) { Console.WriteLine("{0,3}: {1,10:0.00000000} {2,10:0.00e+00}", i, lambda, r); } } return(ok); }
/// <summary> /// Check residuals of symmetric eigenvalue problem. /// </summary> /// <param name="A">The matrix A.</param> /// <param name="result">The eigensolver result.</param> /// <param name="symmetric">Indicates, whether the problem is symmetric.</param> /// <param name="print">If true, print residuals.</param> /// <returns>True, if all residuals are below threshold.</returns> public static bool CheckResiduals(SparseMatrix A, IEigenSolverResult result, bool symmetric, bool print) { return(CheckResiduals(A, null, result, symmetric, print)); }