Files
FastDeploy/third_party/eigen/unsupported/doc/examples/PolynomialSolver1.cpp
Jack Zhou 355382ad63 Move eigen to third party (#282)
* remove useless statement

* Add eigen to third_party dir

* remove reducdant lines
2022-09-26 19:24:02 +08:00

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;
}