#include <unsupported/Eigen/Polynomials>
#include <vector>
#include <iostream>
using namespace Eigen;
using namespace std;
int main()
{
typedef Matrix<double ,5 ,1 > Vector5d;
Vector5d roots = Vector5d::Random();
cout << "Roots: " << roots.transpose() << endl;
Eigen::Matrix<double ,6 ,1 > polynomial;
roots_to_monicPolynomial( roots, polynomial );
PolynomialSolver<double ,5 > psolve( polynomial );
cout << "Complex roots: " << psolve.roots().transpose() << endl;
std::vector<double > realRoots;
psolve.realRoots( realRoots );
Map<Vector5d> mapRR( &realRoots[0 ] );
cout << "Real roots: " << mapRR.transpose() << endl;
cout << endl;
cout << "Illustration of the convergence problem with the QR algorithm: " << endl;
cout << "---------------------------------------------------------------" << endl;
Eigen::Matrix<float ,7 ,1 > hardCase_polynomial;
hardCase_polynomial <<
-0 .957 , 0 .9219 , 0 .3516 , 0 .9453 , -0 .4023 , -0 .5508 , -0 .03125 ;
cout << "Hard case polynomial defined by floats: " << hardCase_polynomial.transpose() << endl;
PolynomialSolver<float ,6 > psolvef( hardCase_polynomial );
cout << "Complex roots: " << psolvef.roots().transpose() << endl;
Eigen::Matrix<float ,6 ,1 > evals;
for ( int i=0 ; i<6 ; ++i ){ evals[i] = std::abs( poly_eval( hardCase_polynomial, psolvef.roots()[i] ) ); }
cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl;
cout << "Using double's almost always solves the problem for small degrees: " << endl;
cout << "-------------------------------------------------------------------" << endl;
PolynomialSolver<double ,6 > psolve6d( hardCase_polynomial.cast<double >() );
cout << "Complex roots: " << psolve6d.roots().transpose() << endl;
for ( int i=0 ; i<6 ; ++i )
{
std::complex<float > castedRoot( psolve6d.roots()[i].real(), psolve6d.roots()[i].imag() );
evals[i] = std::abs( poly_eval( hardCase_polynomial, castedRoot ) );
}
cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl;
cout.precision(10 );
cout << "The last root in float then in double: " << psolvef.roots()[5 ] << "\t" << psolve6d.roots()[5 ] << endl;
std::complex<float > castedRoot( psolve6d.roots()[5 ].real(), psolve6d.roots()[5 ].imag() );
cout << "Norm of the difference: " << std::abs( psolvef.roots()[5 ] - castedRoot ) << endl;
}
Messung V0.5 in Prozent C=89 H=96 G=92
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-06)
¤
*© Formatika GbR, Deutschland