示例#1
0
        /// <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));
        }
示例#2
0
        /// <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);
        }
示例#3
0
 /// <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));
 }