Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 42 additions & 1 deletion Polynomial/Polynomial.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,26 @@ namespace polynomial
return Polynomial<deg>(coef*c);
}

friend Polynomial<deg> operator*(const double c, const Polynomial<deg>& poly)
{
return Polynomial<deg>(poly.coef*c);
}

Polynomial<deg> operator/(const double c) const
{
return Polynomial<deg>(coef/c);
}

Polynomial<deg-1> derivative() const
{
Eigen::Matrix<double,deg,1> deriv_coef;
for (int i = 0; i < deg; ++i)
{
deriv_coef(i) = coef(i) * (deg - i);
}
return Polynomial<deg-1>(deriv_coef);
}

double eval(double x) const
{
return Internal::PolyVal<deg>::compute(coef,x);
Expand Down Expand Up @@ -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) )
{

Expand Down Expand Up @@ -210,11 +230,32 @@ namespace polynomial
return Polynomial<Eigen::Dynamic>(coef*c);
}

friend Polynomial<Eigen::Dynamic> operator*(const double c, const Polynomial<Eigen::Dynamic>& poly)
{
return Polynomial<Eigen::Dynamic>(poly.coef*c);
}

Polynomial<Eigen::Dynamic> operator/(const double c) const
{
return Polynomial<Eigen::Dynamic>(coef/c);
}

double eval(double x) const
{
return Internal::PolyVal<Eigen::Dynamic>::compute(coef,x);
}

Polynomial<Eigen::Dynamic> 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<Eigen::Dynamic>(deriv_coef);
}

void realRoots(std::vector<double> &roots) const
{
if ( coef[0] == 0 )
Expand Down
8 changes: 7 additions & 1 deletion testpolynomial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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<Eigen::Dynamic> cdder = cd.derivative();
std::cout << "derivative of c: [" << cdder.coefficients().transpose() << "]\n";

return 0;
}