mirror of
				https://github.com/PaddlePaddle/FastDeploy.git
				synced 2025-10-31 20:02:53 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <iostream>
 | |
| #include <unsupported/Eigen/Polynomials>
 | |
| #include <vector>
 | |
| 
 | |
| 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;
 | |
| }
 | 
