Brian Silverman | 72890c2 | 2015-09-19 14:37:37 -0400 | [diff] [blame^] | 1 | #include <unsupported/Eigen/Polynomials> |
| 2 | #include <vector> |
| 3 | #include <iostream> |
| 4 | |
| 5 | using namespace Eigen; |
| 6 | using namespace std; |
| 7 | |
| 8 | int main() |
| 9 | { |
| 10 | typedef Matrix<double,5,1> Vector5d; |
| 11 | |
| 12 | Vector5d roots = Vector5d::Random(); |
| 13 | cout << "Roots: " << roots.transpose() << endl; |
| 14 | Eigen::Matrix<double,6,1> polynomial; |
| 15 | roots_to_monicPolynomial( roots, polynomial ); |
| 16 | |
| 17 | PolynomialSolver<double,5> psolve( polynomial ); |
| 18 | cout << "Complex roots: " << psolve.roots().transpose() << endl; |
| 19 | |
| 20 | std::vector<double> realRoots; |
| 21 | psolve.realRoots( realRoots ); |
| 22 | Map<Vector5d> mapRR( &realRoots[0] ); |
| 23 | cout << "Real roots: " << mapRR.transpose() << endl; |
| 24 | |
| 25 | cout << endl; |
| 26 | cout << "Illustration of the convergence problem with the QR algorithm: " << endl; |
| 27 | cout << "---------------------------------------------------------------" << endl; |
| 28 | Eigen::Matrix<float,7,1> hardCase_polynomial; |
| 29 | hardCase_polynomial << |
| 30 | -0.957, 0.9219, 0.3516, 0.9453, -0.4023, -0.5508, -0.03125; |
| 31 | cout << "Hard case polynomial defined by floats: " << hardCase_polynomial.transpose() << endl; |
| 32 | PolynomialSolver<float,6> psolvef( hardCase_polynomial ); |
| 33 | cout << "Complex roots: " << psolvef.roots().transpose() << endl; |
| 34 | Eigen::Matrix<float,6,1> evals; |
| 35 | for( int i=0; i<6; ++i ){ evals[i] = std::abs( poly_eval( hardCase_polynomial, psolvef.roots()[i] ) ); } |
| 36 | cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl; |
| 37 | |
| 38 | cout << "Using double's almost always solves the problem for small degrees: " << endl; |
| 39 | cout << "-------------------------------------------------------------------" << endl; |
| 40 | PolynomialSolver<double,6> psolve6d( hardCase_polynomial.cast<double>() ); |
| 41 | cout << "Complex roots: " << psolve6d.roots().transpose() << endl; |
| 42 | for( int i=0; i<6; ++i ) |
| 43 | { |
| 44 | std::complex<float> castedRoot( psolve6d.roots()[i].real(), psolve6d.roots()[i].imag() ); |
| 45 | evals[i] = std::abs( poly_eval( hardCase_polynomial, castedRoot ) ); |
| 46 | } |
| 47 | cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl; |
| 48 | |
| 49 | cout.precision(10); |
| 50 | cout << "The last root in float then in double: " << psolvef.roots()[5] << "\t" << psolve6d.roots()[5] << endl; |
| 51 | std::complex<float> castedRoot( psolve6d.roots()[5].real(), psolve6d.roots()[5].imag() ); |
| 52 | cout << "Norm of the difference: " << std::abs( psolvef.roots()[5] - castedRoot ) << endl; |
| 53 | } |