diff --git a/Polynomial/Polynomial.hpp b/Polynomial/Polynomial.hpp index b74f823..e5f7ede 100644 --- a/Polynomial/Polynomial.hpp +++ b/Polynomial/Polynomial.hpp @@ -106,6 +106,26 @@ namespace polynomial return Polynomial(coef*c); } + friend Polynomial operator*(const double c, const Polynomial& poly) + { + return Polynomial(poly.coef*c); + } + + Polynomial operator/(const double c) const + { + return Polynomial(coef/c); + } + + Polynomial derivative() const + { + Eigen::Matrix deriv_coef; + for (int i = 0; i < deg; ++i) + { + deriv_coef(i) = coef(i) * (deg - i); + } + return Polynomial(deriv_coef); + } + double eval(double x) const { return Internal::PolyVal::compute(coef,x); @@ -148,7 +168,7 @@ namespace polynomial { Eigen::VectorXd coef; public: - Polynomial(const int deg) + Polynomial(const int deg = 0) : coef( Eigen::VectorXd::Zero(deg+1) ) { @@ -210,11 +230,32 @@ namespace polynomial return Polynomial(coef*c); } + friend Polynomial operator*(const double c, const Polynomial& poly) + { + return Polynomial(poly.coef*c); + } + + Polynomial operator/(const double c) const + { + return Polynomial(coef/c); + } + double eval(double x) const { return Internal::PolyVal::compute(coef,x); } + Polynomial derivative() const + { + Eigen::VectorXd deriv_coef; + deriv_coef.resize(coef.rows()-1); + for (int i = 0; i+1 < coef.rows(); ++i) + { + deriv_coef(i) = coef(i)*(coef.rows()-1-i); + } + return Polynomial(deriv_coef); + } + void realRoots(std::vector &roots) const { if ( coef[0] == 0 ) diff --git a/testpolynomial.cpp b/testpolynomial.cpp index 4067287..3b3a1f5 100644 --- a/testpolynomial.cpp +++ b/testpolynomial.cpp @@ -70,7 +70,10 @@ int main( int argc, char **argv ) c.realRootsSturm(lb,ub,roots); std::cout << "roots using sturm sequences:\n"; for ( int i = 0; i < roots.size(); i++ ) std::cout << "c(" << roots[i] << "): " << c.eval(roots[i]) << "\n"; - + + Polynomial<3> cder = c.derivative(); + std::cout << "derivative of c: [" << cder.coefficients().transpose() << "]\n"; + std::cout << "\n"; std::cout << "*** Dynamically-sized polynomial roots test ***\n"; @@ -94,5 +97,8 @@ int main( int argc, char **argv ) std::cout << "roots using sturm sequences:\n"; for ( int i = 0; i < roots.size(); i++ ) std::cout << "c(" << roots[i] << "): " << c.eval(roots[i]) << "\n"; + Polynomial cdder = cd.derivative(); + std::cout << "derivative of c: [" << cdder.coefficients().transpose() << "]\n"; + return 0; }