/** * Example of a test. To be completed. * */ bool testEigenDecomposition() { unsigned int nbok = 0; unsigned int nb = 0; typedef EigenDecomposition<2,double> Eigen2; typedef Eigen2::Vector Vector2; typedef Eigen2::Matrix Matrix2; trace.beginBlock ( "Testing block ..." ); // [4 1] // [1 2] Matrix2 A; A.setComponent( 0, 0, 4 ); A.setComponent( 0, 1, 1 ); A.setComponent( 1, 0, 1 ); A.setComponent( 1, 1, 2 ); Matrix2 P; Vector2 v; Eigen2::getEigenDecomposition( A, P, v ); trace.info() << "Input matrix: " << A << std::endl; trace.info() << "Eigenvectors: " << P << std::endl; trace.info() << "Eigenvalues: " << v << std::endl; Vector2 V0 = P.column( 0 ); Vector2 V1 = P.column( 1 ); Vector2 V0_exp( 0.3826834323650898, -0.9238795325112868 ); Vector2 V1_exp( 0.9238795325112868, 0.3826834323650898); double v0_exp = 1.585786437626905; double v1_exp = 4.414213562373095; double error_V0 = (V0-V0_exp).norm(); double error_V1 = (V1-V1_exp).norm(); double error_v0 = fabs( v[0] - v0_exp ); double error_v1 = fabs( v[1] - v1_exp ); trace.info() << "error_V0 = " << error_V0 << std::endl; trace.info() << "error_V1 = " << error_V1 << std::endl; trace.info() << "error_v0 = " << error_v0 << std::endl; trace.info() << "error_v1 = " << error_v1 << std::endl; double epsilon = 1e-10; ++nb, nbok += error_V0 < epsilon ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") " << "error_V0 < epsilon, i.e. " << error_V0 << " < " << epsilon << std::endl; ++nb, nbok += error_V1 < epsilon ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") " << "error_V1 < epsilon, i.e. " << error_V1 << " < " << epsilon << std::endl; ++nb, nbok += error_v0 < epsilon ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") " << "error_v0 < epsilon, i.e. " << error_v0 << " < " << epsilon << std::endl; ++nb, nbok += error_v1 < epsilon ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") " << "error_v1 < epsilon, i.e. " << error_v1 << " < " << epsilon << std::endl; trace.endBlock(); return nbok == nb; }